跳转至

1.1 非对称加密与数字签名

公钥,私钥

非对称加密体系会用到 2 把密钥: 私钥 与对应的 公钥私钥 由持有人自己保存,不能泄露,但 公钥 对外公开。

这一对 私钥公钥 的具有以下特性:

  1. 公钥和私钥一一对应,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立
  2. 同时生成公钥和私钥相对比较容易,但是从公钥推算出私钥,必须是很困难或者是不可能的
  3. 所有的秘钥对(公钥, 私钥)都是不同的
  4. 公钥 加密的信息,只能通过对应的 私钥 解密,反之亦成立

公钥、私钥的特性是由非对称加密算法保证的,常用的非对称加密算法有 RSA, Elgamal, ECC 等。

根据公私钥的特性(尤其是对第 4 个特性的应用),可以延伸出 2 种用途:

用途 1:信息加密

如果有人想给我发信息,但是不想让除我之外的其他人知道这个信息,可以在发送之前用我的公钥加密信息,然后再发送加密后的信息。这样每个持有我公钥的人都可以向我发送加密的信息,只有持有私钥的我才能解密信息,其他人即使拦截到加密的信息也无法解密。

加密

用途 2:数字签名

私钥 可以对信息生成数字签名,公钥 可以验证签名,从而确定:

  1. 这个签名是公钥对应的私钥生成的,且无法否认
  2. 签名对应的信息没有被篡改

如果我有对外发布信息的需求,同时既不想让任何人冒充我发布虚假信息,也不想让任何人篡改我发布的信息,可以在发布信息之前用我的私钥对信息进行数字签名,具体操作为:

  1. 使用 hash 函数(如 MD5, SHA 等)生成信息的 摘要 (digest)
  2. 使用我的私钥对 摘要 进行加密,即生成 签名 (signature)
  3. 签名 附带在信息中一起发布

这样持有我的公钥的人收到信息后,可以通过 签名 检查信息是否是由我发布的,并且可以检查信息内容是否被篡改,具体操作为:

  1. 用我的公钥对 签名 (signature) 进行解密,得到 摘要 (digest)。如果可以解密,就证明 签名 是我的私钥生成的,进而证明信息确实是我发布的,并且我无法否认
  2. 使用 hash 函数生成信息的 摘要,与解密得到的 摘要 进行对比,如果摘要相同,则证明信息内容没有被篡改

签名发布

新的问题

非对称加密体系依赖 2 个前提:

  1. 所有人的私钥由自己保存,且不能泄露,这一点由持有人自身保证。
  2. 所有人的公钥需要对外公开。

第 2 个前提带来一个新的问题,就是公钥如何安全可信的对外分发,怎么防止第三方冒充我散发假的公钥,其他人收到公钥后又如何才能确认他们持有的公钥的确是我的公钥呢?

参考

  • http://www.youdzone.com/signature.html