现在的位置: 首页 > 综合 > 正文

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

2013年09月13日 ⁄ 综合 ⁄ 共 12933字 ⁄ 字号 评论关闭

RSA.h文件:

//! 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文件:

/*!
* @ 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;
}
//////////////////////////

抱歉!评论已关闭.