首页
社区
课程
招聘
有关RSA算法,还是有些地方搞不懂.[已解决]
2007-1-14 09:51 4110

有关RSA算法,还是有些地方搞不懂.[已解决]

2007-1-14 09:51
4110
对照HAPP的《Speed Video Splitter算法分析兼RSA实例教程 》分析我手头上的一个RSA算法。有些疑问,向大家请教。

1。大数在内存中存放的格式是怎么确定的?

还是跟进去看一下这个powmod函数:
{
004068F0 >/$>push ecx ; n
004068F1 |.>mov eax, [esp+C]
004068F5 |.>push esi
004068F6 |.>mov esi, [esp+C]
004068FA |.>push ecx ; n
004068FB |.>add ecx, 8
004068FE |.>mov dword ptr [esp+8], 0
00406906 |.>push ecx ; 10001
00406907 |.>push eax ; sn'
00406908 |.>push esi ; 计算结果存在此处
00406909 |.>call <_powmod> ; c =sn' ^ 10001 (mod n)
0040690E |.>add esp, 10
00406911 |.>mov eax, esi
00406913 |.>pop esi
00406914 |.>pop ecx
00406915 \.>retn 8
}


我手上的程序中的关键CALL和HAPP分析的程序中的call <_powmod>  函数代码一模一样,所以可以肯定是RAS了,也有E=10001的敏感数字。但是在用RSATOOL验证的时候,却没办法验证通过。因为参数压栈的格式好像不同。大数存放形式好像也不同。

我的程序中的call <_powmod> 的4个压栈参数是
miracl头文件中关于powmod(m,e,n,c);//计算c=m^e mod n

ESP ==>  0012EE24     0012EE64       ;c
ESP+4    0012EE28     0012EE4C       ;m
ESP+8    0012EE2C     0012EE44       ;e
ESP+C    0012EE30     0012EE54       ;n

m=d [[esp+4]]------>00A02620  10 25 A0 00 10 00 00 00  %?...
前4个字节是大数存放地址,也是我输入的M值,后面4个字节表示有16组32bit
e=d [[esp+8]]------>00A02600  60 25 A0 00 01 00 00 00  `%?...
前4个字节是大数存放地址,10001,后面4个字节表示有1组32bit
n=d [[esp+c]]------>00A02640  90 24 A0 00 10 00 00 00  ??...
前4个字节是大数存放地址,也是程序里面的N值,后面4个字节表示有16组32bit

这个跟miracl库中的powmod定义的不一样啊。我输入的M应该在esp+c中啊。

我在跟HAPP的教程时,发现他分析的那个程序中的大数存放地址和我这个完全是反的,大数的组数放在前面,指针地址放在后面,大数存放格式是Little Endian的,而我的好像不是。

N=88C5F181D34D4B6E5375F1511D455E8901127EB1F015E3AC717AE412C95841DF
00E949B0  DF 41 58 C9 12 E4 7A 71 AC E3 15 F0 B1 7E 12 01  吡X?潸q?鸨~
  00E949C0  89 5E 45 1D 51 F1 75 53 6E 4B 4D D3 81 F1 C5 88  ?EQ聃SnKM?衽
完全倒序了。

而我分析的程序里面的数据如下:
SN=532AC6364B45DE87...........3EC29795
00A02510  36 C6 2A 53 87 DE 45 4B  6?S?EK
00A02518  0F 47 3D A1 A6 F6 C8 5A  G=ˇ鋈Z
00A02520  64 E4 FD 5D 3E 06 C4 82  d潺]>?
00A02528  FC 45 03 D0 95 97 C2 3E  ???>

搞了好久了,哪个兄弟能指点一下?谢谢了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 220
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yugung 1 2007-1-14 10:10
2
0
1.根据调用powmod和敏感数字100001不能判定就是RSA
2.参数压栈方式和数据存储结构和Miracl不同可能是用了其他的大数运算库,可以用IDA分析一下。搞清到底使用了什么库,会简单一些;很多时候你只需要弄清楚程序的接口就行了
雪    币: 259
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
rufus 2 2007-1-14 10:15
3
0
就是因为IDA分析不出来啊,IDA找不到任何大数库的SIG。

我判断的依据是我分析的关键部分的代码和HAPP分析的程序的POWMOD那部分代码是100%相同的。

就算是不是使用了RSA算法,最少使用了POWMOD,我把跟踪的POWMOD的参数,数据,放到我自己写的POWMOD里面去验证,结果跟程序跑的结果不一样。
雪    币: 259
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
rufus 2 2007-1-14 11:11
4
0
呵呵,验证通过了,谢谢HAPP了,你的RSA系列的教程给了我很大的启发。每一篇都写得非常好。有时间再仔细看一看。

原因:N是固化在代码中的,没有用MOV指令赋值。在调用POWMOD前已经是Little Endian形式了。

还有,输入的SN已经是Little Endian格式,byte_to_big到内存中的。

是我自己没有理解好大数在内存中的存放形式造成的。写注册机的时候,只要把生成的M反转一下就是注册码了。

不过还是有一点,为什么M长度必须小于N?
我分析的这个程序恰好M的长度等于N。
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2007-1-15 16:34
5
0
最初由 rufus 发布
...不过还是有一点,为什么M长度必须小于N?
我分析的这个程序恰好M的长度等于N。
........

这是在GF(n)域上运算的要求。
建议你看看RSA方面的参考资料,以及数论的基础知识。
游客
登录 | 注册 方可回帖
返回