使用C语言openssl库实现 RSA加密 和 消息验证

Q:什么是RSA?

A:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥(public key)和私钥(private key)。公钥用于加密,私钥用于解密。由于使用不同的密钥进行加密和解密,因此被称为非对称加密算法。RSA算法的安全性基于大数因子分解的难度,即大整数分解问题。目前尚未找到一种高效算法可以在合理时间内解决大整数的分解问题,这使得RSA在当前计算机性能下是安全的。


Q:什么是RSA消息验证?

A:RSA消息验证指的是使用RSA算法对消息进行签名和验证,以确保消息的完整性和真实性。


RSA密钥对生成

  • 选择两个大素数 p 和 q
  • 计算 𝑛=𝑝×𝑞,这是模数
  • 计算 𝜙(𝑛)=(𝑝−1)×(𝑞−1)
  • 选择一个整数 𝑒作为公用指数,使 1<𝑒<𝜙(𝑛)并且 𝑒 与 𝜙(𝑛)互质
  • 计算私钥指数 𝑑,使得 𝑑×𝑒≡1 (mod 𝜙(𝑛))

公钥是 (𝑒,𝑛),私钥是 (𝑑,𝑛)

RSA加密/解密步骤

加密

  • 将明文 𝑀 转换为整数 𝑚,其中 0≤𝑚<𝑛
  • 使用公钥 (𝑒,𝑛)进行加密,得到密文 𝑐=m^{e} (mod 𝑛)

解密

  • 使用私钥 (𝑑,𝑛) 进行解密,恢复明文 𝑚=c^{d}(mod 𝑛)

RSA消息验证步骤

签名

  • 发送方使用其私钥对消息进行签名。具体做法是对消息进行哈希处理,得到一个消息摘要,然后使用私钥对这个摘要进行加密,生成签名
  • 签名与原始消息一起发送给接收方

验证

  • 接收方使用发送方的公钥对签名进行验证。具体做法是对收到的签名使用公钥解密,得到解密后的摘要
  • 接收方同时对收到的原始消息进行哈希处理,得到本地计算的消息摘要
  • 比较解密后的摘要和本地计算的摘要,如果两者相同,则验证成功,消息没有被篡改且确实来自发送方

举个例子:

假设Alice要给Bob发送一条消息,并且需要确保Bob知道这条消息确实来自Alice且没有被篡改,Alice和Bob可以使用RSA进行消息签名和验证。

  1. Alice生成密钥对

    • 公钥:(𝑒,𝑛)
    • 私钥:(𝑑,𝑛)
  2. Alice签名消息

    • 对消息进行哈希处理,得到消息摘要 𝐻(𝑀)
    • 使用私钥对消息摘要进行加密,生成签名 𝑆=𝐻(𝑀)𝑑 (mod 𝑛)
    • 将消息 𝑀 和签名 𝑆 发送给Bob。
  3. Bob验证签名

    • 使用公钥对签名进行解密,得到解密后的摘要 𝐻 ′(𝑀)=𝑆𝑒 (mod 𝑛)
    • 对收到的消息 𝑀 进行哈希处理,得到本地计算的消息摘要 𝐻(𝑀)
    • 比较解密后的摘要 𝐻 ′(𝑀)和本地计算的摘要 𝐻(𝑀),如果两者相同,则验证成功。

通过上述过程,Bob可以确认消息确实来自Alice且未被篡改。

RSA加密/解密 & RSA消息验证

在刚刚的消息验证 例子中,公钥用于解密,而私钥用于加密,这似乎违背了在开头所说的“公钥加密,私钥解密”,其实并没有,这是因为RSA加/解密 和 RSA消息验证是两个不同的概念

他们可以各自单独使用,也可以结合使用,以下是三个不同的场景帮助理解:


1. 单独使用RSA加密

场景1:确保消息的机密性

步骤

  1. 密钥生成接收方生成一对RSA密钥对(公钥和私钥)。
  2. 公钥分发:接收方将公钥分发给发送方。
  3. 消息加密
    • 发送方使用接收方的公钥对消息进行加密。
    • 发送方将加密后的消息发送给接收方。
  4. 消息解密
    • 接收方使用自己的私钥对加密的消息进行解密,恢复原始消息


2. 单独使用RSA消息验证(数字签名)

场景2:确保消息的完整性和真实性

步骤

  1. 密钥生成发送方生成一对RSA密钥对(公钥和私钥)。
  2. 公钥分发:发送方将公钥分发给接收方。
  3. 消息签名
    • 发送方对消息进行哈希处理,生成消息摘要。
    • 发送方使用自己的私钥对消息摘要进行加密,生成签名。
    • 发送方将原始消息和签名一起发送给接收方。
  4. 签名验证
    • 接收方使用发送方的公钥对签名进行解密,得到解密后的消息摘要。
    • 接收方对收到的原始消息进行哈希处理,生成本地计算的消息摘要。
    • 接收方比较解密后的消息摘要和本地计算的消息摘要,如果两者相同,则验证成功。


3. 结合使用RSA加密和消息验证

场景3:确保消息的机密性、完整性和真实性

步骤

  1. 密钥生成
    • 发送方和接收方各自生成一对RSA密钥对(各自的公钥和私钥)。
  2. 公钥分发
    • 发送方和接收方互相交换公钥。
  3. 消息签名和加密
    • 发送方对消息进行哈希处理,生成消息摘要。
    • 发送方使用自己的私钥对消息摘要进行加密,生成签名。
    • 发送方将签名附加到原始消息上。 
    • 发送方使用接收方的公钥对包含签名的消息进行加密。
    • 发送方将加密后的消息发送给接收方。
  4. 消息解密和验证
    • 接收方使用自己的私钥对加密的消息进行解密,得到原始消息和签名。
    • 接收方使用发送方的公钥对签名进行解密,得到解密后的消息摘要。
    • 接收方对收到的原始消息进行哈希处理,生成本地计算的消息摘要。
    • 接收方比较解密后的消息摘要和本地计算的消息摘要,如果两者相同,则验证成功。

相关函数认识

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值