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

使用公钥进行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)

mQENBFdVGjUBCADB3QzDGrstJlvhsxNeIbORl7Pt4lfinTiYUcVqK1XBYTMRZYXs
BXHAWsBsLmtnKhhN/AxOQYoAjmm9UfsqKBnDV/6ddPWG26E+pfZDQuLTAUuCNpCo
EhL6oLXLXedBZubbbUpNu4WoKQ775lUHR4OOCNLvotDj9dQ3CbzbdPMj8JRKcm6K
lTTY8xisa6nGQAbeKG0Ixly6pkOK4gYdhkhobeL1g5m3fK4W6yfB8BACrHAS7xTT
EynFl7c+ZgMklAah0D+uwE9PIwkCeVlxwipkBDIkpk0ag46o1TjYd3ftGZqAZCkD
89o3lUUNOPxJteqXMxjHcw8i1QQ+Mppa/cQnABEBAAG0G3FhaG9zdDJob3N0LmJh
bmNvbG9tYmlhLmNvbYkBaQQQAQIAUwUCV1UaNTAUgAAAAAAgAAdwcmVmZXJyZWQt
ZW1haWwtZW5jb2RpbmdAcGdwLmNvbXBncG1pbWUFCwcICQICGQEFGwMAAAACFgIF
HgEAAAADFQgKAAoJEM/rGaR0Igk0cokH/ROj86JNaMiAAvH02H/jqXWFc4nDMALY
ZyRVsaZY9vgi7jbJbxcbVVkmrDkVoMpFlVJh8R12AE1rHg408hDSXVljo+8QUk32
Tejp/w9+VwoClG8VDcqy31ydw07Y8lEiFeJC7F5n5lBxqZwlcURYU4P13uwj9waA
oxXYAUWUdUVxD6uUmpJbpDVa0MzP/4EvXMKGh/dRVDJbupp8uGJpysc7LDY5KF5f
y+gfqdmvWG6NtwCimxLPuL39WeBvskaAXQrfrRx9tOIXeR+QDbzbpUvuN44YTH2k
14tsGBFq8doEVFbQFmlW6woSvJSiwH+d8MyqAlBS0i4xOQYCLMlBtxi5AQ0EV1Ua
NgEIAKtgrKiZTTGAh+/s62rTXBVQqJlvhj8PILQvs8meQyPGJlzqTlb2Wq9Ksg1x
0UZICvr7+etRDa0YWmbK6TlRNiUBKMApVo+pyhDOdOBkV/Otnqv1vt0MPc7mniFy
6gbTW8P/ZJto+/9GdArzIH0vwSW4zrxBk7bkR9ab4Yn9nnwnLm8pB3ew8rT9/Av7
q9OksECnAjDuArWBX9lM8oCVNezNX17wu1ENo/W5LthF7vbWeWPpSVl3iwBcMES8
HZuPKeuFUtRYFpTx3xyZkf/xF4njCck4QiGvtuo8jx9hrcUkABRvHH6KG36myptj
zsA/GpAITgPPz9uYhpduRJLpXnEAEQEAAYkCQQQYAQIBKwUCV1UaNwUbDAAAAMBd
IAQZAQgABgUCV1UaNgAKCRBDzR3eP4V5KMqhB/4+hy3hSzHgBpAVK56fI4nf4gdz
VUaRFXhRQxzlaUtmDy1KOz215pAx4FX7RrI9kkPUSYZ5y70Aw++XyloGmhgzLxO0
TIBJiGlj8hyGkMiQ+u2rY4Ox58h7S6Tpt0SiUKW4JhTUFXcf9eMBkFxPRFeJdeqc
vNzUM0qUEOrhTs19H9QynrWoAPh1BJXUjeVCvGHTVEr4TMQlwVjGp+eDJVZBIt9W
LadPBXZ+1IuTxWwriza9mcsUr1zlRY71xzvEF8CL+VveisXCkIgLS7CtOQ0/t0Vk
LQLYwrRlLza16g55ZCCQwSz371zMhIv1skMryRa5e2+gnn4Rta2zHnu5o37EAAoJ
EM/rGaR0Igk0fLAH/iejvnMzjUByu1xg/ft0b75WRAX0TW3fw/d9qVBHxyJTod4+
u+qnqsQg0ZfqHQ5BTljzqiewaZbjTpjwGl3Dq8B726IVZwj3TZaZeS2NMABfXyq5
Uo1eM/p9itzaCspAI3KNzMLUoyG+QhWvhhyfpGX4IXxNmj0/ydhmRvERboE9ienf
oQC/Az247ZtFynYaUPPaaEnEb7cRb+FIA9MW59HXkdYcVD0IRf68J75IeUtzkqZe
GvMaZ94nxDBW6UxU4uCRrYcCj9EzQIjhu9FKtKqFa5JbFIGNhuKrLBzRVxGq50Lg
LnHr06kJQxJaVdgQiWKyUCjhLmAOKnrM7YnhTGE=
=3w0y
-----END PGP PUBLIC KEY BLOCK-----

异常返回结果

<IntegrityProtectedSKEDataV1 [tag 18][v1] at 0x2058a1d3eb0>

排查与解决思路

  1. 修正加密结果获取方式
    你直接访问的enc_message.message是PGPy内部的底层数据对象,并非标准的PGP加密文本。正确做法是调用enc_message.armor()或str(enc_message)来获取ASCII-armored格式的加密内容,修改代码返回部分:

    if enc_message.is_encrypted :
        return enc_message.armor()
    
  2. 校验公钥加密权限
    跳过_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相关的使用标记。

  3. 升级PGPy版本
    该公钥由PGP Command Line v10.3.2生成,可能使用了较新特性。升级PGPy到最新稳定版:

    pip install --upgrade pgpy
    
  4. 交叉验证公钥有效性
    用GPG工具测试公钥能否正常加密:

    echo "测试数据" | gpg --encrypt --armor --recipient <公钥指纹>
    

    如果GPG能正常加密,说明问题出在PGPy的处理逻辑;如果GPG也报错,需再和提供商确认公钥配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:55:20