Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142055
  • 博文数量: 116
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-21 15:04
文章分类

全部博文(116)

文章存档

2014年(1)

2013年(13)

2012年(27)

2011年(49)

2010年(26)

分类: C/C++

2011-08-10 13:19:51

作者:



一、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
    *
    *
    * 本程序调用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 * * * 本程序调用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),使M2,软件中注册程序的关键代码: void CRSAApplicationDlg::OnReg() { // TODO: Add your control notification handler code here /* RSA Application 1.0 版 * 版权所有 (C) 2004 赵春生 * 2004.04.25 * * * 本程序调用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
    编译提示:

    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测试通过

      也可从我的个人主页下载。
      
      

    14:15 2004-4-26

    google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);


    最新评论

    简单爆破就可以了,把jnz改成je ( zhu_qingfen 发表于 2007-10-14 11:27:00)
     
    强! ( mc_ 发表于 2005-12-22 11:11:00)
     
    如果解密困難,修改程序來跳過必須注冊的部分,我想比解密還是要容易點。 ( cpunion 发表于 2004-6-23 10:52:00)
     
    现在是道高一尺,魔高一丈。对于高手来说,是没有破解不了的软件的。微软的操作系统你不也用的好好的吗?你付钱了吗? ( xqyz8888 发表于 2004-6-11 18:06:00)
     
    very good
    ( pdcqve 发表于 2004-6-11 1:00:00)
     
    顶一下
    ( yj_3000 发表于 2004-6-10 12:54:00)
     
    good, thanks ( jfu_router 发表于 2004-6-9 15:20:00)
     
    不错! ( shutle 发表于 2004-6-9 12:44:00)
     
    .......................................................
    阅读(578) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~