首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PGP签名消息- Bouncycastle无法提取完整的原始一次传递签名与JcaPGPObjectFactory

PGP签名消息- Bouncycastle无法提取完整的原始一次传递签名与JcaPGPObjectFactory
EN

Stack Overflow用户
提问于 2020-08-24 17:40:48
回答 2查看 407关注 0票数 0

我有一个byte[],它包含一个完整的PGP签名消息,包括:一次传递签名、文字数据和签名。让我们假设这是此消息的表示:

代码语言:javascript
运行
复制
�
_�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。为了做到这一点,我遵循通常的咒语:

代码语言:javascript
运行
复制
PGPOnePassSignatureList onePassSignatureList = (PGPOnePassSignatureList) pgpObjectFactory.nextObject();
onePassSignatureList.get(0);

这应该给我一张通行证的签名。然后,我还使用类pgpObjectFactory JcaPGPObjectFactory继续读取消息的其余部分。问题是,我得到的是原始的PGP签名消息,带有不完整的一次签名:

代码语言:javascript
运行
复制
�
_�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

EN

Stack Overflow用户

回答已采纳

发布于 2020-08-24 23:30:43

分析您的消息是不可能的,因为作为文本处理的二进制数据被混淆和损坏,并且您没有显示您的代码。但是,PGP签名消息可以由onepass-签名包、文字数据包和签名包组成,这是正确的。注意,文字数据不仅仅是数据,它是还包含一些元数据。。特别是,您所关注的_CONSOLE是文件名字段的一个特殊值,而不是实际数据的一部分。

BouncyCastle PGPObjectFactory将其返回为PGPOnePassSignatureList PGPLiteralData (not byte[]) PGPSignatureList。使用在我的测试系统上签名的消息:

代码语言:javascript
运行
复制
$ 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]
$

此代码:

代码语言:javascript
运行
复制
    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));
        }
    }

给出这个输出:

代码语言:javascript
运行
复制
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
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63566061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档