不容易啊!用了两百多个小时,终于把384位的大数都分解出来。
A Speeder 的注册算法中包括两次RSA操作,
第一次RSA的模N1为:
A7456C12309EAF6BEF610A5B1F408D62B4AF7775E167656C236BC3B8D77F587E92D80DB14AC83281(320 Bits);
第二次RSA的模N2为:
C985F97A3C4E0D3BF7D35DC4148E5C47749076D668CA8464A6D2CCFB1B26183623315E5450610784D974ED5E9702A451(384 Bits)。

工具:msieve 1.48 + 默认参数
环境:处理器:DualCore Intel Pentium E5300, 2633 MHz
         内存:Kingston   2 GB DDR2-800
运行时:CPU占用50%,内存占用由开始的几十M到后来的一百五十M左右

分解结果:
第一次:
Public Exponent(E)[Hex]: D0330A59
Modulus(N): A7456C12309EAF6BEF610A5B1F408D62B4AF7775E167656C236BC3B8D77F587E92D80DB14AC83281 (320 bits)
1395660439721015270126240845153599129950924567822737384396748786425066836865869715998909791744641 (97 digits)
1st Prime(P): B9ACE5158C6DF974656CC7B9AB55B4BE587BECE1
2nd Prime(Q): E6A00E0E0F2B1EAC015ECE4747BE2782513E59A1
Private Exponent(D): 70F9DBA8CE783C0EAE3A919CF19375555DFBFAA44B1829A87F5E22D89364CC7A4397CAA2444181E9

耗时:03:24:53

第二次:
Public Exponent(E)[Hex]: D0330A59
Modulus(N): C985F97A3C4E0D3BF7D35DC4148E5C47749076D668CA8464A6D2CCFB1B26183623315E5450610784D974ED5E9702A451 (384 bits)
31017280513987652525152470475453447548754507323789647108338589020372858265164301167949291293516476040979435659371601 (116 digits)
1st Prime(P): E23A4A70ABBBFBD3D355386C3BECFB780327972E121731D9
2nd Prime(Q): E40B6214CB1475663200AE630875649A059CE05EAF7B0339
Private Exponent(D): 70A886ACC2BB10A2A668B4497012873DBE0F92B92481EF922E0E6FE70EE9AEBBFA11D83CEFA47D92612F14BEC1DA02E9

耗时:208:46:36


注册算法(00404E1F到00405188之间)的C伪代码如下:

代码:
 N = 0;
  E = 0;
  X1 = 0;
  X2 = 0;
  C = 0;
  sprintf(&out, "%X", 0xD0330A59u);
  zhsread(&out, (int)&E);
  sprintf(&out, "%X", 0xA7456C12u);
  sprintf(&v14, "%X", 0x309EAF6Bu);
  sprintf(&v15, "%X", 0xEF610A5Bu);
  sprintf(&v16, "%X", 0x1F408D62u);
  sprintf(&v17, "%X", 0xB4AF7775u);
  sprintf(&v18, "%X", 0xE167656Cu);
  sprintf(&v19, "%X", 0x236BC3B8u);
  sprintf(&v20, "%X", 0xD77F587Eu);
  sprintf(&v21, "%X", 0x92D80DB1u);
  sprintf(&v22, "%X", 0x4AC83281u);
  zhsread(&out, (int)&N);
  sprintf(&out, "%08X", *(_DWORD *)arglist);
  Encrypt(&out, (int)&C);
  zexpmod(C, E, N, (int)&X1);
  Decrypt(&out, X1);
  strcat(&out, "ABSQ2009");
  Encrypt(&out, (int)&X1);
  sprintf(&out, "%X", 0xC985F97Au);
  sprintf(&v14, "%X", 0x3C4E0D3Bu);
  sprintf(&v15, "%X", 0xF7D35DC4u);
  sprintf(&v16, "%X", 0x148E5C47u);
  sprintf(&v17, "%X", 0x749076D6u);
  sprintf(&v18, "%X", 0x68CA8464u);
  sprintf(&v19, "%X", 0xA6D2CCFBu);
  sprintf(&v20, "%X", 0x1B261836u);
  sprintf(&v21, "%X", 0x23315E54u);
  sprintf(&v22, "%X", 0x50610784u);
  sprintf(&v23, "%X", 0xD974ED5Eu);
  sprintf(&v24, "%X", 0x9702A451u);
  zhsread(&out, (int)&N);
  Encrypt(register, (int)&C);
  zexpmod(C, E, N, (int)&X2);
  Decrypt(&out, X2);
  RegFlag = zcompare(X1, X2) == 0;
  zfree(&N);
  zfree(&E);
  zfree(&X1);
  zfree(&X2);
  zfree(&C);
  if ( RegFlag )
具体的代码分析在附件里,当然也可以参考风间仁同学的《A变速器算法分析》http://bbs.pediy.com/showthread.php?t=46263
《A变速器算法分析》里的fun1和fun2其实是加密和解密对,另外就是老版本的连接字串是“ASPEEDER”,新版本的是“ABSQ2009”。


Word文档 A Speeder 注册机.doc