密码学RSA算法通过C++实现

sunner543 2008-04-02 11:59:57
这段程序如题,有谁能帮我解释下最后一段的RSA各行的意思。谢谢哈。


//头文件BigInt.h

#ifndef BIGINT_H
#define BIGINT_H


#define BI_MAXLEN 8

class CBigInt
{
public:
unsigned m_nLength;
unsigned long m_ulValue[BI_MAXLEN];
CBigInt();

void Mov(unsigned __int64 A);
void Mov(CBigInt& A);
CBigInt Sub(CBigInt& A);
CBigInt Mul(CBigInt& A);
CBigInt Mod(CBigInt& A);
CBigInt Sub(unsigned long A);
CBigInt Mul(unsigned long A);
CBigInt Div(unsigned long A);
unsigned long Mod(unsigned long A);
int Cmp(CBigInt& A);
CBigInt ModExp(CBigInt& A, CBigInt& B);
};

#endif

//原文件BigInt.cpp

#include "BigInt.h"

//构造大数对象并初始化为零
CBigInt::CBigInt()
{
m_nLength=1;
for(int i=0;i <BI_MAXLEN;i++)m_ulValue[i]=0;
}


//大数比较
int CBigInt::Cmp(CBigInt& A)
{
if(m_nLength>A.m_nLength)return 1;
if(m_nLength <A.m_nLength)return -1;
for(int i=m_nLength-1;i>=0;i--)
{
if(m_ulValue[i]>A.m_ulValue[i])return 1;
if(m_ulValue[i] <A.m_ulValue[i])return -1;
}
return 0;
}

//大数赋值
void CBigInt::Mov(CBigInt& A)
{
m_nLength=A.m_nLength;
for(int i=0;i <BI_MAXLEN;i++)
m_ulValue[i]=A.m_ulValue[i];
}
void CBigInt::Mov(unsigned __int64 A)
{
if(A>0xffffffff)
{
m_nLength=2;
m_ulValue[1]=(unsigned long)(A>>32);
m_ulValue[0]=(unsigned long)A;
}
else
{
m_nLength=1;
m_ulValue[0]=(unsigned long)A;
}
for(int i=m_nLength;i <BI_MAXLEN;i++)m_ulValue[i]=0;
}

//大数相减
CBigInt CBigInt::Sub(CBigInt& A)
{
CBigInt X;
X.Mov(*this);
if(X.Cmp(A) <=0){X.Mov(0);return X;}
unsigned carry=0;
unsigned __int64 num;
unsigned i;
for(i=0;i <m_nLength;i++)
{
if((m_ulValue[i]>A.m_ulValue[i]) ¦ ¦((m_ulValue[i]==A.m_ulValue[i])&&(carry==0)))
{
X.m_ulValue[i]=m_ulValue[i]-carry-A.m_ulValue[i];
carry=0;
}
else
{
num=0x100000000+m_ulValue[i];
X.m_ulValue[i]=(unsigned long)(num-carry-A.m_ulValue[i]);
carry=1;
}
}
while(X.m_ulValue[X.m_nLength-1]==0)X.m_nLength--;
return X;
}


CBigInt CBigInt::Sub(unsigned long A)
{
CBigInt X;
X.Mov(*this);
if(X.m_ulValue[0]>=A){X.m_ulValue[0]-=A;return X;}
if(X.m_nLength==1){X.Mov(0);return X;}
unsigned __int64 num=0x100000000+X.m_ulValue[0];
X.m_ulValue[0]=(unsigned long)(num-A);
int i=1;
while(X.m_ulValue[i]==0){X.m_ulValue[i]=0xffffffff;i++;}
X.m_ulValue[i]--;
if(X.m_ulValue[i]==0)X.m_nLength--;
return X;
}

//大数相乘
CBigInt CBigInt::Mul(CBigInt& A)
{
if(A.m_nLength==1)return Mul(A.m_ulValue[0]);
CBigInt X;
unsigned __int64 sum,mul=0,carry=0;
unsigned i,j;
X.m_nLength=m_nLength+A.m_nLength-1;
for(i=0;i <X.m_nLength;i++)
{
sum=carry;
carry=0;
for(j=0;j <A.m_nLength;j++)
{
if(((i-j)>=0)&&((i-j) <m_nLength))
{
mul=m_ulValue[i-j];
mul*=A.m_ulValue[j];
carry+=mul>>32;
mul=mul&0xffffffff;
sum+=mul;
}
}
carry+=sum>>32;
X.m_ulValue[i]=(unsigned long)sum;
}
if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=(unsigned long)carry;}
return X;
}


CBigInt CBigInt::Mul(unsigned long A)
{
CBigInt X;
unsigned __int64 mul;
unsigned long carry=0;
X.Mov(*this);
for(unsigned i=0;i <m_nLength;i++)
{
mul=m_ulValue[i];
mul=mul*A+carry;
X.m_ulValue[i]=(unsigned long)mul;
carry=(unsigned long)(mul>>32);
}
if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=carry;}
return X;
}

//大数相除
CBigInt CBigInt::Div(unsigned long A)
{
CBigInt X;
X.Mov(*this);
if(X.m_nLength==1){X.m_ulValue[0]=X.m_ulValue[0]/A;return X;}
unsigned __int64 div,mul;
unsigned long carry=0;
for(int i=X.m_nLength-1;i>=0;i--)
{
div=carry;
div=(div < <32)+X.m_ulValue[i];
X.m_ulValue[i]=(unsigned long)(div/A);
mul=(div/A)*A;
carry=(unsigned long)(div-mul);
}
if(X.m_ulValue[X.m_nLength-1]==0)X.m_nLength--;
return X;
}


//大数求模
CBigInt CBigInt::Mod(CBigInt& A)
{
if(A.m_nLength==1)
{
CBigInt X;
X.m_ulValue[0]=Mod(A.m_ulValue[0]);
return X;
}
CBigInt X,Y;
int len;
unsigned __int64 num,div;
unsigned long carry=0;
X.Mov(*this);
while(X.Cmp(A)>0)
{
if(X.m_ulValue[X.m_nLength-1]>A.m_ulValue[A.m_nLength-1])
{
len=X.m_nLength-A.m_nLength;
div=X.m_ulValue[X.m_nLength-1]/(A.m_ulValue[A.m_nLength-1]+1);
}
else if(X.m_nLength>A.m_nLength)
{
len=X.m_nLength-A.m_nLength-1;
num=X.m_ulValue[X.m_nLength-1];
num=(num < <32)+X.m_ulValue[X.m_nLength-2];
if(A.m_ulValue[A.m_nLength-1]==0xffffffff)div=(num>>32);
else div=num/(A.m_ulValue[A.m_nLength-1]+1);
}
else
{
X.Mov(X.Sub(A));
break;
}
Y.Mov(div);
Y.Mov(Y.Mul(A));
Y.m_nLength+=len;
for(int i=Y.m_nLength-1;i>=len;i--) Y.m_ulValue[i]=Y.m_ulValue[i-len];
for(i=0;i <len;i++) Y.m_ulValue[i]=0;
X.Mov(X.Sub(Y));
}
if(X.Cmp(A)==0)X.Mov(0);
return X;
}

unsigned long CBigInt::Mod(unsigned long A)
{
if(m_nLength==1)return(m_ulValue[0]%A);
unsigned __int64 div;
unsigned long carry=0;
for(int i=m_nLength-1;i>=0;i--)
{
div=carry*0x100000000+m_ulValue[i];
carry=(unsigned long)(div-((div/A)*A));
}
return carry;
}


//蒙哥马利算法求模幂
CBigInt CBigInt::ModExp(CBigInt& A, CBigInt& B)
{
CBigInt X,Y,Z;
X.Mov(1);
Y.Mov(*this);
Z.Mov(A);
while((Z.m_nLength!=1) ¦ ¦Z.m_ulValue[0])
{
if(Z.m_ulValue[0]&1)
{
Z.Mov(Z.Sub(1));
X.Mov(X.Mul(Y));
X.Mov(X.Mod(B));
}
else
{
Z.Mov(Z.Div(2));
Y.Mov(Y.Mul(Y));
Y.Mov(Y.Mod(B));
}
}
return X;
}

//原文件主程序RSA.cpp

#include "BigInt.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
CBigInt m,e,n,d,c,m1;
int i;

m.m_nLength=4;
m.m_ulValue[3]=0x0;
m.m_ulValue[2]=0x0;
m.m_ulValue[1]=0x0;
m.m_ulValue[0]=0x45e;

printf("The initial plainttext m is:\n");
for(i=BI_MAXLEN-5;i>=0;i--)
printf("%x\n",m.m_ulValue[i]);


e.m_nLength=1;
e.m_ulValue[0]=0x34703;

n.m_nLength=4;
n.m_ulValue[3]=0x78CDED41;
n.m_ulValue[2]=0xF71A0BF9;
n.m_ulValue[1]=0xA1F36E0A;
n.m_ulValue[0]=0x60F3EE89;


c.Mov(m.ModExp(e,n));

printf("The ciphertext encrypted c is:\n");
for(i=BI_MAXLEN-5;i>=0;i--)
printf("%x\n",c.m_ulValue[i]);


d.m_nLength=4;
d.m_ulValue[3]=0x4C9327F3;
d.m_ulValue[2]=0x70B028FD;
d.m_ulValue[1]=0x08D56387;
d.m_ulValue[0]=0xFCC6161B;

m1.Mov(c.ModExp(d,n));

printf("The plainttext decrypted m1 is:\n");
for(i=BI_MAXLEN-5;i>=0;i--)
printf("%x\n",m1.m_ulValue[i]);



return 0;
}
...全文
547 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Supper_Jerry 2008-04-02
  • 打赏
  • 举报
回复
直接向mathe提问。到数据结构算法版
分给我留下。
sunner543 2008-04-02
  • 打赏
  • 举报
回复
算法懂得。但是代码看不懂。C++菜鸟
sunner543 2008-04-02
  • 打赏
  • 举报
回复
直接向mathe提问。到数据结构算法版
分给我留下。
什么意思。虽然不懂。但是分还是给你了。可以的话解释一下。刚加的论坛。C++菜鸟
vvpisces 2008-04-02
  • 打赏
  • 举报
回复
自己google一下算法,然后对应代码看呀!
oo 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Supper_Jerry 的回复:]
直接向mathe提问。到数据结构算法版
分给我留下。
[/Quote]
mjzg89 2008-04-02
  • 打赏
  • 举报
回复
额,这个我不太擅长哦
课程简介    随着”新基建“的推行,其中涉及到的工业互联网、物联网、人工智能、云计算、区块链,无一不是与安全相关,所有数据的存储、传输、签名认证都涉及到密码学技术,所以在这样的大环境下再结合我多年安全开发经验,设计出这门课程。    因为密码学技术在新基建中的重要性,所以使其成为底层开发人员所必备的技能。特别是现在的区块链技术是全面应用密码学,大数据技术和人工智能技术也要解决隐私安全问题。所以现在学习相关技术是非常必要的技术储备,并且可以改造现有的系统,提升其安全性。课程学习目标了解DES算法原理VS2019创建C++项目,并导入openssl库学会OpenSSL DES算法加解密接口加密文件并做PKCS7 Padding 数据填充解密数据并做数据填充解析课程特点    面向工程应用    市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。    从零实现部分算法    课程中实现了base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法实现,从而加深对密码学的理解。    理论与实践结合    课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。    如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。    代码现场打出    代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,    易学不枯燥    课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。课程用到的技术    课程主要演示基于 VS2019 C++,部分演示基于ubuntu 18.04 GCC makefile    如果没有装linux系统,对本课程的学习也没有影响    课程中的OpenSSL基于最新的3.0版本,如果是openss 1.1.1版本也支持,再低的版本不支持国密算法。 课程常见问题课程讲解用的什么平台和工具?    课程演示主要在windows,基于VS2019 ,一些项目会移植到Linux在ubuntu18.04上我不会Linux能否学习本门课程?    可以的,课程主要在Windows上,Linux部分只是移植,可以暂时跳过,熟悉了Linux再过来看我不会C/C++ 语言是否能学习本门课程?    至少要会C语言,C++特性用得不多,但做了一个封装,可以预习一些C++基础。会不会讲算法实现,会不会太难学不会?    课程偏工程应用,具体的AES,椭圆曲线、RSA算法只通过图示讲原理,一些简单hash算法会读一些源码,并不去实现,课程中会单独实现简洁的XOR对称加密和base16算法(代码量不大易懂)。其他的应用我们都基于OpenSSL3.0的SDK调用算法。课程提供源码和PPT吗?    课程中所有讲解的源码都提供,课程的上课的ppt也提供,PPT提供pdf版,只可以用于学习,不得商用,代码可以用于商用软件项目,涉及到开源系统部分,需要遵守开源的协议,但不得用于网络教学。要观看全部内容请点击c++实战区块链核心密码学-基于opensslhttps://edu.csdn.net/course/play/29593

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧