异或运算符^,相同为0,不同为1(同0非1)
由异或运算法则可知:a ^ a = 0,a ^ 0 = a
如果c = a ^ b,那么a = b ^ c,即a ^ b ^ b = a,^ 的逆运算仍然是 ^
利用异或运算的性质,对字符进行加密并输出密文,然后再解密
(1)密码系统
明文空间(全体明文的集合)、密文空间(全体密文的集合)、密钥空间(全体密钥的集合)
加密算法(一组由明文至密文的加密变换)、解密算法(一组由密文至明文的解密变换)
(2)加密算法
-
对称加密,加密和解密的密钥相同,属于不公开密钥加密算法
-
非对称加密,加密和解密的密钥不同,属于公开密钥加密算法
-
发送方使用接收方的公钥加密,只有接收方能解密密文得到明文
- 私钥加密,持有私钥或公钥才可以解密
- 公钥加密,持有私钥才可以解密
-
不可逆加密,加密过程不需要使用密钥,由哈希函数生成信息摘要
(3)信息摘要
一段数据的特征信息
发送方将数据和摘要一起传给接收方
接收方根据接收到的数据重新生成摘要
生成的摘要和接收的摘要相同,则说明数据正确
- 不同的输入数据,产生不同的信息摘要
- 单向性,只能由数据生成信息摘要,不能由信息摘要还原数据
- 不论数据多长,都会产生固定长度的信息摘要
char secret = 'A'; // 密钥,加密和解密密钥相同
char[] plainText = {'草', '船', '借', '箭'};
char[] cipherText = new char[plainText.length];
// 密文:[茈, 艸, 偞, 篬]
for (int i = 0; i < plainText.length; i++) {
cipherText[i] = (char) (plainText[i] ^ secret);
}
System.out.println("密文:" + Arrays.toString(cipherText));
// 明文:[草, 船, 借, 箭]
for (int i = 0; i < cipherText.length; i++) {
plainText[i] = (char) (cipherText[i] ^ secret);
}
System.out.println("明文:" + Arrays.toString(plainText));