您的位置:首页 > 编程语言 > C语言/C++

四种加密算法之RSA源代码-C++

2016-06-24 12:41 459 查看
RSA.h文件:

[cpp] view
plaincopy

//! RSA 动态链接库实现 H文件

/*!

@author 朱孟斌

@e-mail zmb.tsubasa@gmail.com

@version 1.0

@date 2011-03

@{

*/

#ifndef RSA_H

#define RSA_H

#include <stdio.h>

#include <string>

#include <stdlib.h>

#include <time.h>

#include <math.h>

#include <malloc.h>

#include <iostream>

#include <ppl.h>

using namespace std;

using namespace Concurrency;

//! MAX是数组的最大个数,LEN为结构体slink的占用内存空间大小 */

#define MAX 100

#define LEN sizeof(struct slink)

//! #能够进行动态链接库编译的RSA类

/*!

@see class _declspec(dllexport) RSA

将RSA算法写成动态链接库的形式方便调用,其中有公钥,私钥和明文

就可以进行明文的加密和解密

*/

class _declspec(dllexport) RSA

{

public:

//! # 新定义的数据结构slink

/*!

@see struct slink

数据结构中,bignum存储的是随机生成的大数,next是指向后面的指针

@see int bignum[MAX]

*/

typedef struct slink

{

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

struct slink *next;

}slink;

public:

//! #RSA 的构造函数

/*!

@see RSA()

其中应该对RSA类中的一些变量进行相应的初始化

*/

RSA();

//! #RSA的析构函数

/*!

@see ~RSA()

释放内存

*/

~RSA();

public:

//! #RSA的大数运算函数库

/** @大数比较函数

@see int cmp(int, int)

*/

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

/** @大数类型转换函数

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

*/

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

/** @大数乘积函数

@see void mul(int a1[MAX],int a2[MAX],int *c);

*/

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

/** @大数相加函数

@see void add(int a1[MAX],int a2[MAX],int *c);

*/

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

/** @大数大数相减函数

@see void sub(int a1[MAX],int a2[MAX],int *c);

*/

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

/*! @大数取模函数

@see void mod(int a[MAX],int b[MAX],int *c);

@attention /c=a mod b//注意:经检验知道此处A和C的数组都改变了。

*/

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

/*! @大数相除函数

@see void divt(int t[MAX],int b[MAX],int *c ,int *w);

@attention //试商法//调用以后w为a mod b, C为a div b;

*/

void divt(int t[MAX],int b[MAX],int *c ,int *w);

/*! @解决 了 m=a*b mod n;

/*!

@see void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m);

*/

void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m);

/*! @解决 m=a^p mod n的函数问题

/*!

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

*/

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

/*! @判断是否为素数

@see int is_prime_san(int p[MAX] );

*/

int is_prime_san(int p[MAX] );

/*! @判断两个大数之间是否互质

@see int coprime(int e[MAX],int s[MAX]);

*/

int coprime(int e[MAX],int s[MAX]);

/*! @随机产生素数

@see void prime_random(int *p,int *q);

*/

void prime_random(int *p,int *q);

/*! @产生素数e

@see void erand(int e[MAX],int m[MAX]);

*/

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

/*! @根据规则产生其他的数

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

*/

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

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

@see unsigned long rsa(unsigned long p,unsigned long q,unsigned long e);

*/

unsigned long rsa(unsigned long p,unsigned long q,unsigned long e);

//! #RSA的产生大数的公钥和私钥的函数

/*!

@see bool RSAKey();

@param 没有任何输入,

@param 随机产生e,d,n的函数,其运行时间比较长,需要等待

@return[bool] 成功返回true,失败返回false

*/

bool RSAKey();

//! #RSA的进行文件加密的函数

/*!

@see string tencrypto(int e[MAX], int n[MAX], char* text);

@param[int[] e,n为随机产生的公钥,利用公钥进行加密

@param[char* text为明文,明文以char*的格式存储

@return[string] 返回值为加密成功之后的密文,采用string类型进行存储

*/

string tencrypto(int e[MAX], int n[MAX], char* text);

//! #RSA的进行文件解密的函数

/*!

@see string tdecrypto(int d[MAX], int n[MAX], string text);

@param[int[] d,n为私钥,由函数RSAKey()产生

@param[string text为密文,对应加密函数,密文的格式为string

@return[string] 解密之后的明文采用string进行存储

*/

string tdecrypto(int d[MAX], int n[MAX], string text);

public:

/** @brief 定义的全局变量,存储密钥 */

int p[MAX],q[MAX],n[MAX],d[MAX],e[MAX],m[MAX],p1[MAX],q1[MAX];

private:

int i;

char c;

//struct slink *head,*h1,*h2;

};

#endif // RSA_H

RSA.c文件:

[cpp] view
plaincopy

/*!

* @ RSA 动态链接库实现 CPP文件

* @author 朱孟斌

* @e-mail zmb.tsubasa@gmail.com

* @version 1.0

* @date 2011-03

* @{

*/

#include "RSA.h"

RSA::RSA()

{

}

RSA::~RSA()

{

}

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

int RSA::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<l2)

return -1;

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

{

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

return 1 ;

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

return -1;

}

return 0;

}

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

{

int j;

for(j=0;j<MAX;j++)

b[j]=a[j];

return ;

}

void RSA::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<l1;i++)

{

for(j=0;j<l2;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 RSA::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<l2)len=l1;

else len=l2;

for(i=0;i<len;i++)

{

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

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

}

if(l1>len)

{

for(i=len;i<l1;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<l2;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 RSA::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<len;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<l1;i++)

{

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

{

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

k=1;

}

else

{

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

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<len;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<l2;i++)

{

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

{

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

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 RSA::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<b)*/

{

sub(d,b,c);

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

}

return ;

}

void RSA::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<MAX;i++)

e[i]=0;

for(i=0;i<MAX;i++)

d[i]=0;

for(i=0;i<MAX;i++) g[i]=0;

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<MAX;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<MAX;j++)/*高位清零*/

e[j]=0;

}

mov(a,w);

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

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

return;

}

void RSA::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<MAX;i++)

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

mul(a,b,c);

divt(c,n, d,m);

//for(i=0;i<m[MAX-1];i++)

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

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

}

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

void RSA::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<MAX-1;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(a,m);

mov(p,b);

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

{

for(i=0;i<MAX;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<MAX;i++)

w[i]=0;

mul(temp,m,w);

mov(w,temp);

for(i=0;i<MAX;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<MAX;i++)

s[i]=0;

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

for(i=0;i<MAX;i++)

c[i]=0;

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

mov (c,m);

}

for(i=0;i<MAX;i++)

s[i]=0;

mul(m,temp,s);

for(i=0;i<MAX;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 RSA::is_prime_san(int p[MAX] )

{

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

for(i=0;i<MAX;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<MAX;i++) o[i]=0;

expmod ( a, s, p ,o);

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

{

return 0;

}

a[0]=5;

for(i=0;i<MAX;i++) o[i]=0;

expmod ( a, s, p ,o);

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

{

return 0;

}

a[0]=7;

for(i=0;i<MAX;i++) o[i]=0;

expmod ( a, s, p ,o);

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

{

return 0;

}

return 1;

}

int RSA::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<MAX;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<MAX;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 RSA::prime_random(int *p,int *q)

{

int i,k;

time_t t;

p[0]=1;

q[0]=3;

p[MAX-1]=10;

q[MAX-1]=11;

do

{

t=time(NULL);

srand((unsigned long)t);

for(i=1;i<p[MAX-1]-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);

do

{

t=time(NULL);

srand((unsigned long)t);

for(i=1;i<q[MAX-1];i++)

{

k=rand()%10;

q[i]=k;

}

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

return;

}

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

{

int i,k;

time_t t;

e[MAX-1]=5;

do

{

t=time(NULL);

srand((unsigned long)t);

for(i=0;i<e[MAX-1]-1;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);

return ;

}

void RSA::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<MAX;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<MAX;i++)

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

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

for(i=0;i<MAX;i++)

temp[i]=0;

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

for(i=0;i<MAX;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<MAX;i++)

temp[i]=0;

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

for(i=0;i<MAX;i++)

b2[i]=0;

sub(b1,temp,b2);

mov(t,b1);

}

}

for(i=0;i<MAX;i++)

t[i]=0;

add(b2,g,t);

for(i=0;i<MAX;i++)

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

divt(t,g,temp,d);

}

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

unsigned long RSA::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;

}

/////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////

//! RSA的进行文件加密的函数

/*!

* @param[in] e,n为随机产生的公钥,利用公钥进行加密

* @param[in] text为明文,明文以char*的格式存储

* @return[string] 返回值为加密成功之后的密文,采用string类型进行存储

* @pre \e 进行加密的过程中进行了数据类型的转换

* @see e,d,n & text

*/

string RSA::tencrypto(int e[MAX], int n[MAX], char* text)/*//对有需要的文件进行加密*/

{

int i,k,count,temp,c;

char ch;

struct slink *p,*p1,*p2;

struct slink *h;

h=p=p1=p2=(struct slink * )malloc(LEN);

h=NULL;

if (text == NULL)

{

return NULL;

}

count=0;

int j;

for (j = 0 ; j < strlen(text); j++)

{

ch = text[j];

c=ch;

k=0;

if(c<0)

{

c=abs(c);/*/把负数取正并且做一个标记*/

p1->bignum[MAX-2]='0';

}

else

{

p1->bignum[MAX-2]='1';

}

while(c/10!=0)

{

temp=c%10;

c=c/10;

p1->bignum[k]=temp;

k++;

}

p1->bignum[k]=c;

p1->bignum[MAX-1]=k+1;

count=count+1;

if(count==1)

h=p1;

else p2->next=p1;

p2=p1;

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

}

p2->next=NULL;

string res;

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

p=h;

if(h!=NULL)

do

{

expmod( p->bignum , e ,n ,p1->bignum);

ch=p1->bignum[MAX-2];

res += ch;

if ((p1->bignum[MAX-1]/10) ==0)/*/判断p1->bignum[99]的是否大于十;*/

{

ch=0+48;

res += ch;

ch=p1->bignum[MAX-1]+48;

res += ch;

}

else

{

ch=p1->bignum[MAX-1]/10+48;

res += ch;

ch=p1->bignum[MAX-1]%10+48;

res += ch;

}

for(i=0;i<p1->bignum[MAX-1];i++)

{

ch=p1->bignum[i]+48;

res += ch;

}

p=p->next;

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

}while(p!=NULL);

return res;

}

//! RSA的进行文件解密的函数

/*!

* @param[in] d,n为私钥,由函数RSAKey()产生

* @param[in] text为密文,对应加密函数,密文的格式为string

* @return[string] 解密之后的明文采用string进行存储

* @pre \e 进行解密的过程中进行了数据类型的转换

* @see e,d,n & text

*/

string RSA::tdecrypto(int d[MAX], int n[MAX], string text)

{

struct slink *h,*p1,*p2;

char ch;

int i,j,k,c,count,temp;

i=0;

j=3;

count=0;

h=p1=p2=(struct slink * )malloc(LEN);

int kk;

for (kk = 0; kk < text.length(); kk++)

{

ch = text.at(kk);

c=ch;

if(j==3)

{

p1->bignum[MAX-2]=c;

j--;

}

else if(j==2)

{

temp=c-48;

j--;

}

else if(j==1)

{

p1->bignum[MAX-1]=temp*10+c-48;

j--;

}

else if (j==0)

{

p1->bignum[i]=c-48;

i++;

if(i==p1->bignum[MAX-1])

{

i=0;

j=3;

count++;

if (count==1)

h=p1;

else p2->next=p1;

p2=p1;

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

}

}

}

p2->next=NULL;

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

p1=h;

k=0;

string res;

if(h!=NULL)/*/temp为暂存ASIIC码的int值*/

do

{

for(i=0;i<MAX;i++)

p2->bignum[i]=0;

expmod( p1->bignum , d ,n ,p2->bignum);

temp=p2->bignum[0]+p2->bignum[1]*10+p2->bignum[2]*100;

if (( p2->bignum[MAX-2])=='0')

{

temp=0-temp;

}/*/转化为正确的ASIIC码,如-78-96形成汉字 */

ch=temp;/* str[k]--->ch */

res += ch;

k++;

p1=p1->next;

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

}while (p1!=NULL);

return res;

}

//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////

/*

* 产生密钥,公钥和私钥

* @param[in] 随机产生大数密钥

* @param[in] 利用自定义的大数运算规则进行计算

* @return 返回产生成功与否

* – false 表示产生密钥失败

* @pre \e 产生的密钥存储在定义的类中变量中

* @see e,d,n

*/

bool RSA::RSAKey()

{

for(i=0;i<MAX;i++)

m[i]=p[i]=q[i]=n[i]=d[i]=e[i]=0;/*/简单初始化一下*/

prime_random(p,q);/*/随机产生两个大素数*/

mul(p,q,n);

mov(p,p1);

p1[0]--;

mov(q,q1);

q1[0]--; /*/q-1;*/

mul(p1,q1,m);//m=(p-1)*(q-1)

erand(e,m);

rsad(e,m,d);

return true;

}

//////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: