RSA加密软件的实现Word格式文档下载.docx
《RSA加密软件的实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《RSA加密软件的实现Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
用512位(或以上)数字表示私(公)有密钥十进制为154位。
单向trap-door函数:
满足1
—
3性质的函数
加密步骤:
把RSA算法的实现程序转化为在0
N-1之间的数字。
(转化方式多样,将大信息分成若干小块,每一小块用自己的小于N-1的数表示)
通过把没个数字为变成为它的正次幂来加密,再将结果对N求模,得到的值作为加密信息,即加密文件C。
对文件C解密,收件人对C中的数据进行D次升幂运算,再将结果对N求模,结果代表了加密文件的块。
用与加密相反的步骤把加密信息转化成原文件,公开加密方法(E,D),保密解密密码(D,N)。
数学原理实现步骤:
找两个大质数:
P
和
Q
算出N(公共模量)eg:
N=P*Q
在一个265位的密码系统中,N将是一个至少300位的数
找一个小于N的E,使E和(P-1)*(Q-1)互质
计算出D,使E*D=1MOD(P-1)*(Q-1)
共用密钥为(E,D),私有密钥为(D,N),不可将P、Q两个数公开,最好将其销毁(如:
PGP等软件将P和Q都保存在深层内部操作中)。
具体实现
BIGNUMBER文件夹是一个大数类。
代码如下
/*
*
*
大数类与大数串类
主要用于对大数的计算
类实现文件
*/
#include<
string.h>
stdio.h>
time.h>
#include"
BigNumber.h"
//////////////////////////////////////////////////////////////////////////////
//
//
CBigNum
类
////////////////////////////////////////////////////////
//构造函数
//无参构造
CBigNum:
:
CBigNum():
m_arVal(0),m_nSize(0)
{
}
//带一个ULONG型数的构造
CBigNum(unsignedintnValue):
if(m_arVal!
=NULL)
delete[]m_arVal;
//分配两个ULONG型空间
m_nSize=2;
m_arVal=newunsignedint[m_nSize];
//存低两字节
m_arVal[0]=nValue&
0xFFFF;
//存高两字节
m_arVal[1]=nValue>
>
16;
//带字符串型的构造
CBigNum(constchar*szSourceVal):
//直接指向该字符串
*this=szSourceVal;
//跟CBigNum的构造
CBigNum(constCBigNum©
):
m_nSize(0),m_arVal(0)
unsignedintnIdx;
//调整大小为所给的大小
Resize(copy.m_nSize);
//每一位赋值
for(nIdx=0;
nIdx<
m_nSize;
nIdx++)
m_arVal[nIdx]=copy.m_arVal[nIdx];
///////////////////////////////////////////////
//析构
~CBigNum()
//删除内存空间
//设置指针为空
m_arVal=NULL;
//大小为0
m_nSize=0;
//重载操作符=(后面是字符串)
CBigNum&
CBigNum:
operator=(constchar*szSourceVal)
unsignedintnLen=strlen(szSourceVal);
//字符串长度
constchar*pChar;
CBigNumPow10;
operator=(0U);
//指针不为空
Pow10=1;
//初始1
//从字符串尾开始,从尾向头循环
for(pChar=szSourceVal+nLen-1,nIdx=0;
pChar>
=szSourceVal;
pChar--,nIdx++)
//(*pChar-'
0'
)->
将字符型数字转变为数字相当于&
0x0F或-0x30
//也就是把字符串转换为数字
operator+=(Pow10*(unsignedint)(*pChar-'
));
Pow10*=10;
//返回结果
return*this;
//重载操作符+=
如
A+=B;
operator+=(constCBigNum&
rhs)
//B的大于A,则重新调整B的大小
if(rhs.m_nSize>
m_nSize)
Resize(rhs.m_nSize);
//从头到尾循环,对每一位进行+=操作
rhs.m_nSize;
m_arVal[nIdx]+=rhs.m_arVal[nIdx];
//处理进位情况
HandleCarry();
//重载操作符=
(后面是ULONG型)
operator=(unsignedintintVal)
//所有位清0
m_arVal[nIdx]=0;
//如果大小小于等于0,则调整大小为1
if(m_nSize<
=0)
Resize
(1);
//直接将值给0下标处
m_arVal[0]=intVal;
//再处理进位
//处理进位
voidCBigNum:
HandleCarry()
//从头到尾
for(nIdx=0;
//高两字节不全为0,即含有1
if((m_arVal[nIdx]&
0xFFFF0000)!
//当前是最后两位
if(nIdx>
=m_nSize-1)
//调整大小
Resize(nIdx+2);
//当前高位放到后一位去
m_arVal[nIdx+1]+=(m_arVal[nIdx]>
16);
//当前只取低两字节的位
m_arVal[nIdx]&
=0xFFFF;
//重新分配大小
Resize(unsignedintnNewSize)
unsignedint*pNewVal;
//分配新空间
if(nNewSize>
0)
pNewVal=newunsignedint[nNewSize];
else
pNewVal=NULL;
//如果新要求数组小于原数组,则减小原数组大小
if(nNewSize<
m_nSize=nNewSize;
//值拷贝
pNewVal[nIdx]=m_arVal[nIdx];
//如果新数组大于原数组,则在新数组大出来的部分填充0
for(;
nIdx<
nNewSize;
pNewVal[nIdx]=0;
//释放原数组空间
if(m_arVal)
//设置好新指针和大小
m_arVal=pNewVal;