C++实现RSA加密解密算法是示例代码_第1页
C++实现RSA加密解密算法是示例代码_第2页
C++实现RSA加密解密算法是示例代码_第3页
C++实现RSA加密解密算法是示例代码_第4页
C++实现RSA加密解密算法是示例代码_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++实现RSA加密解密算法是示例代码目录一、什么是RSA算法1.对称加密2.非对称加密3.非对称加密的应用二、RSA算法的基础操作步骤1.生成公钥和私钥2.用公钥加密信息3.用私钥解密信息三、AC代码四、RSA算法的测试

一、什么是RSA算法

在计算机中常用的加密算法分为两类:对称加密算法和非对称加密算法。

1.对称加密

在对称加密技术中,对信息的加密和解密都使用了相同的密钥Key,也就是说使用同一个密钥Key对数据进行加密和解密。这种加密方法可简化加解密的处理过程,信息交换双方都不必彼此研究和交换专用的加解米算法。如果在交换阶段,密钥Key没有泄露,那么加密数据的机密性和报文的完整性就可以得到保证。

2.非对称加密

在非对称加密中,不再只有一个密钥Key了。在非对称加密算法中,密钥被分解为一对,一个称为公开密钥,另一个称为私有密钥。对于公钥,可以通过非保密方式向他人公开,而私钥则由解密方保密,不对别人公开。

3.非对称加密的应用

由于非对称加密方式可以使通信双方无需事先交换密钥就可以建立安全通信,因此被广泛应用于身份认证、数字签名、等信息交换领域。其中最具有代表性的非对称加密方式就是RSA公钥密码体制。

二、RSA算法的基础操作步骤

1.生成公钥和私钥

生成公钥PK和私钥SK的步骤如下:

(1)随意选择两个大的素数P、Q,P不等于Q。

此处在算法实现中需要快速的判断P、Q是否为素数,代码如下:

llprimeNum(llnum)//判断素数

if(num==1||num==0)

return0;

for(inti=2;i*i=num;i++)

if(num%i==0)

//不是素数返回0

return0;

return1;//是素数返回1

}

(2)将P、Q两个素数相乘得到一个N,即N=PQ

(3)将P、Q分别减一,再相乘,得到一个数T,即T=(Q-1)*(P-1)

(4)选择一个整数E,作为一个密钥,使E与T互质(即E与T的最大公约数为1),且E必须小于T

此处在算法实现中需要对E与T进行互质的判断(最大公约数为1)

//判断两个数是否互素

llcoprime(lla,llb)//判断互质

llt;

if(ab)

t=a;

a=b;

b=t;

while(a%b)

t=b;

b=a%b;

a=t;

//返回值为1,则a,b互素

returnb;

}

(5)根据公式DEmodT=1,计算出D的值,作为另一个密钥。

此时根据算法,逆向求D

d=1;

//求e的乘法逆

while(((e*d)%t)!=1)

d++;

(6)通过以上的步骤就可以求出N,E,D这三个数据,其中(N,E)作为公钥,(N,D)作为私钥。

(7)生成公钥和私钥后,就可以对外发布了,其中RSA算法的详细的流程图如下:

2.用公钥加密信息

发送信息的一方收到公钥PK后,就可以通过公钥PK对数据进行加密,加密的操作步骤如下图所示,其中明文为:M,密文为:C

明文:M

加密:

密文:C

其中加密的算法,先进行密文的取余运算在加密,代码如下:

//计算密文

llcandp(llb,llp,llk)//b--明文或密文p--指数(e/d)k--模数

if(p==1)

returnb%k;

if(p==2)

returnb*b%k;

if(p%2==0)

llsum=candp(b,p/2,k);

returnsum*sum%k;

if(p%2==1)

llsun=candp(b,p/2,k);

returnsun*sun*b%k;

}

在进行加密运算

llencryption()

lln,e,x,y;

cout"请输入公钥(e,n)"endl;

cinen;

cout"请输入明文:(明文需小于"n")"endl;//计算密文

cinx;

y=candp(x,e,n);

cout"密文为:"yendl;

return0;

3.用私钥解密信息

接收方持有私钥(N,D)在接受到密文C后,既可以通过私钥解密,得到明文M,解密过程如下:

密文:C

解密:

明文:M

其中解密算法,先产生密钥Key算法:

llkey()

llp,q,t,n,e,d;

cout"请输入两个素数p,q:"endl;//输入两个素数q,p

cinpq;

if(primeNum(p)==0||primeNum(q)==0)

cout"输入的p或q不是素数"endl;

return0;

n=p*q;

//t为n的欧拉函数

t=(p-1)*(q-1);

cout"请输入密钥e:"endl;

cine;

d=1;

//求e的乘法逆

while(((e*d)%t)!=1)

d++;

cout"n=p*q="nendl;

cout"t=(p-1)*(q-1)="tendl;

cout("公钥(e,n)为:(")e","n")"endl;

cout("私钥(d,n)为:(")d","n")"endl;

return0;

}

在进行解密:

lldecode()

lln,d,x,y;

cout"请输入私钥(d,n)"endl;

cindn;

cout"请输入密文:";//计算密文

ciny;

x=candp(y,d,n);

cout"明文为:"xendl;

return0;

三、AC代码

新建一个头文件RSA.h

#pragmaonce

#includestdio.h

#includeiostream

#includestdlib.h

#includealgorithm

#includecmath

usingnamespacestd;

typedeflonglongll;

//判断素数

llprimeNum(llnum);

//判断互质

llcoprime(lla,llb);

//计算密文

llcandp(llb,llp,llk);

//生成密钥

llkey();

llencryption();

lldecode();

//菜单

voidmenu();

将函数写在RSA.cpp中,用于主函数RSA()的调用代码如下:

#define_CRT_SECURE_NO_WARNINGS1

#include"RSA.h"

voidmenu()

printf("------------------------------------------\n");

printf("*****请选择所需功能*****\n");

printf("*****1.生成钥匙*****\n");

printf("*****2.加密*****\n");

printf("*****3.解密*****\n");

printf("*****4.退出*****\n");

printf("------------------------------------------\n");

llprimeNum(llnum)//判断素数

if(num==1||num==0)

return0;

for(inti=2;i*i=num;i++)

if(num%i==0)

//不是素数返回0

return0;

return1;//是素数返回1

//判断两个数是否互素

llcoprime(lla,llb)//判断互质

llt;

if(ab)

t=a;

a=b;

b=t;

while(a%b)

t=b;

b=a%b;

a=t;

//返回值为1,则a,b互素

returnb;

//计算密文

llcandp(llb,llp,llk)//b--明文或密文p--指数(e/d)k--模数

if(p==1)

returnb%k;

if(p==2)

returnb*b%k;

if(p%2==0)

llsum=candp(b,p/2,k);

returnsum*sum%k;

if(p%2==1)

llsun=candp(b,p/2,k);

returnsun*sun*b%k;

//生成密钥

llkey()

llp,q,t,n,e,d;

cout"请输入两个素数p,q:"endl;//输入两个素数q,p

cinpq;

if(primeNum(p)==0||primeNum(q)==0)

cout"输入的p或q不是素数"endl;

return0;

n=p*q;

//t为n的欧拉函数

t=(p-1)*(q-1);

cout"请输入密钥e:"endl;

cine;

d=1;

//求e的乘法逆

while(((e*d)%t)!=1)

d++;

cout"n=p*q="nendl;

cout"t=(p-1)*(q-1)="tendl;

cout("公钥(e,n)为:(")e","n")"endl;

cout("私钥(d,n)为:(")d","n")"endl;

return0;

llencryption()

lln,e,x,y;

cout"请输入公钥(e,n)"endl;

cinen;

cout"请输入明文:(明文需小于"n")"endl;//计算密文

cinx;

y=candp(x,e,n);

cout"密文为:"yendl;

return0;

lldecode()

lln,d,x,y;

cout"请输入私钥(d,n)"endl;

cindn;

cout"请输入密文:";//计算密文

ciny;

x=candp(y,d,n);

cout"明文为:"xendl;

return0;

}

在写出主函数test.c,对上面的函数进行调用即可:

#include"RSA.h"

voidRSA()

while(1)

menu();

lli=0;

cini;

switch(i)

case1:

key();

break;

case2:

encryption();

break;

case3:

decode();

break;

case4:

exit(0);

default:

cout"输入错误,请重新输入"endl;

voidmenu1()

printf("******************************************\n");

printf("******************************************\n");

printf("*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论