一、源文件三个rsa.h , rsa.c , main.c
//rsa.h
#include <stdio.h>
#define MAX_NUM 63001
#define MAX_PRIME 251
//! 返回代码
#define OK 100
#define ERROR_NOEACHPRIME 101
#define ERROR_NOPUBLICKEY 102
#define ERROR_GENERROR 103
unsigned int MakePrivatedKeyd( unsigned int uiP, unsigned int uiQ );
unsigned int GetPrivateKeyd( unsigned int iWhich );
unsigned int MakePairkey( unsigned int uiP, unsigned int uiQ, unsigned int uiD );
unsigned int GetPairKey( unsigned int &d, unsigned int &e );
void rsa_encrypt( int n, int e, char *mw, int iLength, int *&cw );
void rsa_decrypt( int n, int d, int *&cw, int cLength, char *mw );
void outputkey();
//rsa.c
#include "rsa.h"
//! 保存私钥d集合
struct pKeyset
{
unsigned int set[ MAX_NUM ];
unsigned int size;
}pset;
//! 保存公、私钥对
struct pPairkey
{
unsigned int d;
unsigned int e;
unsigned int n;
}pairkey;
// 名称:isPrime
// 功能:判断两个数是否互质
//
参数:m: 数a; n: 数b
// 返回:m、n互质返回true; 否则返回false
bool isPrime( unsigned int m, unsigned int n )
{
unsigned int i=0;
bool Flag = true;
if( m<2 || n<2 )
return false;
unsigned int tem = ( m > n ) ? n : m;
for( i=2; i<=tem && Flag; i++ )
{
bool mFlag = true;
bool nFlag = true;
if( m % i == 0 )
mFlag = false;
if( n % i == 0 )
nFlag = false;
if( !mFlag && !nFlag )
Flag = false;
}
if( Flag )
return true;
else
return false;
}
// 名称:MakePrivatedKeyd
// 功能:由素数Q、Q生成私钥d
//
参数:uiP: 素数P; uiQ: 素数Q
// 返回:私钥d
unsigned int MakePrivatedKeyd( unsigned int uiP, unsigned int uiQ )
{
unsigned int i=0;
//! 得到所有与z互质的数( 私钥d的集合 )
unsigned int z = ( uiP -1 ) * ( uiQ -1 );
pset.size = 0;
for( i=0; i<z; i++ )
{
if( isPrime( i, z ) )
{
pset.set[ pset.size++ ] = i;
}
}
return pset.size;
}