RSA加密软件的实现Word格式文档下载.docx

上传人:b****5 文档编号:21408080 上传时间:2023-01-30 格式:DOCX 页数:8 大小:16.59KB
下载 相关 举报
RSA加密软件的实现Word格式文档下载.docx_第1页
第1页 / 共8页
RSA加密软件的实现Word格式文档下载.docx_第2页
第2页 / 共8页
RSA加密软件的实现Word格式文档下载.docx_第3页
第3页 / 共8页
RSA加密软件的实现Word格式文档下载.docx_第4页
第4页 / 共8页
RSA加密软件的实现Word格式文档下载.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

RSA加密软件的实现Word格式文档下载.docx

《RSA加密软件的实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《RSA加密软件的实现Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。

RSA加密软件的实现Word格式文档下载.docx

用512位(或以上)数字表示私(公)有密钥十进制为154位。

单向trap-door函数:

满足1 

— 

3性质的函数 

加密步骤:

把RSA算法的实现程序转化为在0 

N-1之间的数字。

(转化方式多样,将大信息分成若干小块,每一小块用自己的小于N-1的数表示) 

通过把没个数字为变成为它的正次幂来加密,再将结果对N求模,得到的值作为加密信息,即加密文件C。

对文件C解密,收件人对C中的数据进行D次升幂运算,再将结果对N求模,结果代表了加密文件的块。

用与加密相反的步骤把加密信息转化成原文件,公开加密方法(E,D),保密解密密码(D,N)。

数学原理实现步骤:

找两个大质数:

和 

算出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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1