在小型嵌入式系统中,外部数据通信不方便以明文方式传输,但一些常用加密算法如(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);
}