找回密码
 立即注册

QQ登录

只需一步,快速开始

1401软件论坛总版规【新人必看】如何正确发布收费帖子加入vip系统学习仅需498元免费获得1401软件安全论坛vip开通本站VIP会员请联系QQ 564853771
论坛纪念优盘Beyond EXE超强加密器V1.61401论坛破解工具包 2017-9-12[破解班vip]入门篇[破解班vip]基础篇
[破解班vip]脱壳篇[破解班vip]实战篇[破解班vip]网络验证篇[破解班vip]零基础HOOK教程[破解班vip]零基础易语言入门
[破解班vip]零基础c语言入门[破解班vip]零基础Delphi编程入门[破解班vip]寒假培训课程共7课[破解班vip]破解提高篇[破解班vip]易语言培训课程
[破解班vip]核心技术培训篇[破解班vip]pe格式与pe操作[破解班vip]2022全新封包-山寨-爆破全系列[原创课程]c++单文档框架课程[逆向班vip]汇编语句与反汇编基础
[逆向班vip]全自动扫雷辅助[逆向班vip]手机模拟按键[逆向班vip]植物大战僵尸辅助广告位招租...付费破解软件 +Q 564853771
查看: 3263|回复: 0

【破解基础——利用RSA算法防止非法注册机的制作】

[复制链接]
  • TA的每日心情
    开心
    2016-12-31 19:24
  • 签到天数: 148 天

    [LV.7]常住居民III

    335

    主题

    380

    回帖

    1693

    积分

    版主

    【KingSolomon】

    UID
    972
    元宝
    340
    威望
    458
    贡献
    19
    信誉值
    0
    精华
    17
    在线时间
    179 小时
    注册时间
    2014-5-16
    最后登录
    2017-1-4
    违规
    0
    积分
    1693

    最佳新人活跃会员热心会员灌水之王论坛元老吾爱富翁工具大师已有小成

    QQ
    发表于 2014-5-25 19:19:59 | 显示全部楼层 |阅读模式
    Ȧ
    本帖最后由 KingSolomon 于 2014-5-25 20:34 编辑

    一:RSA简介。

      RSA公开密钥密码系统是由R.Rivest,A.Shamir,L.Adleman提出的,不仅仅可用于数据的加密,也可用于数字签名,其算法如下:

      1,取两个相近的大素数p、q;
      2,计算n=p*q,z=(p-1)*(q-1);
      3,任取一个与z互素的整数e;
      4,计算满足e*d=1 mod z 的整数d;
      5,将明文m分成字符块s加密,每个块s小于n。现设明文m小于n,加密后形成密文c。 加密、解密过程如下:

      加密:c=m^e mod n
      解密:m=c^d mod n

      6,(n,e)和(n,d)分别称为“公开密钥”和“秘密密钥”。根据Euler定理可得:

      m=c^d mod n=(m^e mod n)^d mod n=m

      现举例说明其工作过程:取两个素数p=11,q=13,n=p*q=11*13=143,z=(p-1)*(q-1)=(11-1)* (13-1)=120,再选取与z=120互素的整数e,如e=7,现可计算出满足7*d=1 mod 120的整数d=103,即:7*103=1 mod 120,7*103/120余1,整理如下:

      p=11
      q=13
      n=143
      e=7
      d=103
      (n,e)=(143,7)
      (n,d)=(143,103)

      以数据加密为例:

      甲向乙发送机密数据信息m=85,并已知乙的公钥(n,e)=(143,7),于是可计算出:
    c=m^e mod n=85^7 mod 143=123
    甲将c发送至乙,乙利用私钥(n,d)=(143,103)对c进行计算:
    m=c^d mod n=123^103 mod 143=85
    现乙已经得到甲向其要发送的机密数据信息。在这里,甲向乙发送信息,甲所拥有的仅仅是乙的公钥。




      以数字签名为例:

      乙要向甲发送信息,并要让甲确信此信息是由乙本人所发出的,于是,乙将能代表自己身份的编码值(如:123),利用私钥(n,d)=(143,103)进行计算,并将结果发送给甲:
    m=c^d mod n=123^103 mod 143=85
    甲接受到乙的数字签名后利用乙的公钥(n,e)=(143,7)进行计算,得出代表乙身份的编码:
    c=m^e mod n=85^7 mod 143=123
    现甲经过验证已确信信息的发送方为乙。因为只有乙拥有私钥(n,d),来对代表自己身份的编码123进行计算。在不知道乙私钥(n,d)的情况下,任何人都不会算出85这一签名来冒充乙。在这里,乙向甲发送信息并进行签名,甲所拥有的也仅仅是乙的公钥来验证乙的签名。

      从上面两个例子中我们可以更好得理解这一结论,即:由(n,e)加密的数据只能用(n,d)解密,反之亦然。


    二:在基于序列号保护的共享软件中应用RSA。

      结合数字签名的实例能更好得理解这一应用:在某一共享软件中,甲想用123为注册名进行软件注册,他现在拥有的仅仅是存在于共享软件程序中的公钥 (n,e)=(143,7)。甲现将123为注册名向乙提出注册申请,乙得知此申请并通过此申请后,便利用所拥有的私钥(n,d)对注册名123进行计算:
    m=c^d mod n=123^103 mod 143=85
    甲得到计算后的结果85(序列号),提供给共享软件的注册程序进行计算:
    c=m^e mod n=85^7 mod 143=123
    然后注册程序将判断计算结果c是否为123(注册名),以决定注册是否通过。

      如果甲随意输入一组序列号利用公钥(n,e)进行计算,那他得到的结果将不是123,注册也就失败了。注意,在这里,共享软件的注册程序比较的是注册名,而不是序列号。如果甲跟踪注册程序得到了他所随意输入的序列号所产生的注册名,将其提供给注册程序,那注册程序也能够通过注册,但他由于没有 (n,d),所以他无法用自己的注册名进行软件注册,也就防止了非法注册机的制作。

      将RSA应用于此的目的仅仅是防止非法注册机的制作,在以上描述中,n=143,包括以下Demo中的 n(HEX)=963251DC5A9C90D9F203A03C363BA411,以现在的计算机处理速度,能很快地将其因式分解得到相应的p,q,再结合暴露在共享软件注册程序中的e,从而计算出d,那么这个共享软件的保护就完全被破解了。解决的方法是要避免n过短,以及结合MD5等加密算法……


    三:具体实践。

    /* RSA Demo 1.0 版
    * 版权所有 (C) 2004 赵春生
    * 2004.04.25
    * http://timw.yeah.net
    * http://timw.126.com
    * 本程序调用Miracl ver 4.82大数运算库,详见其附带手册。
    * P,Q,N,D,E使用RSATool2生成。
    */


    1,注册机的关键代码:

    void CKeyGenDlg::OnGen()
    {
    // TODO: Add your control notification handler code here

    /* KeyGen 1.0 版
    * 版权所有 (C) 2004 赵春生
    * 2004.04.25
    * http://timw.yeah.net
    * http://timw.126.com
    * 本程序调用Miracl ver 4.82大数运算库,详见其附带手册。
    */

    //////////////////////////////////////////////////////////////////////////

    //P(HEX)=E34436F5F48A227B
    //Q(HEX)=A92FA24467C4E3E3
    //N(HEX)=963251DC5A9C90D9F203A03C363BA411
    //D(HEX)=56157D29A89D77BF2F669A8F0B123CC9
    //E(HEX)=10001
    //Keysize(Bits)=128

    UpdateData(TRUE);

    int namelen=m_name.GetWindowTextLength (); //获取Name的长度

    //务必满足:Name的长度<=(Keysize/8),使M<N成立。
    if (namelen!=0&&namelen<=16) //如果不为空且<=128/8则开始计算SN
    {
    miracl *mip=mirsys(100,0);
    mip->IOBASE=16; //16进制模式

    //定义并初始化变量
    big m=mirvar(0); //m 放明文:注册码SN
    big c=mirvar(0); //c 放密文:用户名Name
    big n=mirvar(0); //n 模数
    big d=mirvar(0); //d 私钥
    TCHAR Name[256]={0};
    TCHAR SN[256]={0};

    m_name.GetWindowText (Name,namelen+1); //获取Name
    bytes_to_big(namelen,Name,c); //转换成16进制
    cinstr(n,"963251DC5A9C90D9F203A03C363BA411"); //初始化模数n
    cinstr(d,"56157D29A89D77BF2F669A8F0B123CC9"); //初始化私钥d
    powmod(c,d,n,m); //计算m=c^d mod n
    cotstr(m,SN); //将m以16进制串写入SN
    m_sn.SetWindowText (SN); //输出16进制SN

    //释放内存
    mirkill(m);
    mirkill(c);
    mirkill(n);
    mirkill(d);
    mirexit();
    }
    else
    m_sn.SetWindowText ("Error: Invalid registration name.");


    UpdateData(FALSE);
    }


    2,软件中注册程序的关键代码:

    void CRSAApplicationDlg::OnReg()
    {
    // TODO: Add your control notification handler code here

    /* RSA Application 1.0 版
    * 版权所有 (C) 2004 赵春生
    * 2004.04.25
    * http://timw.yeah.net
    * http://timw.126.com
    * 本程序调用Miracl ver 4.82大数运算库,详见其附带手册。
    */

    //////////////////////////////////////////////////////////////////////////

    //P(HEX)=E34436F5F48A227B
    //Q(HEX)=A92FA24467C4E3E3
    //N(HEX)=963251DC5A9C90D9F203A03C363BA411
    //D(HEX)=56157D29A89D77BF2F669A8F0B123CC9
    //E(HEX)=10001
    //Keysize(Bits)=128

    UpdateData(TRUE);

    miracl *mip=mirsys(100,0);
    mip->IOBASE=16; //16进制模式

    //定义并初始化变量
    big m=mirvar(0); //m 放明文:注册码SN
    big c=mirvar(0); //c 放密文:用户名Name
    big n=mirvar(0); //n 模数
    big e=mirvar(0); //e 公钥
    TCHAR Name[256]={0};
    TCHAR SN[256]={0};
    TCHAR temp[256]={0};
    int len=0;
    int i,j;

    //获取Name
    len=m_name.GetWindowTextLength ();
    m_name.GetWindowText (Name,len+1);

    //获取SN
    len=m_sn.GetWindowTextLength ();
    m_sn.GetWindowText (SN,len+1);

    //检查SN是否为16进制
    for (i=0,j=0;i<len;i++)
    {
    if(isxdigit(SN)==0)
    {
    j=1;
    break;
    }
    }

    //如果输入的SN为16进制且长度不为0
    if (j!=1&&len!=0)
    {

    cinstr(m,SN); //初始化明文m
    cinstr(n,"963251DC5A9C90D9F203A03C363BA411"); //初始化模数n
    cinstr(e,"10001"); //初始化公钥e

    //当m<n时
    if(compare(m,n)==-1)
    {
    powmod(m,e,n,c);//计算c=m^e mod n
    big_to_bytes(256,c,temp,FALSE);//将c转换成数组写入temp

    //释放内存
    mirkill(m);
    mirkill(c);
    mirkill(n);
    mirkill(e);
    mirexit();
    }
    else
    j=1;

    }


    //对Name、temp, m、n, SN的长度进行检查
    if(lstrcmp(Name,temp)!=0||j==1||len==0)
    MessageBox("Please check your NAME and SN, then try again.","RSA Application");
    else
    MessageBox("Congratulate!!!","Registration complete!");

    UpdateData(FALSE);

    }

    //////////////////////////////////////////////////////////////////////////////////

    编译提示:

    1:将Project-Settings-Settings For(All Configuration)-C/C++中Category项的
    Precompiled Headers设置成:Automatic use of precompiled headers。

    2:将ms32.lib添加到工程中。

    3:MIRACL是C库。

    extern "C"
    {
    #include "miracl.h"
    #include "mirdef.h"
    }

    #pragma comment( lib, "ms32.lib" )


    四:以上代码在Win2000P+SP4 + VC6+SP5测试通过。
      RSA Demo 1.0源码可从我的个人主页下载。
      http://timw.yeah.net
      http://timw.126.com
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|1401软件安全 ( ICP备16034480号 )

    GMT+8, 2024-12-27 11:08 , Processed in 0.163996 second(s), 26 queries , Gzip On.

    Powered by Discuz! X3.5

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表