非对称加密

警告
本文最后更新于 2023-12-25,文中内容可能已过时。

非对称加密

签名的过程

Java 中对数据进行签名/验证签名, 签名可以用于实现身份认证,具体过程如下:

  1. 发送方生成密钥对:发送方生成一对密钥,包括私钥和公钥。私钥用于生成签名,公钥用于验证签名。
  2. 数据签名:发送方使用私钥对要发送的数据进行签名。签名过程通常涉及使用哈希函数生成数据摘要(通常使用 MD5 和 SHA-256),然后使用私钥对摘要进行加密生成签名。
  3. 数据传输:发送方将数据和签名一起传输给接收方。
  4. 数据验签:接收方收到数据和签名后,使用发送方的公钥对签名进行验证。验证过程包括使用相同的哈希函数生成数据摘要,并使用公钥对签名进行解密。然后将解密后的签名与生成的摘要进行比较,如果一致,则说明签名有效。
  5. 身份认证:如果签名验证成功,接收方可以确认数据的来源是发送方。因为只有发送方持有私钥,能够生成有效的签名。 通过签名,接收方可以验证数据的完整性和认证数据的来源,从而实现身份认证。签名确保了数据在传输过程中没有被篡改,并且只有拥有私钥的发送方能够生成有效的签名。这样,接收方可以相信数据确实来自于发送方,并且没有被篡改。

摘要算法

MD5 算法是一种常用的哈希函数,它将任意长度的数据映射为固定长度的 128 位哈希值。MD5 算法广泛用于数据完整性校验和密码存储等领域。它通过对输入数据进行一系列复杂的位运算和逻辑运算,生成一个唯一的哈希值。这个哈希值通常用作数据的数字指纹,用于验证数据的完整性或比对密码。然而,由于 MD5 算法存在一些安全漏洞,如碰撞攻击,因此在一些安全性要求较高的场景中,建议使用更安全的哈希算法,如 SHA-256。

SHA-256(Secure Hash Algorithm 256-bit)是 SHA-2(Secure Hash Algorithm 2)系列中的一种哈希算法。它是美国国家标准与技术研究院(NIST)发布的一种密码学哈希函数。 SHA-256 算法将任意长度的输入数据转换为固定长度的 256 位哈希值。它通过一系列复杂的位运算和逻辑运算,对输入数据进行处理,生成一个唯一的哈希值。该哈希值通常用于验证数据的完整性、数字签名、证书验证等安全领域。 SHA-256 算法相对于较旧的哈希算法(如 MD5 和 SHA-1)具有更高的安全性和抗碰撞能力。它在密码学和信息安全中得到广泛应用,被认为是一种比较安全和可靠的哈希算法。

加密的过程

跟签名的过程大同小异

签名和加密的不同

签名和加密是两个不同的概念,用于实现不同的安全目标。

  • 签名是用于验证数据的完整性、认证数据的来源和防止数据被篡改的过程。通过使用私钥对数据的摘要进行加密生成签名,然后把数据内容明文和签名一起发送给接收方,然后接收方使用相应的公钥对数据摘要进行验证。签名只涉及数据的验证和认证,不涉及数据的保密性,因为数据是明文传输的。

  • 加密是用于保护数据的机密性,以防止未经授权的访问者获取或理解数据。通过使用密钥对数据进行加密,只有持有正确密钥的人才能解密和访问数据。加密只关注数据的保密性,不涉及数据的验证和认证。 简而言之,签名用于验证和认证数据的完整性和来源,而加密用于保护数据的保密性。签名和加密可以结合使用,以提供更全面的数据安全保护。

公钥和私钥,既可以用来签名,也可以用来加密解密,不过要注意公钥和私钥在这两部里的操作的区别:

  • 在签名中,私钥用于进行签名,公钥用于验签,

  • 在加密解密中,公钥用于加密,私钥用于进行解密,

为什么这样安排呢?因为公钥是对开公开的,

签名的作用就是验证消息的来源,即因为只有发送方才能签名,所以只要我收到了正确的签名信息,那一定就是特定的发送方发送的,因此签名要用私钥,不能用公钥,不然谁都可以发送有效的签名了。而且如果谁都可以签名,那我劫持消息之后,篡改内容,然后拿公钥签名,那样的话,就无从保证数据的完整性了,因此必须用私钥签名。

加密要用公钥就更好理解了,对外公开的公钥如果用于解密,那么中间传输的信息就相当于没有加密了,虽然别人拿到公钥之后可以假冒发送方伪造信息,发送给接收方,但是无法破解从发送方发出的信息。 其实假冒的问题很好解决,而签名就是用于确定发送方身份的,为了确定消息的来源,我们一般会使用签名,即发送消息时,用对方的公钥对数据进行加密,用自己的私钥对数据进行签名

参考文档:https://www.zhihu.com/question/25912483

公钥(发给别人)和私钥(自己留着)哪个是用来加密,哪个是用来解密的,答案是:公钥和私钥 可以用任意一个加密,然后用另一个解密。只是在具体的场景下有具体的用法。

既然是加密通信,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以公钥不能用来解密,所以可得出私钥负责解密,公钥负责加密,同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以公钥不能加密,所以可得出私钥负责签名,公钥负责验证。

Java 实现

代码实践

Java 实现 RSA 签名/验签与加密解密_喵喵@香菜的博客-CSDN 博客

关于 Java 原生支持的公钥私钥生成算法 Standard Algorithm Name Documentation

关于 Java 原生支持的摘要算法 Standard Algorithm Name Documentation

为什么用私钥加密的结果可以用公钥解密?

公钥加密的基本原理是:公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;反之如果用私钥加密,只有用对应的公钥才能解密。这种方式保证了信息的安全性。

此外虽然公钥和私钥是一对,但是通过公钥算出私钥却很困难,这是必须的,因为公钥要需要公开明文传输,如果通过公钥可以反推出私钥,那公钥私钥就都暴露了;通过私钥算出公钥却可以容易一些,不过一般情况下,公钥私钥都是成对生成的,不会真的有人先生成私钥再拿私钥去生成公钥,这样效率太慢。  

这种机制的实现依赖于数学上的陷阱门函数。这种函数在一个方向上很容易计算,但在另一个方向上却很难计算。例如,大数分解就是一种典型的陷阱门函数。在非对称加密中,公钥和私钥就是通过这种陷阱门函数生成的。  

在实际的公钥加密算法中,如RSA,公钥和私钥的生成过程如下:  

  1. 随机选择两个大质数p和q。

  2. 计算 $n=pq,φ=(p-1)(q-1)$。

  3. 随机选择一个整数e,使得$1<e<φ$,且e和φ互质。

  4. 计算d,使得$e*d≡1(mod \ φ)$。

  5. 公钥为$(n, e)$,私钥为$(n, d)$。

在这个过程中,公钥和私钥是通过陷阱门函数关联起来的。因此,用公钥加密的数据只能用私钥解密,反之亦然。

非对称加密的原理

如何用通俗易懂的话来解释非对称加密? 这篇文章中,我们了解到,直线和 $y^2 = x^3 +7$ 曲线的相交然后持续迭代的过程,也是一种陷阱门函数。十分通俗易懂

0%