第十章 试着加密数据吧
在数字签名中使用的信息摘要是什么?
对比由文件整体计算出的信息摘要,可以证明文件的内容有没有被篡改。加密处理过的信息摘要就是数字签名
10.1 先来明确一下什么是加密
在作为加密对象的数据中,蕴含着文本,图像等各种形式的信息。但是,由于计算机会把所有的数据都用数字表示,所以即便数据有各种展现形式,对其加密的技术却是基本相同的。这里我们假设加密的对象仅限于文本。
文本数据可以由各种各样的字符构成。其中每个字符都被分配了一个数字,我们称之为“字符编码”。
定义了应该把那个编码分配给那个字符的字符编码体系叫做字符集。常见的字符集有 ASCII 字符集,Unicode 字符集等。
直接使用字符编码,未经加密的文本,我们称之为“明文”。数据一旦以明文的方式在网络中传输,就会有被盗取滥用的危险,因此要对明文进行加密,将其转换成为“密文”。将密文还原成明文则称为“解密”。
10.2 错开字符的加密方式
凯撒加密
凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
// 用给字符编码加上 3 的方法加密
let plaintext = "我是要加密的明文";
let cipher = "";
for (let i = 0; i < plaintext.length; i++) {
cipher += String.fromCharCode(plaintext.charCodeAt(i) + 3);
}
console.log(cipher); // 戔昲覄劣寉皇昑斊
// 用把字符编码减去 3 的方法解密
let cipher = "戔昲覄劣寉皇昑斊";
let plaintext = "";
for (let i = 0; i < cipher.length; i++) {
plaintext += String.fromCharCode(cipher.charCodeAt(i) - 3);
}
console.log(plaintext); // 我是要加密的明文
异或运算
XOR 运算的有趣之处在于, 用 XOR 运算加密后的密文, 可以通过相同的 XOR 运算解密。也就是说,一个程序既可用于加密又可用于解密,很方便
// 通过 XOR 运算进行加密和解密
let plaintext = "我是要加密的明文";
let key = 3;
function xor(text, key) {
let str = "";
for (let i = 0; i < text.length; i++) {
str += String.fromCharCode(text.charCodeAt(i) ^ key);
}
return str;
}
let cipher = xhr(plaintext, key);
let plaintext2 = xhr(cipher, key);
console.log(cipher); // 戒昬覂劣寅皇昍斄
console.log(plaintext2); // 我是要加密的明文
10.3 密钥越长,解密越困难
有些人会盗取那些并不是发送给他们的加密数据, 企图破解后用于不可告人的目的。 尽管这些人并不知道密钥的值, 但是他们会利用计算机强大的计算能力, 用密钥所有可能的取值去试着破解。
在互联网上经过加密的数据也难免被盗, 因此就要先设法做到即使数据被盗了, 其内容也难以被破解。 为此可以把密钥设成多位数而不仅仅是一位数。
10.4 适用于互联网的公开密钥加密技术
前面几节所讲解的加密技术都属于“对称密钥加密技术”, 也称作“秘密密钥加密技术”。 这种加密技术的特征是在加密和解密的过程中使用数值相同的密钥。
但是世界上不乏善于解决问题的能人。 他们想到只要让解密时的密钥不同于加密时的密钥, 就可以克服对称密钥加密技术的缺点。而这种加密技术就被称为“公开密钥加密技术”。
在公开密钥加密技术中, 用于加密的密钥可以公开给全世界,因此称为“公钥”, 而用于解密的密钥是只有自己才知道的秘密, 因此称为“私钥”。
可用于实现公开密钥加密技术的算法有若干种,目前广泛应用于互联网中的一种著名算法是 RSA 算法。 RSA 这个名字是由三位发明者 Ronald Rivest、 Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成的。
10.5 数字签名可以证明数据的发送者是谁
在本章的最后, 先来介绍一种公开密钥加密技术的实际应用——数字签名。 在日本的商界有盖章的习惯, 而在欧美则是签字。 印章和签名都可以证明一个事实, 那就是某个人承认了文件的内容是完整有效的。 而在通过网络传输的文件中, 数字签名可以发挥出与印章和签名同样的证明效果。
发送者用构成文件的所有字符的编码生成了信息摘要, 就证明发送者从头到尾检查了文件并承认其内容完整有效。 如果接收者重新算出的信息摘要和经过发送者加密的信息摘要匹配, 就证明文件在传输过程中没有被篡改, 并且的确是发送者本人发送的。