首页
社区
课程
招聘
RSA 2048 的 E
发表于: 2009-11-7 19:24 13485

RSA 2048 的 E

2009-11-7 19:24
13485
各位大大:分析一个软件一个周了,功力浅,软件注册是 RSA 2048位的, 在目标程序中看到了
D, N  找出 E 的 机会有多大?
对RSA第一次接触,谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (40)
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
一般来说e是公钥,d是私钥。
只知道n和e,在2048的情况下找到d基本不可能。
2009-11-7 19:40
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
把它的N,patch掉再自己算注册码,不然就直接爆破好了
2009-11-7 19:51
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
4
如果知道了N,D,那E有什么思路去搞定吗?
RSA公式是:
我的一个想法:
1、C=(M**d)%n
2、m=(c**e)%n
在目标程序中,看到了公式1的过程,我在公式1之前用一个M去调用(通过Patch内存),能得到C
然后,把E{2..65537}都跑一遍(公式2),如果m=M,那么E就是我们想找的。
这个思路可以吗,有没有不对?
前提是软件作者的定义的E小于65537。

费了好大劲,暴掉真有点不甘心:)
2009-11-7 20:19
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
刚才还看错了,你居然找到了D,E小于65537的话穷举就行了
C=m^e mod n
m=c^d mod n
把N和D发上来看看
2009-11-7 21:54
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
6
我也不能确定:感觉可能是软件作者算法使用问题
D:251093920138545922957428345425986187018379391680658325597208001586587082336209006483792733611868783274894824108564516616502650285636441545385283114632057693558700630149188666293115105220397417877877043140397229482871062720925330665155131419980275911241140161960933672256473450313022833904050367704043644185145463952219275014803282716883335677667469114089112041993223733319724281471769399761823629551042365626333225281691643131618313998088254354745362544245336698857997708190064878066129080140447829183188806927780437695837077042541778002957481446192994806259985210143179008015138950407379667。

N:910967664179759045529932538155797064409433244729456820816954238732820037728736266019624824030297522436162594303063564362304511537109338351673819598252874100284451724272462199810305492930902303077645209189639525370608072447987764975873583010657111705896345281041457722837371963022245340260618592689309888097782344280128709880045755815916053608312847870445253471595642719474146255126830060167773750633001383831275719999192640879472841280731113621666470954399315445947410528949885986112814706004693482273623817057770842907413044075101173359128336872576132362291767751578567571474102475300622089。

“E小于65537的话穷举就行了”
怎么样穷举?是我说的思路吗?
谢谢呀:)
2009-11-7 22:18
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
N,D都不是素数,所以很有可能的确是D和N
思路的话很简单:
方法1:
1) m=随机数,c=m, i=0;
2) c=c^d mod n, i++
3) if c!=m jmp 2)
方法2:
用离散对数的方法计算到e<2^60是可以的
比较复杂(略)
2009-11-7 22:27
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
嘎嘎!!!谢谢撒,回去试试,搞出来大家分享:)
2009-11-7 22:33
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
9
lingyu :
把你的200帖给我吧。
没搞明白:
1) m=随机数,c=m, i=0;
2) c=c^d mod n, i++
3) if c!=m jmp 2)
//伪码如下:
//=========================
int m=c=12345,i=0;
BigInt d,n;
  Base10strToBigInt(D,d);
  Base10strToBigInt(N,n);
  while(1)
        {
            c=c^d mod n;     //???这句怎么理解, 数学知识吗?
            i++;
            if (c==m) break;
        }
   printf( i )       // i 就是我们找的吗?还是 c 呢?

//=========================

对RSA算法了理解太浅了,谢谢指点呀:)
2009-11-7 22:52
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
c=c^d mod n; // c的d次方对n求模,有通用函数库可以直接调用的
i就是e
2009-11-7 23:08
0
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
http://bbs.pediy.com/showthread.php?t=88882
这是我曾经写的一个模拟程序,前提是你所说的e很小,不然暴破不可能。
实际上运算中有很多技巧,我的代码中都包含了。
2009-11-8 10:23
0
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
有些库函数包括了我写的那个程序的一些操作,可以无视
2009-11-8 10:26
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
13
To:lingyu
再次请教,基于您说的方法所做的测试:

取RSA 小数如下:
p=47
q=59

n=2773
d=847
e=63

M=244
//========
用Big Integer Calculator v1.12 验证

公式1:
C=244^63 mod 2773
C=1085
(加密)

公式2:
m=1085^847 mod 2773
m=244
(正常解密)
//========
下面用FGint验证解密算法

procedure TForm1.Button1Click(Sender: TObject);
var
  C, D, N, t: TFGInt;
  i: integer;
  CC,MM: string;       
begin
  i := 0;
  CC:='244';
  MM:='244';//C=M=随机数,这里取244
  Base10StringToFGInt(CC, C);  
  Base10StringToFGInt('847', D);
  Base10StringToFGInt('2773', N);
  while (true) do
  begin
    FGIntModExp(C, d, n, t);
    FGIntToBase10String(t, CC);
    if CompareText(cc, MM) = 0 then
      Break;
    Base10StringToFGInt(CC, c);
    Inc(i);
    edit11.Lines.Add(IntToStr(i-1)+':'+cc);
  end;
  ShowMessage(IntToStr(i));      //这里e=i=153。但原始e应该是63呀, 是不是算法有问题?

  FGIntDestroy(c);
  FGIntDestroy(D);
  FGIntDestroy(N);
  fgintdestroy(t);
end;


To:Erex
源码干脆看不明白,基础太差了。:(,谢谢您
2009-11-8 12:18
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
抱歉,我的失误!
temp=m^d mod n;
c=1;
while(1)
{
c=temp*c mod n;
i++;
if (c==m) break;(设m=2比较会快点)
}
printf( i )
例:
i       244^(i*847) mod 2773
1        465
2        2704
3        1191
4        1988
.
.
.
53        2574
54        1747
55        2639
56        1469
57        927
58        1240
59        2589
60        403
61        1604
62        2696
63        244
2009-11-8 13:33
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
15
跑了几个小时了,到6402999了,看来希望不大了:(
2009-11-8 18:24
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
我刚刚也试了下,1000000以下不行
试试用离散对数的方法吧
2009-11-8 18:33
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
17
离散对数?有工具吗?或是简单的方法。
如果是高深的数学知道,那我就别想了:(
大学的知识都还给老师了,一直惦记着回去要学费呢,嘎嘎:)
2009-11-8 18:45
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
www.alpertron.com.ar/DILOG.HTM
google找下就行Discrete logarithm calculator,
自己动手的话也只能穷举到2^60或者再多点,算法简单但效率不高(效率高的麻烦)。
2009-11-8 18:54
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
19
7971999 了,跑到8位数收工

http://www.alpertron.com.ar/DILOG.HTM

这个网址中的
base
power
mod
怎么填写呀?
对应 C ,D, N 吗?
2009-11-8 19:17
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
base=2^d=223938721183765653884231596109083970712325550254355063497013528381788244794039038016161566975672129433598439870924960647729413130572355242754309348492583872394212038283361213704704835357619389973632663476294128358603636903677855776310199204558679772422013974455718117905791078092625147183814210056158674802348760230217293128203303896993905117919951879256503366847036460669610103555117043661641538357800494086438162708720145657474553496632899185547406541536748983138217879931912893377813204348851343870470560029337841844667296890996239160820729851630032828648638192635987658105261778371802241 mod n
power=2
(这里设m=2)
2009-11-8 19:31
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
21
base:223938721183765653884231596109083970712325550254355063497013528381788244794039038016161566975672129433598439870924960647729413130572355242754309348492583872394212038283361213704704835357619389973632663476294128358603636903677855776310199204558679772422013974455718117905791078092625147183814210056158674802348760230217293128203303896993905117919951879256503366847036460669610103555117043661641538357800494086438162708720145657474553496632899185547406541536748983138217879931912893377813204348851343870470560029337841844667296890996239160820729851630032828648638192635987658105261778371802241
power:2
mod: N
是这样吗?

另:base=2^D 你用什么算出来的?
我用Big integer Calculator v1.12 提示 Over Sized...
谢谢:)
2009-11-8 19:49
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
是这样,若base^e=(2^d)^e=2 mod n,
则2^ed =2 mod n, 有极大的概率ed=1 mod (p-1)(q-1),其中n=pq.
base=2^D mod N(注意不是单2^D,还要对N求模),
应该不会溢出的吧,如果只计算2^D肯定要溢出的
2009-11-8 20:10
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
23
9952999 了,快到8位了。

“注意不是单2^D”  我的确是这么做的:)

用离散对数方法与我们目前用的方法比较起来概率能大多少?
2009-11-8 20:25
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
2^24=16,777,216>10,000,000,
所以2^60是一个很大的数。
但e>2^70是基本上不可能算出的
www.alpertron.com.ar/DILOG.HTM
In this version of the discrete logarithm calculator only the Pohlig-Hellman algorithm is implemented……
Pohlig-Hellman在n可被分解的情况下才有效,所以不用在这个网站试了。
要用Baby-Step Giant-Step Algorithm才有效
2009-11-8 20:36
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
25
到 11226999 了,数学基础太弱,不继续玩了,patch吧:)

这软件作者也真太~~~选这么大的 E。软件才35元。

回头上篇暴文:)。

还有问题要请教一下:
软件可以通过Patch COde方法来强跳转实现注册。针对RSA保护的程序,patch N 来做注册机这怎样理解呢?
C=M^e mod N
m=C^d mod N

如果只是patch N了,那E 在哪呢?还是没有呀,怎么做注册机呢?
是不是要自己生成 E ,D ,N,然后 软件中的 D 和N 都patch掉呢?

谢谢!
2009-11-8 21:00
0
游客
登录 | 注册 方可回帖
返回
//