使用Python的PGPy加密文件报错:密钥缺少加密权限标志
解决PGPy密钥权限标志错误与完整加解密实现
问题原因
你遇到的PGPError是因为当前使用的公钥未配置加密存储/通信权限标志,PGPy会严格校验密钥用途与操作类型是否匹配。另外,生成密钥后只看到私钥是因为PGPy的密钥对象同时包含公私钥,需单独导出公钥使用。
步骤1:生成带加密权限的PGP公私钥对
以下代码生成符合加密要求的密钥对,并分别导出公私钥到文件:
from pgpy import PGPKey, PGPUID import datetime # 生成2048位RSA密钥对 key = PGPKey.new(PGPKey.RSA, 2048) # 添加用户标识,配置密钥用途(必填加密权限) uid = PGPUID.new("你的名称", email="your@email.com", comment="加密专用PGP密钥") key.add_uid(uid, usage={ 'encrypt': True, # 启用加密权限,解决权限标志报错的核心配置 'sign': True # 可选:同时启用签名权限,若无需签名可删除 }, expires=datetime.datetime.now() + datetime.timedelta(days=365)) # 设置1年有效期 # 导出私钥到文件(务必妥善保管) with open('private_key.asc', 'w') as f: f.write(str(key)) # 从私钥中提取公钥并保存 pub_key = key.pubkey with open('public_key.asc', 'w') as f: f.write(str(pub_key))
步骤2:使用公钥加密文件
修正加密代码,加载带加密权限的公钥完成文件加密:
from pgpy import PGPKey, PGPMessage import io # 加载合法的加密公钥 pub_key, _ = PGPKey.from_file('public_key.asc') # 读取目标文件内容 with io.open('test.csv', 'r', newline='', encoding='utf-8') as csv_file: input_data = csv_file.read() # 创建PGP消息并执行加密 msg = PGPMessage.new(input_data) encrypted_message = pub_key.encrypt(msg) # 保存加密后的文件 with open('test.csv.pgp', 'w') as f: f.write(str(encrypted_message))
步骤3:使用私钥解密文件
用对应私钥解密加密后的文件:
from pgpy import PGPKey, PGPMessage # 加载私钥(若私钥设置了密码,需传入密码参数解锁) priv_key, _ = PGPKey.from_file('private_key.asc') # 读取加密消息 with open('test.csv.pgp', 'r') as f: encrypted_msg = PGPMessage.from_file(f) # 解密操作:无密码直接调用unlock(),有密码则传入密码字符串 with priv_key.unlock(): decrypted_data = priv_key.decrypt(encrypted_msg).message # 保存解密后的文件 with open('decrypted_test.csv', 'w', encoding='utf-8') as f: f.write(decrypted_data)
关键提示
- 密钥用途:生成密钥时必须指定
'encrypt': True,否则无法通过PGPy的权限校验。 - 公私钥关联:私钥包含完整的公钥信息,无需单独生成公钥,通过
key.pubkey提取即可。 - 密码保护:若需给私钥加密码,可在生成后执行
key.protect("你的密码", PGPKey.PassphraseHash.SHA256),解密前必须先解锁。
内容的提问来源于stack exchange,提问作者Aman shaw
相关产品推荐
相关产品推荐

