生成Alice和Bob的公私钥,保存为pem格式的文件
save_private_key(private_key, 'Aprivate_key.pem')
save_public_key(public_key, 'Apublic_key.pem')
seed = os.urandom(32) # 使用随机的字节串作为种子
private_key, public_key = generate_rsa_key_pair(seed)
# 保存私钥和公钥到文件中
save_private_key(private_key, 'Bprivate_key.pem')
save_public_key(public_key, 'Bpublic_key.pem')
def load_private_key(private_key_path):
with open(private_key_path, "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
return private_key
# 加载公钥
def load_public_key(public_key_path):
with open(public_key_path, "rb") as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
backend=default_backend()
)
return public_key
# 使用对方的公钥加密对称密钥
def encrypt_symmetric_key(public_key, symmetric_key):
encrypted_key = public_key.encrypt(
symmetric_key,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return encrypted_key
# 生成对称密钥
def generate_symmetric_key():
# 这里简单地使用一个固定长度的随机字节序列作为对称密钥
# 实际应用中,应该使用安全的随机数生成器来生成对称密钥
symmetric_key = b'\x00' * 32 # 32字节对称密钥
return symmetric_key
# 从RSA密钥对中生成共享密钥
def generate_shared_key(private_key, peer_public_key):
symmetric_key = generate_symmetric_key()
encrypted_key = encrypt_symmetric_key(peer_public_key, symmetric_key)
return symmetric_key, encrypted_key
# 加载Alice和Bob的私钥和公钥
Aprivate_key = load_private_key("Aprivate_key.pem")
Apublic_key = load_public_key("Apublic_key.pem")
Bprivate_key = load_private_key("Bprivate_key.pem")
Bpublic_key = load_public_key("Bpublic_key.pem")
# 使用Alice的私钥和Bob的公钥生成共享密钥
shared_key_A, encrypted_key_A = generate_shared_key(Aprivate_key, Bpublic_key)
# 使用Bob的私钥和Alice的公钥生成共享密钥
shared_key_B, encrypted_key_B = generate_shared_key(Bprivate_key, Apublic_key)
print(Apublic_key)
print(Bpublic_key)
print("Alice的共享密钥:", shared_key_A)
print("Bob的共享密钥:", shared_key_B)