📜  RSA和数字签名(1)

📅  最后修改于: 2023-12-03 15:19:51.425000             🧑  作者: Mango

RSA和数字签名

RSA是一种非对称加密算法,数字签名则是通过RSA等算法来实现的一种身份验证和消息完整性保护的技术。

RSA加密算法

RSA加密算法是由三个数p、q、n来确定的。p、q是两个大素数,n=p*q。下面列出了RSA加密算法的几个步骤:

  1. 选择两个非常大的质数p,q,并计算n=p*q。
  2. 计算欧拉函数ϕ(n)=(p-1)(q-1)。
  3. 选择整数e(1<e<ϕ(n)),使得e和ϕ(n)互质。
  4. 计算整数d,使得d*e mod ϕ(n)=1。
  5. 公钥KU={e,n},私钥KR={d,n}。

加密和解密的过程如下:

  1. 加密:明文M经过公钥加密后得到密文C=C^e mod n。
  2. 解密:密文C经过私钥解密后得到明文M=C^d mod n。
数字签名

数字签名是指对消息的完整性、可靠性和身份的验证,是一种公钥加密技术。数字签名算法的流程包括以下几个步骤:

  1. 发送方使用哈希函数将要签名的文件变为消息摘要并进行RSA加密,得到数字签名。
  2. 接收方使用相同的哈希函数将文件变为消息摘要,并使用发件方的公钥对数字签名进行解密,得到解密后的摘要。
  3. 对比解密后的摘要和计算出的消息摘要是否一致,来验证文件的完整性和身份。

具体步骤如下:

  1. 计算消息的哈希值,通常使用SHA-256或者MD5等哈希算法。
  2. 对哈希值进行RSA加密,得到数字签名。
  3. 将消息和数字签名发送给接收方。
  4. 接收方使用收到的数字签名进行解密,得到消息的哈希值。
  5. 接收方再次对消息计算哈希值,并将其与解密后的哈希值进行比较,如果一致则说明消息完整性得到了保证。
示例代码

生成RSA密钥对:

from Crypto.PublicKey import RSA

# 生成长度为2048的RSA密钥对
key = RSA.generate(2048)

# 获取私钥和公钥
private_key = key.export_key()
public_key = key.publickey().export_key()

使用RSA加密和解密:

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

# 生成长度为2048的RSA密钥对
key = RSA.generate(2048)

# 获取公钥和私钥
public_key = key.publickey()
private_key = key

# 初始化加密和解密器
cipher = PKCS1_OAEP.new(key=public_key)
decryptor = PKCS1_OAEP.new(key=private_key)

# 加密和解密过程
message = b'Hello, world!'
encrypted_message = cipher.encrypt(message)
decrypted_message = decryptor.decrypt(encrypted_message)
print(decrypted_message)   # b'Hello, world!'

使用数字签名进行验证:

from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15

# 生成长度为2048的RSA密钥对
key = RSA.generate(2048)

# 获取公钥和私钥
public_key = key.publickey()
private_key = key

# 初始化签名和验证器
message = b'Hello, world!'
hash_obj = SHA256.new(message)
signature = pkcs1_15.new(private_key).sign(hash_obj)
verifier = pkcs1_15.new(public_key)

# 验证消息的完整性和身份
try:
    verifier.verify(hash_obj, signature)
    print("Message is authentic.")
except (ValueError, TypeError):
    print("Message is not authentic.")