You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将PEM文件转换为PBES1格式加密私钥文件?

解决方案

首先明确:不需要手动做Base64编码和添加头尾,cryptography库已经提供了现成的工具函数,分两种场景处理:

场景1:已生成加密私钥二进制数据,转PEM格式

用cryptography.hazmat.primitives.serialization.pem.armor函数,它会自动完成Base64编码并添加指定的PEM头尾:

from cryptography.hazmat.primitives.serialization.pem import armor

# 假设你已经得到加密后的私钥二进制数据
encrypted_private_key_bytes = b"..."  # 你的加密私钥二进制内容

# 生成标准PEM格式字符串
pem_data = armor(
    header="ENCRYPTED PRIVATE KEY",
    payload=encrypted_private_key_bytes
)

# 写入文件或直接使用
with open("encrypted_key.pem", "w") as f:
    f.write(pem_data.decode("utf-8"))

场景2:从原始私钥直接生成PBES1加密的PEM格式(更推荐)

如果是从未加密的私钥开始处理,不需要单独生成二进制数据,可以直接在序列化时指定PBES1加密算法,一步得到目标PEM:

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.serialization import PBES1, PBKDF2HMAC, DES3CBC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend

# 读取未加密的PEM私钥
with open("unencrypted_key.pem", "rb") as f:
    private_key = serialization.load_pem_private_key(
        f.read(),
        password=None,
        backend=default_backend()
    )

# 定义PBES1加密参数(根据你的兼容性要求调整算法)
encryption_algorithm = PBES1(
    kdf=PBKDF2HMAC(
        algorithm=hashes.SHA1(),
        iterations=1000,
        salt=b"your_salt_here",  # 可自定义盐,或让库自动生成
        backend=default_backend()
    ),
    cipher=DES3CBC()  # 对应PBES1常用的加密算法,按需替换
)

# 序列化为带指定头尾的PEM格式
encrypted_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=encryption_algorithm
)

# 写入文件
with open("encrypted_key.pem", "wb") as f:
    f.write(encrypted_pem)

关于编码错误的补充

之前用utf-8解码二进制私钥出现错误,是因为私钥是二进制字节流,不是合法的utf-8字符串。正确的做法是读取二进制文件时用rb模式,直接获取字节数据,避免不必要的编码转换;如果必须转成字符串,用latin-1是可行的(因为它是单字节映射,不会丢失数据),但更推荐直接操作字节流。

内容的提问来源于stack exchange,提问作者nohup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:17:20