【发布时间】:2020-04-09 22:36:12
【问题描述】:
我们有一个用 Java 编写的系统,它将编写需要由 Python 系统解密的加密文件。我试图弄清楚我需要什么样的密钥可以被 Java 和 Python API 使用,以及如何生成它们。计划是使用 Java 中的公钥加密文件,使用 Python 中的私钥解密。
我尝试使用gpg --generate-key 生成 RSA 密钥,并在一个 armour 文件中得到一个如下所示的文件:
-----BEGIN PGP PRIVATE KEY BLOCK-----
... encoded key ...
-----END PGP PRIVATE KEY BLOCK-----
并根据如下所示创建一个公钥:
-----BEGIN PGP PUBLIC KEY BLOCK-----
... encoded key ...
-----END PGP PUBLIC KEY BLOCK-----
我可以用PGPUtil.getDecoderStream() 用Java 中的Bouncy Castle 解析公钥文件,得到一个PGPPublicKeyRingCollection 和一个PGPPublicKey,它们可以转换为java.security.PublicKey。
在 Python 方面,我尝试使用 cryptography.hazmat 和 PyCrypto api,但不知道如何导入私钥文件。当我尝试时
from Crypto.PublicKey import RSA
RSA.importKey(open('/path/to/private/key/file').read())
我收到RSA key format is not supported。
我一直在阅读不同类型的密钥和算法,但我认为持有这样一个密钥的 ASCII 文件应该可以工作,但显然我缺少一些东西。
我还尝试了另一种方式,并使用PyCrypto 生成一个新密钥,例如:
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
f = open('/tmp/private.pem','wb')
f.write(key.exportKey('PEM'))
f.close()
f = open('/tmp/public.pem','wb')
f.write(key.publickey().exportKey('PEM'))
f.close
然后像这样通过 Bouncy Castle 的 API 读取它:
PemReader reader = new PemReader(new FileReader("/tmp/public.pem"));
Object publicKey = RSAPublicKey.getInstance(reader.readPemObject().getContent());
但这给了我:
java.lang.IllegalArgumentException: illegal object in getInstance: org.bouncycastle.asn1.DLSequence
at org.bouncycastle.asn1.ASN1Integer.getInstance(Unknown Source)
at org.bouncycastle.asn1.pkcs.RSAPublicKey.<init>(Unknown Source)
Bouncy Castle 提供了两个RSAPublicKey 类,我都试过了,结果一样。
它似乎不应该这么难,所以我试图弄清楚我错过了什么。感谢您的帮助。
【问题讨论】:
-
没有多少软件包支持 PGP/GPG 用于其密钥的格式。如果您想使用 PGP 格式的密钥,那么您需要使用专门支持它们的库。如果库支持 PGP 密钥不是很明显,那么它不支持。
-
在我的第二个示例中,我尝试使用 PyCrypto 生成的 RSA 密钥,这似乎与 PGP/GPG 没有任何关系?
标签: bouncycastle pycrypto openpgp python-cryptography