凯撒密码的C语言实现,加解密字节流数据

2023-05-02 15:26:49 浏览数 (1)

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

0 人点赞