У нас есть одна система, написанная на Java, которая будет записывать зашифрованные файлы, которые должны быть расшифрованы системой Python. Я пытаюсь выяснить, какие ключи мне нужны, чтобы они могли использоваться как Java, так и Python API, и как их генерировать. Планируется использовать ключ publi c в Java для шифрования файла и закрытый ключ в Python для его расшифровки.
Я попытался сгенерировать ключи RSA с gpg --generate-key
и в файл брони получить файл, который выглядит как:
-----BEGIN PGP PRIVATE KEY BLOCK-----
... encoded key ...
-----END PGP PRIVATE KEY BLOCK-----
и создать ключ publi c из того, который выглядит следующим образом:
-----BEGIN PGP PUBLIC KEY BLOCK-----
... encoded key ...
-----END PGP PUBLIC KEY BLOCK-----
Я могу разобрать ключ publi c файл с Bouncy Castle в Java с PGPUtil.getDecoderStream()
, получая PGPPublicKeyRingCollection
и PGPPublicKey
, которые можно преобразовать в java.security.PublicKey
.
На стороне Python я пробовал использовать оба API cryptography.hazmat
и PyCrypto
, но не могут понять, как импортировать файл закрытого ключа. Когда я пытаюсь
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
И затем прочитав это через API Bouncy Castle, например:
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
класса, я пробовал их оба, но получил одинаковый результат.
Не похоже, что это должно быть так сложно, поэтому я пытаюсь выяснить, чего мне не хватает. Спасибо за любую помощь.