面试题答案
一键面试- 密钥生成:
- 使用
cryptography
库生成密钥。例如,对于对称加密(如AES),可以这样生成密钥:
from cryptography.fernet import Fernet key = Fernet.generate_key()
- 对于非对称加密(如RSA),可以使用以下方式生成私钥和公钥:
from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import serialization, hashes private_key = rsa.generate_private_key( public_exponent = 65537, key_size = 2048 ) public_key = private_key.public_key() private_pem = private_key.private_bytes( encoding = serialization.Encoding.PEM, format = serialization.PrivateFormat.PKCS8, encryption_algorithm = serialization.NoEncryption() ) public_pem = public_key.public_bytes( encoding = serialization.Encoding.PEM, format = serialization.PublicFormat.SubjectPublicKeyInfo )
- 使用
- 客户端数据加密传输:
- 对称加密:
- 假设客户端已经获取到密钥
key
,要发送的数据为data
(假设为字符串类型,需要先编码为字节类型)。
from cryptography.fernet import Fernet cipher_suite = Fernet(key) data = "Hello, Server!".encode('utf - 8') cipher_text = cipher_suite.encrypt(data) # 这里将cipher_text通过网络发送给服务器
- 假设客户端已经获取到密钥
- 非对称加密:
- 客户端使用服务器的公钥
public_key
加密数据。假设数据为message
(同样需编码为字节类型)。
message = "Hello, Server!".encode('utf - 8') encrypted = public_key.encrypt( message, padding.OAEP( mgf = padding.MGF1(algorithm = hashes.SHA256()), algorithm = hashes.SHA256(), label = None ) ) # 将encrypted通过网络发送给服务器
- 客户端使用服务器的公钥
- 对称加密:
- 服务器解密验证:
- 对称加密:
- 服务器接收到
cipher_text
,使用相同的密钥key
进行解密。
from cryptography.fernet import Fernet cipher_suite = Fernet(key) decrypted_data = cipher_suite.decrypt(cipher_text) print(decrypted_data.decode('utf - 8'))
- 服务器接收到
- 非对称加密:
- 服务器使用自己的私钥
private_key
解密数据。
original_message = private_key.decrypt( encrypted, padding.OAEP( mgf = padding.MGF1(algorithm = hashes.SHA256()), algorithm = hashes.SHA256(), label = None ) ) print(original_message.decode('utf - 8'))
- 服务器使用自己的私钥
- 对称加密:
在实际网络编程中,还需要处理网络连接(如使用socket
库)、密钥的安全分发等问题,以确保整个加密通信流程的安全性和可靠性。