首页
社区
课程
招聘
[求助]我们论坛上的大数运算库bigint, RSA运算值和openssl不一致!
发表于: 2012-6-12 17:29 8923

[求助]我们论坛上的大数运算库bigint, RSA运算值和openssl不一致!

2012-6-12 17:29
8923
我发现Openssl与Bigint, 用相同的RSA密钥, 对相同的值签名, 产生的签名值, "不一致"!

如果用 Bigint 对 Openssl 的签名值进行验证运算, 产生很奇怪的结果:

  "低字节部分和用于验证的散列值相同, 高字节部分应该是0, 可被一些0xFF填充了"

  这是正确的值:
  0x5EDB5A5B, 0x26640474, 0x7EAEFD5C, 0xA9EAE5E1, 0x6BDB2ACF,

  这是bigint给出的值(低字节部分相同):
  0x5EDB5A5B, 0x26640474, 0x7EAEFD5C, 0xA9EAE5E1, 0x6BDB2ACF,
  0x5000414,  0xE03021A,  0x906052B,  0x302130,   0xFFFFFFFF,
  0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
  0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
  0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
  0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
  0xFFFFFFFF, 0x1FFFF,

我想可能是个小bug, 让本来应该设置为0的高字节, 被致了一些乱码. 我追踪到 "蒙哥马利算法求模乘函数" 可我看不懂源码.

详细代码见附件! 真希望论坛上有能看懂 bigint 中模乘函数代码的, 急死我了

=============
我为Bigint添加了2个函数(WriteTo, ReadForm), 用于读入和写出按 ASN1 格式的大数.

cl a.cpp bigint.cpp /EHsc /nologo

openssl rsa -in rsa-key.pem -text

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
openssl DSA签名验证有效。 为什么RSA??
奇怪, DSA也使用了模幂算法。
2012-6-15 22:56
0
雪    币: 260
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
发现我的问题就是关于rsa的;你的问题我想是由于openssl在签名时,对原始数据附加了一些其他数据,打印出的字节数据我看了,估计紧挨着数据后的0x14表示数据长度,然后0x400表示1024位,其他数据表示什么意思就不清楚了;如果你用openssl签名时可以选择"NO_PADDING",估计和你用BitInt库的结果就完全对得上了。
2012-6-16 12:31
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢! 真没想到还有 “数据补齐方式” 一说。

搜了一下:
Usage: rsautl [options]
-in file        input file  (输入准备要进行加密或解密的文件)
-out file       output file  (输出加密或解密后的文件)
-inkey file     input key  (输入密钥文件)
-keyform arg    private key format - default PEM (指定密钥文件格式)
-pubin          input is an RSA public (说明输入的是公钥)
-certin         input is a certificate carrying an RSA public key (指明输入的是一个证书)
-ssl            use SSL v2 padding  (数据补齐方式,默认是pkcs)
-raw            use no padding   (数据补齐方式,默认是pkcs)
-pkcs           use PKCS#1 v1.5 padding (default) (数据补齐方式,默认是pkcs)
-oaep           use PKCS#1 OAEP   (数据补齐方式,默认是pkcs)

-sign           sign with private key  (进行数字签名,即使有私钥加密)
-verify         verify with public key  (进行数字签名验证,即使有公钥解密)
-encrypt        encrypt with public key (进行解密操作)
-decrypt        decrypt with private key  (进行解密操作)
-hexdump        hex dump output  (输出十六进制格式)
-engine e       use engine e, possibly a hardware device.
-passin arg    pass phrase source  (口令参数)
2012-6-18 18:02
0
游客
登录 | 注册 方可回帖
返回
//