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,整理如下:
甲向乙发送机密数据信息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这一签名来冒充乙。在这里,乙向甲发送信息并进行签名,甲所拥有的也仅仅是乙的公钥来验证乙的签名。
结合数字签名的实例能更好得理解这一应用:在某一共享软件中,甲想用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(注册名),以决定注册是否通过。
//定义并初始化变量
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、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!");