Alice和Bob使用DES/AES算法加密通信内容 Alice和Bob利用Diffie-Hellman密码协商协议生成DES加密密钥k_AB。 Alice使用RSA算法生成公私钥对,并将公钥发送给Bob 设计好界面(不一定图形),可验证自动生成的密钥和加解密正确的结果。 RSA算法使用不小于1024比特的模数N。 不要求双方真正建立通信信道,调用python库实现以上要求
时间: 2024-02-09 21:08:50 浏览: 120
基于DES算法和RSA算法的数据加密方案
4星 · 用户满意度95%
好的,下面是代码实现和解释,首先是Diffie-Hellman密钥协商:
```python
from random import randint
from Crypto.Cipher import AES, DES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
from Crypto.Util.number import getPrime
import hashlib
# Diffie-Hellman密钥协商
def DH_key_exchange():
# 选取两个质数p和g
p = getPrime(256)
g = 2 # 取2作为g
# Alice和Bob各自生成私钥a和b
a = randint(2, p - 2)
b = randint(2, p - 2)
# 计算公钥A和B
A = pow(g, a, p)
B = pow(g, b, p)
# 计算共享密钥k_AB
k_AB = pow(B, a, p)
# 也可以使用pow(A, b, p)计算得到相同的k_AB
return k_AB
```
上面的代码使用了Python的random模块生成随机数,使用Crypto.Util.number模块生成质数,使用pow函数计算幂次方,实现了简单的Diffie-Hellman密钥协商。
接下来是RSA算法生成公私钥对,并将公钥发送给Bob:
```python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# RSA加密解密
class RSA_encryption():
def __init__(self):
self.key = RSA.generate(1024) # 生成公私钥对
# 获取公钥
def get_public_key(self):
return self.key.publickey().export_key()
# 加密数据
def encrypt(self, data):
cipher_rsa = PKCS1_OAEP.new(self.key.publickey())
return cipher_rsa.encrypt(data)
# 解密数据
def decrypt(self, ciphertext):
cipher_rsa = PKCS1_OAEP.new(self.key)
return cipher_rsa.decrypt(ciphertext)
```
上面的代码使用了Python的Crypto模块,生成了一个1024比特的RSA公私钥对,可以使用get_public_key方法获取公钥,使用encrypt和decrypt方法进行加密和解密。在实际使用中,Alice需要将生成的公钥发送给Bob。
最后是DES/AES加密解密:
```python
# DES/AES加密解密
class DES_AES_encryption():
def __init__(self, key):
self.key = key
# DES加密
def DES_encrypt(self, data):
cipher = DES.new(self.key, DES.MODE_ECB)
ciphertext = cipher.encrypt(pad(data, DES.block_size))
return ciphertext
# DES解密
def DES_decrypt(self, ciphertext):
cipher = DES.new(self.key, DES.MODE_ECB)
data = unpad(cipher.decrypt(ciphertext), DES.block_size)
return data
# AES加密
def AES_encrypt(self, data):
iv = get_random_bytes(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(data, AES.block_size))
return iv + ciphertext
# AES解密
def AES_decrypt(self, ciphertext):
iv = ciphertext[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
data = unpad(cipher.decrypt(ciphertext[AES.block_size:]), AES.block_size)
return data
```
上面的代码使用了Python的Crypto模块,实现了DES和AES加密解密。需要注意的是,在使用DES/AES加密时,需要先使用Diffie-Hellman密钥协商得到共享密钥,然后将共享密钥作为参数传入到DES_AES_encryption类中。
最后,我们可以编写一个简单的命令行界面,调用上述代码实现所有要求:
```python
def main():
# Diffie-Hellman密钥协商
k_AB = DH_key_exchange()
# RSA加密解密
rsa = RSA_encryption()
public_key = rsa.get_public_key()
# DES/AES加密解密
des_aes = DES_AES_encryption(hashlib.sha256(str(k_AB).encode()).digest())
# 加密数据
message = b"Hello Bob, this is Alice."
ciphertext = des_aes.AES_encrypt(message)
encrypted_key = rsa.encrypt(hashlib.sha256(str(k_AB).encode()).digest())
# 解密数据
decrypted_key = rsa.decrypt(encrypted_key)
des_aes = DES_AES_encryption(decrypted_key)
decrypted_message = des_aes.AES_decrypt(ciphertext)
# 验证结果
print("原始数据:", message)
print("加密后数据:", ciphertext)
print("解密后数据:", decrypted_message)
if __name__ == "__main__":
main()
```
上面的代码中,我们先使用Diffie-Hellman密钥协商得到共享密钥k_AB,然后使用RSA加密共享密钥,再使用共享密钥加密数据,最后使用RSA解密共享密钥,再使用共享密钥解密数据。通过打印出原始数据、加密后数据和解密后数据,可以验证加解密的正确性。
阅读全文