我有一个byte[]
,它包含一个完整的PGP签名消息,包括:一次传递签名、文字数据和签名。让我们假设这是此消息的表示:
�
_�P��8��y_�(b__CONSOLE_C�}Lorem ipsum dolor sit amet�^_�}
_�P��8��y_�_�ց�� v_0:��^_�V=�ʙ
̡W_"_3�=_�8�8�/��g[;_"e_��_�"6�_�pJ���;��
我想将该消息读入相应的对象,即PGPOnePassSignature、byte[]和PGPSignature。为了做到这一点,我遵循通常的咒语:
PGPOnePassSignatureList onePassSignatureList = (PGPOnePassSignatureList) pgpObjectFactory.nextObject();
onePassSignatureList.get(0);
这应该给我一张通行证的签名。然后,我还使用类pgpObjectFactory
JcaPGPObjectFactory
继续读取消息的其余部分。问题是,我得到的是原始的PGP签名消息,带有不完整的一次签名:
�
_�P��8��y_Lorem ipsum dolor sit amet�^_�}
_�P��8��y_�_�ց�� v_0:��^_�V=�ʙ
̡W_"_3�=_�8�8�/��g[;_"e_��_�"6�_�pJ���;��
这显然是上面的代码片段,它不能完全恢复一次签名。
您可以很容易地看到包含_CONSOLE
的部分丢失了。字节数组大小为137恢复消息与153原始消息。
是否有可能完全恢复原始消息?
图书馆版本:
org.bouncycastle:bcpg-jdk15on:1.66
发布于 2020-08-24 23:30:43
分析您的消息是不可能的,因为作为文本处理的二进制数据被混淆和损坏,并且您没有显示您的代码。但是,PGP签名消息可以由onepass-签名包、文字数据包和签名包组成,这是正确的。注意,文字数据不仅仅是数据,它是还包含一些元数据。。特别是,您所关注的_CONSOLE
是文件名字段的一个特殊值,而不是实际数据的一部分。
BouncyCastle PGPObjectFactory
将其返回为PGPOnePassSignatureList PGPLiteralData (not byte[]) PGPSignatureList
。使用在我的测试系统上签名的消息:
$ od -tx1 zgpgs0
0000000 90 0d 03 00 08 11 81 e0 c1 00 62 85 ee 50 01 ac
0000020 10 62 02 79 31 5f 44 29 59 66 6f 6f 62 61 72 0d
0000040 0a 88 5e 04 00 11 08 00 06 05 02 5f 44 29 5a 00
0000060 0a 09 10 81 e0 c1 00 62 85 ee 50 5b 9d 01 00 da
0000100 6c d0 53 7b fb 21 1c df 5a 5d b1 05 d9 48 b6 37
0000120 79 56 16 73 dc bf a8 4d 37 cd a9 af bb f0 43 01
0000140 00 91 14 de 16 c5 41 b6 3d c4 f0 52 a9 1e d9 82
0000160 65 3e 65 a4 a5 03 c2 55 f1 46 27 c3 aa c4 12 5c
0000200 73
0000201
$ gpg --list-packets zgpgs0
:onepass_sig packet: keyid 81E0C1006285EE50
version 3, sigclass 0x00, digest 8, pubkey 17, last=1
:literal data packet:
mode b (62), created 1598302553, name="y1",
raw data: 8 bytes
:signature packet: algo 17, keyid 81E0C1006285EE50
version 4, created 1598302554, md5len 0, sigclass 0x00
digest algo 8, begin of digest 5b 9d
hashed subpkt 2 len 4 (sig created 2020-08-24)
subpkt 16 len 8 (issuer key ID 81E0C1006285EE50)
data: [256 bits]
data: [256 bits]
$
此代码:
JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(new FileInputStream(args[0]));
Object t; while( (t = pgpFact.nextObject()) != null ){
System.out.println (t.getClass().getName());
if( t instanceof PGPLiteralData ){
PGPLiteralData lit = (PGPLiteralData)t;
System.out.println("format="+ lit.getFormat());
System.out.println("filename="+lit.getFileName());
System.out.println("modtime="+lit.getModificationTime());
InputStream s = lit.getInputStream();
byte[] buf = new byte[1000]; int len = s.read(buf);
System.out.println("data:"+new String(buf,0,len,StandardCharsets.ISO_8859_1));
}
}
给出这个输出:
org.bouncycastle.openpgp.PGPOnePassSignatureList
org.bouncycastle.openpgp.PGPLiteralData
format=98
filename=y1
modtime=Mon Aug 24 20:55:53 UTC 2020
data:foobar
org.bouncycastle.openpgp.PGPSignatureList
https://stackoverflow.com/questions/63566061
复制相似问题