搜档网
当前位置:搜档网 › RSA加解密算法C语言的实现

RSA加解密算法C语言的实现

RSA加解密算法C语言的实现
RSA加解密算法C语言的实现

#include

#include

#include

#include

#include

#include

#define MAX 100

#define LEN sizeof(struct slink)

void sub(int a[MAX],int b[MAX] ,int c[MAX] );

struct slink

{

int bignum[MAX];

/*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/

struct slink *next;

};

/*/--------------------------------------自己建立的大数运算库-------------------------------------*/

void print( int a[MAX] )

{

int i;

for(i=0;i

printf("%d",a[a[99]-i-1]);

printf("\n\n");

return;

}

int cmp(int a1[MAX],int a2[MAX])

{ int l1, l2;

int i;

l1=a1[99];

l2=a2[99];

if (l1>l2)

return 1;

if (l1

return -1;

for(i=(l1-1);i>=0;i--)

{

if (a1[i]>a2[i])

return 1 ;

if (a1[i]

return -1;

}

return 0;

}

void mov(int a[MAX],int *b)

{

int j;

for(j=0;j

b[j]=a[j];

return ;

}

void mul(int a1[MAX],int a2[MAX],int *c) {

int i,j;

int y;

int x;

int z;

int w;

int l1, l2;

l1=a1[MAX-1];

l2=a2[MAX-1];

if (a1[MAX-2]=='-'&& a2[MAX-2]=='-') c[MAX-2]=0;

else if (a1[MAX-2]=='-')

c[MAX-2]='-';

else if (a2[MAX-2]=='-')

c[MAX-2]='-';

for(i=0;i

{

for(j=0;j

{

x=a1[i]*a2[j];

y=x/10;

z=x%10;

w=i+j;

c[w]=c[w]+z;

c[w+1]=c[w+1]+y+c[w]/10;

c[w]=c[w]%10;

}

}

w=l1+l2;

if(c[w-1]==0)w=w-1;

c[MAX-1]=w;

return;

}

void add(int a1[MAX],int a2[MAX],int *c) {

int i,l1,l2;

int len,temp[MAX];

int k=0;

l1=a1[MAX-1];

l2=a2[MAX-1];

if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-')) {

c[MAX-2]='-';

}

else if (a1[MAX-2]=='-')

{

mov(a1,temp);

temp[MAX-2]=0;

sub(a2,temp,c);

return;

}

else if (a2[MAX-2]=='-')

{

mov(a2,temp);

temp[98]=0;

sub(a1,temp,c);

return;

}

if(l1

else len=l2;

for(i=0;i

{

c[i]=(a1[i]+a2[i]+k)%10;

k=(a1[i]+a2[i]+k)/10;

}

if(l1>len)

{

for(i=len;i

{

c[i]=(a1[i]+k)%10;

k=(a1[i]+k)/10;

}

if(k!=0)

{

c[l1]=k;

len=l1+1;

}

else len=l1;

}

else

{

for(i=len;i

{

c[i]=(a2[i]+k)%10;

k=(a2[i]+k)/10;

}

if(k!=0)

{

c[l2]=k;

len=l2+1;

}

else len=l2;

}

c[99]=len;

return;

}

void sub(int a1[MAX],int a2[MAX],int *c) {

int i,l1,l2;

int len,t1[MAX],t2[MAX];

int k=0;

l1=a1[MAX-1];

l2=a2[MAX-1];

if ((a1[MAX-2]=='-') && (a2[MAX-2]=='-')) {

mov(a1,t1);

mov(a2,t2);

t1[MAX-2]=0;

t2[MAX-2]=0;

sub(t2,t1,c);

return;

}

else if( a2[MAX-2]=='-')

{

mov(a2,t2);

t2[MAX-2]=0;

add(a1,t2,c);

return;

}

else if (a1[MAX-2]=='-')

{

mov(a2,t2);

t2[MAX-2]='-';

add(a1,t2,c);

return;

}

if(cmp(a1,a2)==1)

{

len=l2;

for(i=0;i

{

if ((a1[i]-k-a2[i])<0)

{

c[i]=(a1[i]-a2[i]-k+10)%10; k=1;

}

else

{

c[i]=(a1[i]-a2[i]-k)%10; k=0;

}

}

for(i=len;i

{

if ((a1[i]-k)<0)

{

c[i]=(a1[i]-k+10)%10;

k=1;

}

else

{

k=0;

}

}

if(c[l1-1]==0)/*使得数组C中的前面所以0字符不显示了,如1000-20=0980--->显示为980了*/

{

len=l1-1;

i=2;

while (c[l1-i]==0)/*111456-111450=00006,消除0后变成了6;*/

{

len=l1-i;

i++;

}

}

else

{

len=l1;

}

}

else

if(cmp(a1,a2)==(-1))

{

c[MAX-2]='-';

len=l1;

for(i=0;i

{

if ((a2[i]-k-a1[i])<0)

{

c[i]=(a2[i]-a1[i]-k+10)%10;

k=1;

}

else

{

c[i]=(a2[i]-a1[i]-k)%10;

k=0;

}

}

for(i=len;i

{

if ((a2[i]-k)<0)

{

k=1;

}

else

{

c[i]=(a2[i]-k)%10;

k=0;

}

}

if(c[l2-1]==0)

{

len=l2-1;

i=2;

while (c[l1-i]==0)

{

len=l1-i;

i++;

}

}

else len=l2;

}

else if(cmp(a1,a2)==0)

{

len=1;

c[len-1]=0;

}

c[MAX-1]=len;

return;

}

void mod(int a[MAX],int b[MAX],int *c)/*/c=a mod b//注意:经检验知道此处A和C 的数组都改变了。*/

{ int d[MAX];

mov (a,d);

while (cmp(d,b)!=(-1))/*/c=a-b-b-b-b-b.......until(c

{

sub(d,b,c);

mov(c,d);/*/c复制给a*/

}

return ;

void divt(int t[MAX],int b[MAX],int *c ,int *w)/*//试商法//调用以后w为a mod b, C为a div b;*/

{

int a1,b1,i,j,m;/*w用于暂时保存数据*/

int d[MAX],e[MAX],f[MAX],g[MAX],a[MAX];

mov(t,a);

for(i=0;i

e[i]=0;

for(i=0;i

d[i]=0;

for(i=0;i

a1=a[MAX-1];

b1=b[MAX-1];

if (cmp(a,b)==(-1))

{

c[0]=0;

c[MAX-1]=1;

mov(t,w);

return;

}

else if (cmp(a,b)==0)

{

c[0]=1;

c[MAX-1]=1;

w[0]=0;

w[MAX-1]=1;

return;

}

m=(a1-b1);

for(i=m;i>=0;i--)/*341245/3=341245-300000*1--->41245-30000*1--->11245-3000*3--->2245-300*7--->145-30*4=25--->25-3*8=1*/

{

for(j=0;j

d[j]=0;

d[i]=1;

d[MAX-1]=i+1;

mov(b,g);

mul(g,d,e);

while (cmp(a,e)!=(-1))

{

c[i]++;

sub(a,e,f);

mov(f,a);/*f复制给g*/

}

for(j=i;j

e[j]=0;

}

mov(a,w);

if (c[m]==0) c[MAX-1]=m;

else c[MAX-1]=m+1;

return;

}

void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m)/*解决了 m=a*b mod n;*/ {

int c[MAX],d[MAX];

int i;

for(i=0;i

d[i]=c[i]=0;

mul(a,b,c);

divt(c,n, d,m);

for(i=0;i

printf("%d",m[m[MAX-1]-i-1]);

printf("\nm length is : %d \n",m[MAX-1]);

}

/*接下来的重点任务是要着手解决 m=a^p mod n的函数问题。*/

void expmod(int a[MAX] ,int p[MAX] ,int n[MAX],int *m)

{

int t[MAX],l[MAX],temp[MAX]; /*/t放入2,l放入1;*/

int w[MAX],s[MAX],c[MAX],b[MAX],i;

for(i=0;i

b[i]=l[i]=t[i]=w[i]=0;

t[0]=2;t[MAX-1]=1;

l[0]=1;l[MAX-1]=1;

mov(l,temp);

mov(p,b);

while(cmp(b,l)!=0)

{

for(i=0;i

w[i]=c[i]=0;

divt(b,t,w,c);/*// c=p mod 2 w= p /2*/

mov(w,b);/*//p=p/2*/

if(cmp(c,l)==0) /*/余数c==1*/

{

for(i=0;i

w[i]=0;

mul(temp,m,w);

mov(w,temp);

for(i=0;i

w[i]=c[i]=0;

divt(temp,n,w,c);/* /c为余c=temp % n,w为商w=temp/n */

mov(c,temp);

}

for(i=0;i

s[i]=0;

mul(m,m,s);//s=a*a

for(i=0;i

c[i]=0;

divt(s,n,w,c);/*/w=s/n;c=s mod n*/

mov (c,m);

}

for(i=0;i

mul(m,temp,s);

for(i=0;i

c[i]=0;

divt(s,n,w,c);

mov (c,m);/*余数s给m*/

m[MAX-2]=a[MAX-2];/*为后面的汉字显示需要,用第99位做为标记*/

return;

/*/k=temp*k%n;*/

}

int is_prime_san(int p[MAX] )

{

int i,a[MAX],t[MAX],s[MAX],o[MAX];

for(i=0;i

s[i]=o[i]=a[i]=t[i]=0;

t[0]=1;

t[MAX-1]=1;

a[0]=2;// { 2,3,5,7 }

a[MAX-1]=1;

sub(p,t,s);

expmod ( a, s, p ,o);

if ( cmp(o,t) != 0 )

{

return 0;

}

a[0]=3;

for(i=0;i

expmod ( a, s, p ,o);

if ( cmp(o,t) != 0 )

{

return 0;

}

a[0]=5;

for(i=0;i

expmod ( a, s, p ,o);

if ( cmp(o,t) != 0 )

{

return 0;

}

a[0]=7;

for(i=0;i

expmod ( a, s, p ,o);

if ( cmp(o,t) != 0 )

{

return 0;

}

return 1;

}

int coprime(int e[MAX],int s[MAX]) /*//// 求两个大数之间是否互质////*/

{

int a[MAX],b[MAX],c[MAX],d[MAX],o[MAX],l[MAX];

int i;

for(i=0;i

l[i]=o[i]=c[i]=d[i]=0;

o[0]=0;o[MAX-1]=1;

l[0]=1;l[MAX-1]=1;

mov(e,b);

mov(s,a);

do

{

if(cmp(b,l)==0)

{

return 1;

}

for(i=0;i

c[i]=0;

divt(a,b,d,c);

mov(b,a);/*b--->a*/

mov(c,b);/*c--->b*/

}while(cmp(c,o)!=0);

/* printf("Ihey are not coprime!\n");*/ return 0;

}

void prime_random(int *p,int *q)

{

int i,k;

time_t t;

p[0]=1;

q[0]=3;

// p[19]=1;

// q[18]=2;

p[MAX-1]=10;

q[MAX-1]=11;

do

{

t=time(NULL);

srand((unsigned long)t);

for(i=1;i

{

k=rand()%10;

p[i]=k;

}

k=rand()%10;

while (k==0)

{

k=rand()%10;

}

p[p[MAX-1]-1]=k;

}while((is_prime_san(p))!=1);

printf("素数 p 为 : ");

{

printf("%d",p[p[MAX-1]-i-1]);

}

printf("\n\n");

do

{

t=time(NULL);

srand((unsigned long)t);

for(i=1;i

{

k=rand()%10;

q[i]=k;

}

}while((is_prime_san(q))!=1);

printf("素数 q 为 : ");

for(i=0;i

{

printf("%d",q[q[MAX-1]-i-1]);

}

printf("\n\n");

return;

}

void erand(int e[MAX],int m[MAX])

{

int i,k;

time_t t;

e[MAX-1]=5;

printf("随机产生一个与(p-1)*(q-1)互素的 e :"); do

{

t=time(NULL);

srand((unsigned long)t);

for(i=0;i

{

k=rand()%10;

e[i]=k;

}

while((k=rand()%10)==0)

k=rand()%10;

e[e[MAX-1]-1]=k;

}while(coprime( e, m)!=1);

{

printf("%d",e[e[MAX-1]-i-1]);

}

printf("\n\n");

return ;

}

void rsad(int e[MAX],int g[MAX],int *d)

{

int r[MAX],n1[MAX],n2[MAX],k[MAX],w[MAX];

int i,t[MAX],b1[MAX],b2[MAX],temp[MAX];

mov(g,n1);

mov(e,n2);

for(i=0;i

k[i]=w[i]=r[i]=temp[i]=b1[i]=b2[i]=t[i]=0; b1[MAX-1]=0;b1[0]=0;/*/b1=0;*/

b2[MAX-1]=1;b2[0]=1;/*/b2=1;*/

while(1)

{

for(i=0;i

k[i]=w[i]=0;

divt(n1,n2,k,w);/*/k=n1/n2;*/

for(i=0;i

temp[i]=0;

mul(k,n2,temp);/*/temp=k*n2;*/

for(i=0;i

r[i]=0;

sub(n1,temp,r);

if((r[MAX-1]==1) && (r[0]==0))/*/r=0*/

{

break;

}

else

{

mov(n2,n1);/*/n1=n2;*/

mov( r,n2);/*/n2=r;*/

mov(b2, t);/*/t=b2;*/

for(i=0;i

temp[i]=0;

mul(k,b2,temp);/*/b2=b1-k*b2;*/

for(i=0;i

b2[i]=0;

sub(b1,temp,b2);

mov(t,b1);

}

}

for(i=0;i

t[i]=0;

add(b2,g,t);

for(i=0;i

temp[i]=d[i]=0;

divt(t,g,temp,d);

printf("由以上的(p-1)*(q-1)和 e 计算得出的 d : ");

for(i=0;i

printf("%d",d[d[MAX-1]-i-1]);

printf("\n\n");

}

/*/求解密密钥d的函数(根据Euclid算法)96403770511368768000*/

unsigned long rsa(unsigned long p,unsigned long q,unsigned long e) /*/求解密密钥d的函数(根据Euclid算法)*/

{

unsigned long g,k,r,n1,n2,t;

unsigned long b1=0,b2=1;

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

n1=g;

n2=e;

while(1)

{

k=n1/n2;

r=n1-k*n2;

if(r!=0)

{

n1=n2;

n2=r;

t=b2;

b2=b1-k*b2;

b1=t;

}

else

{

break;

}

}

return (g+b2)%g;

}

/*/------------------------------------------导入导出公钥和私钥------------------------------------/*/

void loadpkey(int e[MAX],int n[MAX]) //导入公钥

{

FILE *fp;

char filename[25],str[MAX],ch;

int i,k;

for(i=0;i

e[i]=n[i]=0;

while(1)

{

printf("\n");

printf("为导入(e,n),请输入加密密钥对文件路径: \n");

scanf("%s",filename);

if((fp=fopen(filename,"r"))==NULL)

printf("输入的文件不存在,请重新输入!\n");

else break;

}

k=0;

while((ch=fgetc(fp))!=EOF)

{

if(ch!=' ')

{

str[k]=ch;

k++;

}

else

{

for(i=0;i

{

e[i]=str[k-i-1]-48;

}

e[MAX-1]=k;

k=0;

}

}

for(i=0;i

n[i]=str[k-i-1]-48;

n[MAX-1]=k;

printf("\n加密密钥 e : ");

for(i=0;i

printf("%d",e[e[MAX-1]-i-1]);

printf("\n");

printf("\n 公钥 n : ");

for(i=0;i

printf("%d",n[n[MAX-1]-i-1]);

printf("\n");

fclose(fp);

printf("\n导入(e,n)成功!\n");

getchar();

}

void loadskey(int d[MAX],int n[MAX]) //导入私钥

{

{

FILE *fp;

char filename[25],str[MAX],ch;

int i,k;

for(i=0;i

d[i]=n[i]=0;

while(1)

{

printf("为导入(d,n),请输入解密密钥对文件的路径: \n"); scanf("%s",filename);

if((fp=fopen(filename,"r"))==NULL)

{

printf("输入的文件不存在,请重新输入!\n");

}

else break;

}

k=0;

while((ch=fgetc(fp))!=EOF)

{

if(ch!=' ')

{

str[k]=ch;

k++;

}

else

{

for(i=0;i

{

d[i]=str[k-i-1]-48;

}

d[MAX-1]=k;

k=0;

}

}

for(i=0;i

n[i]=str[k-i-1]-48;

n[MAX-1]=k;

printf("\n解密密钥 d : ");

for(i=0;i

printf("%d",d[d[MAX-1]-i-1]);

printf("\n");

printf("\n 公钥 n : ");

for(i=0;i

printf("%d",n[n[MAX-1]-i-1]);

printf("\n");

fclose(fp);

printf("\n导入(d,n)成功!\n");

getchar();

}

}

void savepkey(int e[MAX],int n[MAX])//导出公钥

{

FILE *fp;

int i;

char savefile[25],ch;

printf("导出加密密钥(e,n),存放的文件路径为: "); scanf("%s",savefile);

printf("\n");

fp=fopen(savefile,"w");

for(i=0;i

{

ch=e[e[MAX-1]-i-1]+48;

fputc(ch,fp);

}

ch=' ';

fputc(ch,fp);

for(i=0;i

{

ch=n[n[MAX-1]-i-1]+48;

fputc(ch,fp);

}

fclose(fp);

printf("\n保存(e,n)操作完成!\n");

}

void saveskey(int d[MAX],int n[MAX])//导出私钥

{

FILE *fp;

int i;

char savefile[25],ch;

printf("导出解密密钥(d,n),存放的文件路径为: ");

scanf("%s",savefile);

printf("\n");

fp=fopen(savefile,"w");

for(i=0;i

{

ch=d[d[MAX-1]-i-1]+48;

fputc(ch,fp);

}

ch=' ';

fputc(ch,fp);

for(i=0;i

{

ch=n[n[MAX-1]-i-1]+48;

fputc(ch,fp);

}

fclose(fp);

printf("\n保存(d,n)操作完成!\n");

}

/*/------------------------------------------加密和解密的块------------------------------------/*/

void printbig(struct slink *h)

{

struct slink *p;

int i;

p=(struct slink * )malloc(LEN);

RSA加密解密的设计与实现

RSA加密解密的设计与实现

上海电力学院 《应用密码学》课程设计 题目: RSA加密解密的设计与实现 院系:计算机科学与技术学院 专业年级:级 学生姓名:李正熹学号: 3273 指导教师:田秀霞 1月 8日 目录

目录 1.设计要求 2.开发环境与工具 3.设计原理(算法工作原理) 4.系统功能描述与软件模块划分 5.设计核心代码 6.参考文献 7. 设计结果及验证 8. 软件使用说明 9. 设计体会 附录 1.设计要求

1 随机搜索大素数,随机生成公钥和私钥 2 用公钥对任意长度的明文加密 3 用私钥对密文解密 4 界面简洁、交互操作性强 2.开发环境与工具 Windows XP操作系统 Microsoft Visual C++ 6.0 1.创立rsa工程

2.在rsa工程中创立 3273 李正熹cpp文件 3.设计原理 RSA算法简介 公开密码算法与其它密码学完全不同,它是基于数学函数而不是基于替换或置换。与使用一个密钥的对称算法不同,公开密钥算法是非对称的,而且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。公开密钥算法有RSA、Elgamal等。 RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在1978年提出来的,并以她们的名字的有字母命名的。RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是当前应用广泛的公钥密码体制。

RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。而且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。 4.系统功能描述与软件模块划分 功能:

RSA加密算法加密与解密过程解析

RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密。 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密。 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S。 解密的时候再用密文S和密钥A做异或,还原为原来的字符串C。这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文。 非对称加密在加密和解密过程中使用不同的密钥,即公钥和私钥。公钥用于加密,所有人都可见,私钥用于解密,只有解密者持有。就算在一次加密过程中原文和密文发生泄漏,破解者在知道原文、密文和公钥的情况下无法推理出私钥,很大程度上保证了数据的安全性。 此处,我们介绍一种非常具有代表性的非对称加密算法,RSA加密算法。RSA 算法是1977年发明的,全称是RSA Public Key System,这个Public Key 就是指的公共密钥。 2.密钥的计算获取过程 密钥的计算过程为:首先选择两个质数p和q,令n=p*q。 令k=?(n)=(p?1)(q?1),原理见4的分析 选择任意整数d,保证其与k互质 取整数e,使得[de]k=[1]k。也就是说de=kt+1,t为某一整数。

3.RSA加密算法的使用过程 同样以一个字符串来进行举例,例如要对字符串the art of programming 进行加密,RSA算法会提供两个公钥e和n,其值为两个正整数,解密方持有一个私钥d,然后开始加密解密过程过程。 1. 首先根据一定的规整将字符串转换为正整数z,例如对应为0到36,转化后形成了一个整数序列。 2. 对于每个字符对应的正整数映射值z,计算其加密值M=(N^e)%n. 其中N^e表示N的e次方。 3. 解密方收到密文后开始解密,计算解密后的值为(M^d)%n,可在此得到正整数z。 4. 根据开始设定的公共转化规则,即可将z转化为对应的字符,获得明文。 4.RSA加密算法原理解析 下面分析其内在的数学原理,说到RSA加密算法就不得不说到欧拉定理。 欧拉定理(Euler’s theorem)是欧拉在证明费马小定理的过程中,发现的一个适用性更广的定理。 首先定义一个函数,叫做欧拉Phi函数,即?(n),其中,n是一个正整数。?(n)=总数(从1到n?1,与n互质整数) 比如5,那么1,2,3,4,都与5互质。与5互质的数有4个。?(5)=4再比如6,与1,5互质,与2,3,4并不互质。因此,?(6)=2

实验四RSA加解密算法的实现

实验四 RSA加解密算法的实现 一.实验目的 1、对算法描述可进行充分理解,精确理解算法的各个步骤。 2、完成RSA软件算法的详细设计。 3、用C++完成算法的设计模块。 4、编制测试代码。 二.实验内容 1.实验原理及基本技术路线图(方框原理图) 加密过程: 第一步,用户首先输入两个素数p和q,并求出 n = p*q,然后再求出n的欧拉函数值phi。 第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。 第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH=500),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。 第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。 注意:此处不能用m2[j] = clear[j] ^ e整数的幂,因为当e和clear[j]较大时,会发生溢出,至使出现无法预料的结果。 第五步,输出加密后的密文。 解密过程: 第一步,根据在以上算法中求出的解密密钥[d,phi],对加密后的密文Ciphertext[MAXLENGTH]进行解密,结果保存在DecryptionText[MAXLENGTH]中,算法如下: 第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是否一致,从而得知算法是否正确。

2.所用仪器、材料(设备名称、型号、规格等) 计算机一台、vc6.0 3.实验方法、步骤 #include #include using namespace std; #define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数 int size = 0;//保存要进行加密的正整数的个数 int p, q; //两个大素数 int n, phi; //n = p * q,phi = (p-1) * (q-1) 是n的欧拉函数值 int e; //{e, n}为公开密钥 int d; //{d, n}为秘密密钥 int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明//文和加密后的密文int DecryptionText[MAXLENGTH];//存放解密后的明文 //////////////////////////////////////////////////////////// //以下为加密算法 void Encryption() {//加密算法 cout << " 请输入两个较大的素数:" ; cin >> p >> q ; cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n, phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", phi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互素的数 e:"; cin >> e; float d0; for( int i = 1; ; i++) {///求解乘法逆元 e * d ≡ 1 (mod phi) d0 = (float)(phi*i+1) / e; if( d0 - (int)d0 == 0 ) break; } d = (int)d0; cout << endl; cout << " e = " << e << ", d = " << d << endl; cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl; cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" << endl; cout << endl;

RSA加密算法的基本原理

RSA加密算法的基本原理 1978年RSA加密算法是最常用的非对称加密算法,CFCA 在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest,Adi Shamir,Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,

RSA加解密算法C语言的实现

#include #include #include #include #include #include #define MAX 100 #define LEN sizeof(struct slink) void sub(int a[MAX],int b[MAX] ,int c[MAX] ); struct slink { int bignum[MAX]; /*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/ struct slink *next; }; /*/--------------------------------------自己建立的大数运算库-------------------------------------*/ void print( int a[MAX] ) { int i; for(i=0;il2) return 1; if (l1=0;i--) { if (a1[i]>a2[i]) return 1 ; if (a1[i]

密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》 专业:信息工程(信息安全) 班级:1132102 学号:201130210214 姓名:周林 指导老师:阳红星 时间:2014年1月10号

一、课程设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 3.计算出p和q的乘积n 。 4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e 用做加密密钥(其中Φ(n)=(p-1)*(q-1))。 5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。 6.得公钥(e ,n ), 私钥 (d , n) 。 7.公开公钥,但不公开私钥。 8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

用实例讲解RSA加密算法(精)

可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n 为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就

RSA加密解密

苏州科技学院 实验报告 实验四 学生姓名:学号:指导教师: 实验地点:计算机学院大楼东309 实验时间:4.21 一、实验室名称:软件实验室 二、实验项目名称:RSA加密解密 三、实验学时:4学时 四、实验原理: 加密过程: 第一步,用户首先输入两个素数p和q,并求出 n = p*q,然后再求出n的欧拉函数值phi。 第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。 第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH=500),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。 第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。 注意:此处不能用m2[j] = clear[j] ^ e整数的幂,因为当e和clear[j]较大时,会发生溢出,至使出现无法预料的结果。 第五步,输出加密后的密文。

解密过程: 第一步,根据在以上算法中求出的解密密钥[d,phi],对加密后的密文Ciphertext[MAXLENGTH]进行解密,结果保存在DecryptionText[MAXLENGTH]中,算法如下: 第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是否一致,从而得知算法是否正确。 五、实验目的: 1、对算法描述可进行充分理解,精确理解算法的各个步骤。 2、完成RSA软件算法设计。 3、用C++完成算法的设计模块。 六、实验内容: 通过编写的程序完成RSA加密解密功能 七、实验器材(设备、元器件): (1)个人计算机 (2) Windows 7系统平台 (3) C++开发环境 八、实验数据及结果分析: #include #include

RSA加密算法及实现

数学文化课程报告题目:RSA公钥加密算法及实现

RSA公钥加密算法及实现 摘要 公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。公钥密码是基于数学的上的困难问题来保证其性。其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。本文利用C 语言编程技术进行了RSA算法的演示[1]。 关键词:C语言编程、RSA算法、应用数学。

RSA public key encryption algorithm Abstract Public key cryptography is an important invention in cryptography, thanks to public key cryptography, and it is used in modern computer and Internet password technology. Public key cryptography is based on the mathematics difficult problem to ensure its confidentiality. The RSA public key encryption algorithm is an important cryptographic algorithm, RSA using the difficulty that large integer is hard to be factorized into prime Numbers to ensure it safety. But if you can find a kind of fast algorithm to do the factorization, RSA algorithm will be failure. In this paper we used C language programming technology to demonstrate the RSA algorithm. Keywords:C language programming、RSA algorithm、Applied mathematics

用实例给新手讲解RSA加密算法

RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。 (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 (4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1; 26 mod 6=2;28 mod 2 =0等等。

RSA加解密过程及实现

******************** 本科生作业 ******************** 兰州理工大学 计算机与通信学院 2017年春季学期 信息安全课程 专业:物联网工程 姓名: 学号: 授课教师:郭显 成绩:

RSA 加解密过程及其实现 概述 RSA 算法 RSA 加密算法是一种最常用的非对称加密算法,CFCA 在证书服务中离不了它。在公钥加密标准和电子商业中,RSA 被广泛使用。 RSA 算法使用乘方运算,明文以分组为单位进行加密,每个分组的二进制值均小于n ,也就是说,分组的大小必须小于或等于1)(log 2+n 位,在实际应用中,分组的大小i 位,其中12 2+≤

用java编程实现RSA加密算法

用java编程实现RSA加密算法 RSA加密算法是目前应用最广泛的公钥加密算法,特别适用于通过Internet传送的数据,常用于数字签名和密钥交换。那么我今天就给大家介绍一下如何利用Java编程来实现RSA 加密算法。 一、RSA加密算法描述 RSA加密算法是1978年提出的。经过多年的分析和研究,在众多的公开密钥加密算法中,RSA加密算法最受推崇,它也被推荐为公开密钥数据加密标准。 由数论知识可知,若将一个具有大素数因子的合数进行分解是很困难的,或者说这个问题的计算量是令人望而生畏的,而RSA加密算法正是建立在这个基础上的。 在RSA加密算法中,—个用户A可根据以下步骤来选择密钥和进行密码转换: (1)随机的选取两个不同的大素数p和q(一般为100位以上的十进制数),予以保密;(2)计算n=p*q,作为用户A的模数,予以公开; (3)计算欧拉(Euler)函数z=(p-1)*(q-1),予以保密; (4)随机的选取d与z互质,作为A的公开密钥; (5)利用Euclid算法计算满足同余方程e*d≡1modz的解d,作为用户A的保密密钥;(6)任何向用户A发送信息M的用户,可以用A的公开模数D和公开密钥e根据C=Me mod n得到密文C;

RSA加密算法的安全性是基于大素数分解的困难性。攻击者可以分解已知的n,得到p和q,然后可得到z;最后用Euclid算法,由e和z得到d。然而要分解200位的数,需要大约40亿年。 二、用Java语言描述RSA加密算法的原理 假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个private_kcy(我们称之为密钥),可将这个private_key始终保存在机器B中而不发出来。然后,由这个private_key计算出public_key(我们称之为公钥)。这个public_key的特性是:几乎不可能通过该public_key计算生成它的priyate_key。接下来通过网络把这个public_key传给机器A,机器A收到public_key后,利用public_key将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的pri.rate_key,就可以解开加密信息。 步骤: (1)首先选择两个大素数p和q,计算n=p*q;m=(p-1)(q一1); (2)而后随机选择加密密钥public_key,要求和m互质(比如public_key=m-1);(3)利用Euclid算法计算解密密钥priyate_key,使private_key满足public_key*private_key—1(mod m),其中public_key,n是作为公钥已知,priVate_key 是密钥; (4)加密信息text时,利用公式secretWord=texI^Public_key (mod n)得到密文8ecretword; (5)解密时利用公式word=text^priVate_key(mod n)得到原文word=text。

RSA算法实验报告

RSA算法的实现 实验原理 算法原理 RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。 RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密) e1和e2可以互换使用,即: A=B^e1 mod n;B=A^e2 mod n; 密钥生成 首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。 密钥分配 和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡一个从中取代的攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。 步骤如下(这里设B为是实现着) (1)B寻找出两个大素数p和q。 (2)B计算出n=p*q和?(n)=)(p-1)*(q-1)。 (3)B选择一个随机数e(0

RSA加解密算法

RSA加解密算法 1实验目的 了解RSA加解密算法 2实验内容 编程实现RSA加解密算法 3实验步骤 3.1选择素数p,q 选择p,q,p,q都是素数,p≠q。由于P和q都是大素数,所以为了方便由程序自动生成。 //产生随机素数p和q void prime_random(int *p,int *q) { int i,k; time_t t; p[0]=1; q[0]=3; // p[19]=1; // q[18]=2; p[MAX-1]=10; q[MAX-1]=11; do { t=time(NULL); srand((unsigned long)t); for(i=1;i

k=rand()%10; while (k==0) { k=rand()%10; } p[p[MAX-1]-1]=k; }while((is_prime_san(p))!=1); printf("素数p 为: "); for(i=0;i

RSA加密解密算法

《网络安全》实验设计报告 RSA加密解密算法 学院(系): 班级: 组别: 指导教师:

一、实验设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 3.计算出p和q的乘积n 。 4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e 用做加密密钥(其中Φ(n)=(p-1)*(q-1))。 5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。 6.得公钥(e ,n ), 私钥 (d , n) 。 7.公开公钥,但不公开私钥。 8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

RSA加密算法举例

RSA加密算法举例 1)为字母制定一个简单的编码,例如1到26分别对应于A到Z。 2)选择n,n为两个大的素数p和q的乘积。如我们使用n = p * q = 11 * 7 = 77。 3)找出一个数字k,k与(p-1)*(q-1)互为素数。我们选择k=7,与(p-1)*(q-1) = 10*6 = 60互为素数,数字k就是加密密钥。我们总能找到有这种性质的数字k,数论中一个著名结果证明了它。 4)将信息分成很多部分。一般地讲,为避免重复,每部分都包含很多字母。然而,在本例中,每部分只包含一个字母。若信息是“HELLO”,则为H、E、L、L和O。 5)对每部分,将所有字母的二进制编码串接起来,并将比特串解释为整数。我们这里每部分只有一个字母。所以,整数为8、5、12、12和15(最初与字母对应的数字)。 6)将每个数字增大到它的k次方而加密,并使用模n运算。本例中,87mod 77;57mod 77等,结果就是加密信息。这里,计算结果分别为57、47、 12、12和71(我们会说明怎样使计算更快捷)。注意这里两个12表示重复字母。这是每部分只有一个字母的结果。若每部分包含多个字母,类似的重复就可避免。 接收方接收到加密信息57、47、12、12和71。她又是怎样解密呢? 1) 找出一个数字k’,使k * k’mod (p-1)*(q-1) = 1。这意味着k*k’-1可被(p-1)*(q-1)整除。k’的值就是解密密钥。本例中,(p-1)*(q-1) = 60,而k’=43即可。也就是,7*43-1=300可被60整除。数论中欧拉和费马的著名结论证明了k’的值总能找到。 2)将从第6步中得到的加密数字增大到它的k’次方,并进行模n运算。结果就是第5步中的数字。本例中,要求下列运算: 5743 mod 77;4743 mod 77;1243 mod 77;1243 mod 77;7143 mod 77 结果为原来的数字:8、5、12、12和15。 使用前面的表示法,E k(x)=x k mod n和D k’(y)=y k’ mod n,所以有D k’(E k(x))=(x k)k’。只要k和k’按所述选择,则(x k)k’ mod n结果为x。对此的验证要再次依赖于数论。 加密和解密算法惊人地简单。两者都涉及到指数和模运算。但有个潜在的问题:怎样计算像7143这种数字的准确的模值?该数字大约为1079,与实际应用的数字相比是很小的。这看起来当然是个令人生畏的计算。然而,我们仅对模运算感兴趣,所以可以取些捷径,以使任何计算器都能进行该运算。通过计算7143 mod 77来说明。 第一步是将指数写成2的幂次之和。由此,有 7143 = 7132+8+2+1=7132 * 718 * 712 * 71l 而712=5041=36 mod 77。这里再次意味着5041和36被77整除后有相同的余数。既然只要余数值,可将712用36代替。而且,可将718写成(712)4。这里再次与364相同。类似地,7132的模的等价物是(712)16或3616。所以,方程可简化为: 7143 = 3616 * 364 * 36 * 71 mod 77 由此可见,可显著地简化必要的计算。按类似的方式进一步有362=1296=64 mod 77。方程简化为 7143 = 648 * 642 * 36 * 71 mod 77 可继续得到 7143 = 154 * 15 * 36 * 71 mod 77 = 15 mod 77 加密算法使用n和k,而解密算法使用n和k’。k’是使得k*k’-1 mod(p-1)*(q-1)=0而选择的,要想通过n和k解出k’,必须找出n的因子p和q,当n很大时这是很困难的。

用实例讲解RSA加密算法(精)

用实例讲解RSA加密算法 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA 以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA公开密钥算法的发明人 (从左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片摄于1978年)RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n 为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。模指数运算就是先做指数运算,取其结果再做模运算。如53 mod 7=125 mod 7=6 好,现在开始正式讲解RSA加密算法。 算法描述: (1)选择一对不同的、足够大的素数p和q。 (2)计算n=pq。 (3)计算f(n)=(p-1)(q-1),同时对p和q严加保密,不让任何人知道。 (4)找一个与f(n)互质的数e,且1

相关主题