四种加密算法之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;
}
//////////////////////////
[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;
}
//////////////////////////
相关文章推荐
- 解决vc运行CMD秒退小问题
- C语言中堆、栈、队列
- c++学习心路历程
- 算法导论第二十五章-所有结点对的最短路径问题-Cpp代码实现
- 经典面试题---单链表的基本操作(C语言实现)
- 第16周项目三--电子字典
- B-树 C++模板类封装(有图有真相)
- 编写一个程序,打印输入中单词长度的直方图
- C++11新特性之新类型与初始化
- 设计模式之装饰器模式(C++)
- 读入一组文本行,并把最长的文本行打印出来
- c语言写多几个分号;;;fflush(stdout);居然不会报错?
- *leetcode 138 in cpp
- C++中的可变参数模板
- C语言多线程
- C++08、阶段练习---一个计算器类
- C++和C对字符串操作总结
- 字符串和数字之间的转换(C/C++)
- c语言 SetPixel
- C++编程笔记:struct和typedef struct的区别