解密 OpenPGP 会话密钥
Decrypt OpenPGP Session Key
我有一个使用 GPG 加密的文件,我想从中提取会话密钥,这样我就可以单独解密会话密钥。我正在使用 Bouncy Castle 使用以下代码提取会话密钥:
private static void outputSessionKey(String path) throws FileNotFoundException, IOException {
BCPGInputStream input = new BCPGInputStream(PGPUtil.getDecoderStream(new FileInputStream(path)));
Packet packet;
while((packet = input.readPacket()) != null) {
if (packet instanceof PublicKeyEncSessionPacket) {
PublicKeyEncSessionPacket encPacket = (PublicKeyEncSessionPacket) packet;
byte[] encKey = encPacket.getEncSessionKey()[0];
FileOutputStream output = new FileOutputStream("session_key_enc.bin");
output.write(encKey);
output.close();
}
}
input.close();
}
然后我使用以下 OpenSSL 命令解密会话密钥:
openssl rsautl -decrypt -in session_key_enc.bin -out session_key_dec.bin -inkey private.pem -raw
我希望原始输出现在是解密的会话密钥,但我无法使用它来使用 --override-session-key 解密原始文件。
有没有人知道此设置可能出了什么问题?
我(至少)看到两件事应该出错。
(0) 您显然假设使用的密钥(和算法)是 RSA,这不是 PGP 和 GPG 使用的唯一加密算法。
(1) PublicKeyEncSessionPacket.getEncSessionKey()
的元素是 MPInteger.getEncoded()
的结果,即来自 rfc4880 sec 3.2 的 MPI 编码,其后是两个八位字节的位长由实际值八位字节。写入时,此值对于 RSA 解密来说应该太大,并且 rsautl -decrypt
应该给出错误,至少假设您使用的是正确的密钥。
(2) PGP 的 RSA 加密使用 PKCS1-v1_5(类型 02)填充。更正 (1) 后,您需要使用默认的 -pkcs
而不是 -raw
.
通过这些更改,它对我有用。请注意,根据 sec 5.1,RSA 加密密钥块 'm' 由 1 个八位字节对称算法、实际密钥和 2 个八位字节校验和组成;前两个用冒号分隔,第三个不包含在 GPG 的会话密钥中。
我有一个使用 GPG 加密的文件,我想从中提取会话密钥,这样我就可以单独解密会话密钥。我正在使用 Bouncy Castle 使用以下代码提取会话密钥:
private static void outputSessionKey(String path) throws FileNotFoundException, IOException {
BCPGInputStream input = new BCPGInputStream(PGPUtil.getDecoderStream(new FileInputStream(path)));
Packet packet;
while((packet = input.readPacket()) != null) {
if (packet instanceof PublicKeyEncSessionPacket) {
PublicKeyEncSessionPacket encPacket = (PublicKeyEncSessionPacket) packet;
byte[] encKey = encPacket.getEncSessionKey()[0];
FileOutputStream output = new FileOutputStream("session_key_enc.bin");
output.write(encKey);
output.close();
}
}
input.close();
}
然后我使用以下 OpenSSL 命令解密会话密钥:
openssl rsautl -decrypt -in session_key_enc.bin -out session_key_dec.bin -inkey private.pem -raw
我希望原始输出现在是解密的会话密钥,但我无法使用它来使用 --override-session-key 解密原始文件。
有没有人知道此设置可能出了什么问题?
我(至少)看到两件事应该出错。
(0) 您显然假设使用的密钥(和算法)是 RSA,这不是 PGP 和 GPG 使用的唯一加密算法。
(1) PublicKeyEncSessionPacket.getEncSessionKey()
的元素是 MPInteger.getEncoded()
的结果,即来自 rfc4880 sec 3.2 的 MPI 编码,其后是两个八位字节的位长由实际值八位字节。写入时,此值对于 RSA 解密来说应该太大,并且 rsautl -decrypt
应该给出错误,至少假设您使用的是正确的密钥。
(2) PGP 的 RSA 加密使用 PKCS1-v1_5(类型 02)填充。更正 (1) 后,您需要使用默认的 -pkcs
而不是 -raw
.
通过这些更改,它对我有用。请注意,根据 sec 5.1,RSA 加密密钥块 'm' 由 1 个八位字节对称算法、实际密钥和 2 个八位字节校验和组成;前两个用冒号分隔,第三个不包含在 GPG 的会话密钥中。