/*
在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。
解密的方法就是再执行一次同样的操作。
加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。
下面的代码演示了如何实现该功能。
*/
void f(char* buf, unsigned char* uckey, int n)
{
int i;
for(i=0; i<n; i++)
buf[i] = buf[i] ^ uckey[i];
}
int main(int argc, char* argv[])
{
char p[] = "abcd中国人123"; // 待加密串
char* key = "11001100010001110"; //以串的形式表达的密匙,运算时要转换为按位存储的形式。
int np = strlen(p);
int nk = strlen(key);
unsigned char* uckey = (unsigned char*)malloc(np);
// 密匙串需要按位的形式循环拼入 uckey中
int i;
for(i=0; i<np*8; i++)
{
if(key[i%nk]=='1') //0x80 换位二进制为1000 0000,通过i%8对uckey的每一个位进行运算。
uckey[i/8] |= (unsigned char)0x80 >> (i%8); // uckey置为1
else //ps:>>正数补0 负数补1,>>>强制都补0,所以用(unsigned char)强制类型转换后串为正值
uckey[i/8] &= ~((unsigned char)0x80 >> (i%8)); // uckey置为0
}
f(p, uckey, strlen(p));
f(p, uckey, strlen(p));
printf("%s\n", p);
free(uckey);
free(uckey);
return 0;
}
蓝桥杯 异或加密法
最新推荐文章于 2023-03-18 18:01:53 发布