这是家庭作业!
我使用
get_peer_certificate()
获取服务器的证书并调用
dump_certificate
将证书转储到变量中。格式是 PEM,看起来很适合我。
-----BEGIN CERTIFICATE-----
GIBBERISH................
......................
........................
-----END CERTIFICATE-----
如何从该文件('server.pubkey')中提取服务器的公钥并使用
plaintext
算法和任何 python 库进行加密。在撰写本文时,我正在使用 pyOpenSSL
RSA
algorithm and any python library. At the time of writing this, I am using pyOpenSSL
以下是使用 Python 和
cryptography
库(推荐用于加密操作的 PyOpenSSL 的一种更现代且维护良好的替代方案)从证书中提取公钥并加密数据的步骤:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
# --- 从证书加载公钥 ---
def load_public_key_from_certificate(certificate_pem):
"""从 PEM 格式的证书加载公钥。
Args:
certificate_pem: 以字符串形式表示的 PEM 格式证书。
Returns:
cryptography.hazmat.backends.openssl.rsa._RSAPublicKey 对象。
"""
certificate = x509.load_pem_x509_certificate(certificate_pem.encode(), default_backend())
return certificate.public_key()
# --- 使用公钥加密数据 ---
def encrypt_data(public_key, plaintext):
"""使用公钥加密数据。
Args:
public_key: cryptography.hazmat.backends.openssl.rsa._RSAPublicKey 对象。
plaintext: 要加密的明文数据(以字节形式表示)。
Returns:
以字节形式表示的密文。
"""
ciphertext = public_key.encrypt(
plaintext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return ciphertext
# --- 示例用法 ---
# 1. 从你的来源加载证书 PEM 数据
certificate_pem = """-----BEGIN CERTIFICATE-----
GIBBERISH................
......................
........................
-----END CERTIFICATE-----
"""
# 2. 从证书加载公钥
public_key = load_public_key_from_certificate(certificate_pem)
# 3. 你要加密的数据
plaintext = b"This is my secret message." # 确保数据为字节形式
# 4. 加密数据
ciphertext = encrypt_data(public_key, plaintext)
print(f"Ciphertext: {ciphertext.hex()}")
说明:
-
安装
cryptography
: 如果尚未安装,请运行pip install cryptography
。 -
证书加载:
此代码假设你已经将证书数据作为字符串存储在
certificate_pem
变量中。你需要根据你的设置调整从源中加载此数据的代码。 - 加密:
-
我们使用
OAEP
填充方案来实现 RSA 加密,这对安全性来说至关重要。 -
选择了
SHA256
作为散列算法(你可以根据需要更改它)。 -
密文:
加密后的数据(
ciphertext
)是字节形式的。在示例中,我们使用ciphertext.hex()
将其打印为十六进制字符串,以便于显示。为了传输或存储,你可能希望对密文进行 base64 编码,以获得更安全的表示形式。
重要安全提示:
- 密钥管理: 切勿将私钥硬编码到你的代码中。为了安全存储和管理密钥,请探索密钥管理解决方案或硬件安全模块 (HSM)。
- 算法和填充: 此示例使用特定算法和填充方案进行演示。在生产环境中,请彻底研究并选择符合你安全要求的最合适的算法和配置。
请记住,这提供了一个加密方面的基本概述。在处理实际数据时,请深入研究安全最佳实践并根据需要寻求专家建议。
标签:python,network-programming,rsa,pyopenssl From: 5789193