使用公钥进行Python PGP加密时遇公钥错误问题求助
PGP公钥加密异常排查与解决
问题背景
使用Python的PGPy库实现公钥加密时,某特定公钥始终报错,更换其他公钥则加密正常。公钥提供商确认该公钥无异常,且已在其他集成项目中正常使用,目前无法确定是加密流程缺失还是PGPy本身存在问题。
现有代码
def pgpy_encrypt(key_blob, data): fkey = False key, _ = pgpy.PGPKey.from_blob(key_blob) key._require_usage_flags = False message = pgpy.PGPMessage.new(data) try: sessionkey, enc_message = key.encrypt(message) print(enc_message.is_encrypted) print('enc_message.is_encrypted') print(enc_message.is_encrypted) print('enc_message.message') print(enc_message.message) if enc_message.is_encrypted : return enc_message.message except pgpy.PGPError as e: print('ERROR ' + e) return False
异常公钥
-----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGP Command Line v10.3.2 (Build 12343) (AIX) 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 LnHr06kJQxJaVdgQiWKyUCjhLmAOKnrM7YnhTGE= =3w0y -----END PGP PUBLIC KEY BLOCK-----
异常返回结果
<IntegrityProtectedSKEDataV1 [tag 18][v1] at 0x2058a1d3eb0>
排查与解决思路
修正加密结果获取方式
你直接访问的enc_message.message是PGPy内部的底层数据对象,并非标准的PGP加密文本。正确做法是调用enc_message.armor()或str(enc_message)来获取ASCII-armored格式的加密内容,修改代码返回部分:if enc_message.is_encrypted : return enc_message.armor()校验公钥加密权限
跳过_require_usage_flags校验可能掩盖了公钥的权限问题。先恢复校验逻辑,检查公钥是否支持加密:def pgpy_encrypt(key_blob, data): try: key, _ = pgpy.PGPKey.from_blob(key_blob) if not key.can_encrypt: print("公钥不具备加密权限") return False message = pgpy.PGPMessage.new(data) enc_message = key.encrypt(message) if enc_message.is_encrypted: return enc_message.armor() except pgpy.PGPError as e: print(f'ERROR: {e}') return False也可以用GPG工具解析公钥确认权限:
gpg --list-packets --verbose <(echo "你的公钥内容")查看输出中是否包含
encrypt相关的使用标记。升级PGPy版本
该公钥由PGP Command Line v10.3.2生成,可能使用了较新特性。升级PGPy到最新稳定版:pip install --upgrade pgpy交叉验证公钥有效性
用GPG工具测试公钥能否正常加密:echo "测试数据" | gpg --encrypt --armor --recipient <公钥指纹>如果GPG能正常加密,说明问题出在PGPy的处理逻辑;如果GPG也报错,需再和提供商确认公钥配置。
内容的提问来源于stack exchange,提问作者mamfredym
相关产品推荐
相关产品推荐

