Skip to content

第十章 试着加密数据吧

在数字签名中使用的信息摘要是什么?

对比由文件整体计算出的信息摘要,可以证明文件的内容有没有被篡改。加密处理过的信息摘要就是数字签名

10.1 先来明确一下什么是加密

在作为加密对象的数据中,蕴含着文本,图像等各种形式的信息。但是,由于计算机会把所有的数据都用数字表示,所以即便数据有各种展现形式,对其加密的技术却是基本相同的。这里我们假设加密的对象仅限于文本。

文本数据可以由各种各样的字符构成。其中每个字符都被分配了一个数字,我们称之为“字符编码”。

定义了应该把那个编码分配给那个字符的字符编码体系叫做字符集。常见的字符集有 ASCII 字符集,Unicode 字符集等。

直接使用字符编码,未经加密的文本,我们称之为“明文”。数据一旦以明文的方式在网络中传输,就会有被盗取滥用的危险,因此要对明文进行加密,将其转换成为“密文”。将密文还原成明文则称为“解密”。

10.2 错开字符的加密方式

凯撒加密

凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

js
// 用给字符编码加上 3 的方法加密
let plaintext = "我是要加密的明文";
let cipher = "";
for (let i = 0; i < plaintext.length; i++) {
  cipher += String.fromCharCode(plaintext.charCodeAt(i) + 3);
}
console.log(cipher); // 戔昲覄劣寉皇昑斊
js
// 用把字符编码减去 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 运算解密。也就是说,一个程序既可用于加密又可用于解密,很方便

js
// 通过 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 适用于互联网的公开密钥加密技术

前面几节所讲解的加密技术都属于“对称密钥加密技术”, 也称作“秘密密钥加密技术”。 这种加密技术的特征是在加密和解密的过程中使用数值相同的密钥。

但是世界上不乏善于解决问题的能人。 他们想到只要让解密时的密钥不同于加密时的密钥, 就可以克服对称密钥加密技术的缺点。而这种加密技术就被称为“公开密钥加密技术”。

在公开密钥加密技术中, 用于加密的密钥可以公开给全世界,因此称为“公钥”, 而用于解密的密钥是只有自己才知道的秘密, 因此称为“私钥”。

4

可用于实现公开密钥加密技术的算法有若干种,目前广泛应用于互联网中的一种著名算法是 RSA 算法。 RSA 这个名字是由三位发明者 Ronald Rivest、 Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成的。

10.5 数字签名可以证明数据的发送者是谁

在本章的最后, 先来介绍一种公开密钥加密技术的实际应用——数字签名。 在日本的商界有盖章的习惯, 而在欧美则是签字。 印章和签名都可以证明一个事实, 那就是某个人承认了文件的内容是完整有效的。 而在通过网络传输的文件中, 数字签名可以发挥出与印章和签名同样的证明效果。

发送者用构成文件的所有字符的编码生成了信息摘要, 就证明发送者从头到尾检查了文件并承认其内容完整有效。 如果接收者重新算出的信息摘要和经过发送者加密的信息摘要匹配, 就证明文件在传输过程中没有被篡改, 并且的确是发送者本人发送的。

5