凯撒加密(Caesarcipher)是一种简单的消息编码方式:
它根据字母表将消息中的每个字母移动常量位K。
举个例子如果K等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为d;b会被替换成e;依此类推。
字母表末尾将回卷到字母表开头,于是,w会被替换为z,x会被替换为a。
如果是将移动的位数用随机数进行代替,并且记录下该随机数,则破解密码的难度将大大增加。
其中K就是密钥;
字母表就像是密码本,所以凯撒加密算法本质上是一种基于密码本的加解密算法;
如果字母表换成255个数字,则可以支持对任意字节流进行加解密,应用到网络通信,改进版的支持任意字节的加解密算法,C语言实现:
代码语言:javascript复制//编码和解码表
#define BYTE_MAX_VALUE 256
static uint8_t encodeString[BYTE_MAX_VALUE];
static uint8_t decodeString[BYTE_MAX_VALUE];
#define KEY_LENGTH 6
static const uint8_t key[KEY_LENGTH 1] = "365245";//必须是6位数字密码
void initSimpleCipher(){
int sumint = 0;
for(int i=0; i<KEY_LENGTH; i ){
sumint = key[0]-48;
}
for(int i=0; i<BYTE_MAX_VALUE; i ){
encodeString[i] = (uint8_t)((i sumint) % BYTE_MAX_VALUE);
decodeString[i] = (uint8_t)((i - sumint BYTE_MAX_VALUE) % BYTE_MAX_VALUE);
}
}
//加密
int kaisaEncrypt(const uint8_t *source, int sourceLen, uint8_t *out, int len)
{
int i;
if(source == NULL || out == NULL || len <= 0 || sourceLen != len){
return -1;
}
for(i=0;i<sourceLen;i )
{
out[i] = encodeString[(uint8_t)source[i]];
}
return 0;
}
//解密
int kaisaDecrypt(const uint8_t *enc, int encLen, uint8_t *out, const int len)
{
int i;
if(out == NULL || enc == NULL || len <=0 || encLen != len){
return -1;
}
for(i=0;i<encLen;i )
{
out[i] = decodeString[(uint8_t)enc[i]];
}
return 0;
}
测试:
代码语言:javascript复制int main(){
initSimpleCipher();
uint8_t str1[20]={0xa, 0xf3, 0xee, 0x33};
uint8_t str2_encrypt[20]="";
uint8_t str3_decrypt[20]="";
/***加密****/
kaisaEncrypt(str1,4, str2_encrypt, 20);
for (int i=0; i<4; i ){
printf("source:x-->sec:x rn",str1[i],str2_encrypt[i]);
}
/***解密****/
kaisaDecrypt(str2_encrypt,4, str3_decrypt, 20);
for (int i=0; i<4; i ){
printf("str2_encrypt:x-->dec:x rn",str2_encrypt[i],str3_decrypt[i]);
}
}
输出:
代码语言:javascript复制@"source:a-->sec:1c "
@"source:f3-->sec:5 "
@"source:ee-->sec:0 "
@"source:33-->sec:45 "
@"str2_encrypt:1c-->dec:a "
@"str2_encrypt:5-->dec:f3 "
@"str2_encrypt:0-->dec:ee "
@"str2_encrypt:45-->dec:33 "