小兔网

数据加密解密的原理也很简单,就是使用异或运算。

“^”的意思是:当两个操作数对应位不相同时结果的相应位即为1,否则为零。当然,这里的对应位是指二进制的位。

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

 

用“^”加密解密的原理:

将需要加密的内容看做A,密钥看做B,A ^ B=加密后的内容C。

而解密时只需要将C ^ 密钥B=原内容A。如果没有密钥,就不能解密!

 

实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define KEY 0x86

int main()
{
char p_data[16] = {"Hello World!"};
char Encrypt[16]={0},Decode[16]={0};
int i;

 for(i = 0; i < strlen(p_data); i++)
{
Encrypt[i] = p_data[i] ^ KEY;
}

for(i = 0; i < strlen(Encrypt); i++)
{
Decode[i] = Encrypt[i] ^ KEY;
}

printf("Initial date: %s\n",p_data);
printf("Encrypt date: %s\n",Encrypt);
printf("Decode date: %s\n",Decode);

return 0;
}

 

运行结果:

Initial date: Hello World!
Encrypt date: 毋觋棣验絷猝
Decode date: Hello World!

加密解密还支持多重加密,但是要记得加密的次数,解密时运用相同密钥做解密操作相同次数即可。

不仅如此,加密解密还支持多重不同密钥加密,只要你记得加密使用密钥!

 

数据加密解密的原理也很简单,就是使用异或运算。请先看下面的代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
char plaintext = 'a'; // 明文
char secretkey = '!'; // 密钥
char ciphertext = plaintext ^ secretkey; // 密文
char decodetext = ciphertext ^ secretkey; // 解密后的字符
char buffer[9];

printf(" char ASCII\n");
// itoa()用来将数字转换为字符串,可以设定转换时的进制(基数)
// 这里将字符对应的ascii码转换为二进制
printf(" plaintext %c %7s\n", plaintext, itoa(plaintext, buffer, 2));
printf(" secretkey %c %7s\n", secretkey, itoa(secretkey, buffer, 2));
printf("ciphertext %c %7s\n", ciphertext, itoa(ciphertext, buffer, 2));
printf("decodetext %c %7s\n", decodetext, itoa(decodetext, buffer, 2));

return 0;
}

运行结果:

 

            char    ASCII plaintext   a     1100001 secretkey   !      100001ciphertext   @     1000000decodetext   a     1100001

plaintext 与 decodetext相同,也就是说,两次异或运算后还是原来的结果。
这就是加密的关键技术:

  • 通过一次异或运算,生成密文,密文没有可读性,与原文风马牛不相及,这就是加密;
  • 密文再经过一次异或运算,就会还原成原文,这就是解密的过程;
  • 加密和解密需要相同的密钥,如果密钥不对,是无法成功解密的。

如果加密和解密的密钥不同,则称为非对称加密算法。在非对称算法中,加密的密钥称为公钥,解密的密钥称为私钥,只知道公钥是无法解密的,还必须知道私钥。