凯撒加密(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
