一份简易数据传输加密算法

在小型嵌入式系统中,外部数据通信不方便以明文方式传输,但一些常用加密算法如(DES)等太过于耗费系统资源。我们可以自定义一些简易算法为我们的数据加密,通常这些自定义算法因为不同于常用加密算法反而使数据更安全。


数据加密有两个部分,一个是数据序列,我们可以将数据搅乱使之无规律可循;另一个是数值加密,使用不同类别的算法或可逆过程为数据加密。下面仅介绍一种加解密算法。先直接上源码
 


/*    (简化算法,对称式加密)
*/

#include <stdio.h>
#include <malloc.h>
#include "data_encrypt.h"


const unsigned char key[8]={5,2,4,1,0,7,6,3};        //the KEY 0~7,对称式加密,加密解密为同一组密钥


/****加密****/
void Data_Encrypt(unsigned char *s,unsigned int len)
{
    unsigned int i;
    unsigned int j;
    unsigned char temp;
    unsigned char *temp1;
    if((temp1=(unsigned char*)malloc(len))==NULL)
    {
        printf("malloc error!\n");
        exit(1);
    }
    for(i=0; i<(len/8); i++)    //数据序列加密
    {
        temp1[i*8+0] = *(s+i*8+key[0]);        //根据key中数据将明文以每八个为一组调整顺序:如原明文中data[5]调整后在data[0]
        temp1[i*8+1] = *(s+i*8+key[1]);
        temp1[i*8+2] = *(s+i*8+key[2]);
        temp1[i*8+3] = *(s+i*8+key[3]);
        temp1[i*8+4] = *(s+i*8+key[4]);
        temp1[i*8+5] = *(s+i*8+key[5]);
        temp1[i*8+6] = *(s+i*8+key[6]);
        temp1[i*8+7] = *(s+i*8+key[7]);
    }
    for(j=i*8; j<len; j++)
    {
        temp1[j] = *(s+j);
    }

    for(j=0; j<len; j++)            //数据加密
    {
        temp = 0;
        temp |= (0x01)&(temp1[j]>>key[0]);        //根据key中数据将每个字节的bit位加密,如数据0x13,加密后变为0x1c
        temp |= ((0x01)&(temp1[j]>>key[1]))<<1;
        temp |= ((0x01)&(temp1[j]>>key[2]))<<2;
        temp |= ((0x01)&(temp1[j]>>key[3]))<<3;
        temp |= ((0x01)&(temp1[j]>>key[4]))<<4;
        temp |= ((0x01)&(temp1[j]>>key[5]))<<5;
        temp |= ((0x01)&(temp1[j]>>key[6]))<<6;
        temp |= ((0x01)&(temp1[j]>>key[7]))<<7;
        *(s+j) = temp;
    }
    free(temp1);
}

 /****解密****/
void Data_Decrypt(unsigned char *s,unsigned int len)
{
    unsigned int i;
    unsigned int j;
    unsigned char temp;
    unsigned char *temp1;
    if((temp1=(unsigned char*)malloc(len))==NULL)
    {
        printf("malloc error!\n");
        exit(1);
    }
    for(i=0; i<(len/8); i++)            //解密只是逆向加密,算法与加密类似,密钥与加密相同
    {
        temp1[i*8+key[0]] = *(s+i*8+0);
        temp1[i*8+key[1]] = *(s+i*8+1);    
        temp1[i*8+key[2]] = *(s+i*8+2);
        temp1[i*8+key[3]] = *(s+i*8+3);
        temp1[i*8+key[4]] = *(s+i*8+4);
        temp1[i*8+key[5]] = *(s+i*8+5);
        temp1[i*8+key[6]] = *(s+i*8+6);
        temp1[i*8+key[7]] = *(s+i*8+7);
    }
    for(j=i*8; j<len; j++)
    {
        temp1[j] = *(s+j);
    }

    for(j=0; j<len; j++)
    {
        temp = 0;
        temp |= (0x01&temp1[j])<<key[0];
        temp |= ((0x02&temp1[j])>>1)<<key[1];
        temp |= ((0x04&temp1[j])>>2)<<key[2];
        temp |= ((0x08&temp1[j])>>3)<<key[3];
        temp |= ((0x10&temp1[j])>>4)<<key[4];
        temp |= ((0x20&temp1[j])>>5)<<key[5];
        temp |= ((0x40&temp1[j])>>6)<<key[6];
        temp |= ((0x80&temp1[j])>>7)<<key[7];
        *(s+j) = temp;
    }
    free(temp1);
}
 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值