凯撒加密(Caesarcipher)是一种简单的消息编码方式:
它根据字母表将消息中的每个字母移动常量位K。
举个例子如果K等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为d;b会被替换成e;依此类推。
字母表末尾将回卷到字母表开头,于是,w会被替换为z,x会被替换为a。
如果是将移动的位数用随机数进行代替,并且记录下该随机数,则破解密码的难度将大大增加。
其中K就是密钥;
字母表就像是密码本,所以凯撒加密算法本质上是一种基于密码本的加解密算法;
如果字母表换成255个数字,则可以支持对任意字节流进行加解密,应用到网络通信,改进版的支持任意字节的加解密算法,C语言实现:
//编码和解码表 #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; }
测试:
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:%01x-->sec:%01x \r\n",str1[i],str2_encrypt[i]); } /***解密****/ kaisaDecrypt(str2_encrypt,4, str3_decrypt, 20); for (int i=0; i<4; i++){ printf("str2_encrypt:%01x-->dec:%01x \r\n",str2_encrypt[i],str3_decrypt[i]); } }
输出:
@"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 "
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com