密码设计课写过的RSA算法
代码写的丑,有学这门课需要的道友可以看一下
- main函数
#include<iostream>
#include<math.h>
#include"ProRPN.h"
#include<cstdlib>
#include"ProRPN.h"
using namespace std;
int main(void) {
unsigned __int64 *pa, *qa, *pb, *qb;
pa = new(unsigned __int64);
qa = new(unsigned __int64);
pb = new(unsigned __int64);
qb = new(unsigned __int64);
*pa = *qa = *pb = *qb = 0;
RSA A;
RSA B;
B.pute(41);
productrpn(pa, qa, pb, qb);
A.putp(pa);
A.putq(qa);
B.putp(pb);
B.putq(qb);
A.putpq();
B.putpq();
A.putd(rsa(A.getp(), A.getq(), A.gete()));
B.putd(rsa(B.getp(), B.getq(), B.gete()));
A.prits();
A.pritsha();
A.puts();
ERSA(A.getd(), B.gete(),A.gets(), A.getsha(), A.getpq(), B.getpq());
DRSA(A.gete(), B.getd(), A.getpq(), B.getpq());
return 0;
}
- 处理函数头文件
#pragma once
#include<iostream>
using namespace std;
unsigned __int64 quick(unsigned __int64 a, unsigned __int64 b, unsigned __int64 c);//快速模平方算法
unsigned __int64 Rpn(unsigned __int64 n, unsigned __int64 m);//Random prime number 随机素数
bool Miller_Rabin(unsigned __int64 n,int z);//素性检测
bool proRPN(unsigned __int64 x, unsigned __int64 y);
void productrpn(unsigned __int64 *pa, unsigned __int64 *qa, unsigned __int64 *pb, unsigned __int64 *qb);
bool trydiv(unsigned __int64 x,unsigned __int64* y);
unsigned __int64 rsa(unsigned __int64 p, unsigned __int64 q, unsigned __int64 e);//辗转相除求私钥d
void ERSA(unsigned __int64 da, unsigned __int64 eb, char* s1, unsigned __int64* sha1, unsigned __int64 pqA, unsigned __int64 pqB);//加密函数
void DRSA(unsigned __int64 ea, unsigned __int64 db, unsigned __int64 pqA, unsigned __int64 pqB);//解密函数
class RSA {
private:
unsigned __int64 p, q;//p,q为两个大素数
unsigned __int64 pq;//两个大素数的乘积
unsigned __int64 e;//公钥
unsigned __int64 d;//私钥
char s[100];//消息
unsigned __int64 sha[40];//消息的摘要值,这里为随意写的160bit值
public:
RSA() {//将题目中要求的数据放入构造函数
e = 17;
s[0] = '3'; s[1] = '2'; s[2] = '6'; s[3] = '5'; s[4] = '5';
unsigned __int64 x[40] = { 0xa,0x9,0x9,0x9,0x3,0xe,0x