分享
 
 
 

《浅谈利用RSA算法防止非法注册机的制作》

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

《浅谈利用RSA算法防止非法注册机的制作》

RSA Demo 1.0源码下载

一: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的长度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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有