#include<iostream>
#include<string.h>
#include<string>
using namespace std;
#define SIZE 33
#define MULSIZE 2*SIZE
typedef struct Bigint
{
unsigned char num[SIZE];
}Bigint;
typedef struct Bigint2
{
unsigned char num[2 * SIZE];
}Bigint2;
Bigint p = {
0 };
Bigint q = {
0 };
Bigint N = {
0 };
Bigint PhiN = {
0 };
Bigint e = {
0 };
Bigint d = {
0 };
Bigint m = {
0 };
Bigint c = {
0 };
Bigint m1 = {
0 };
//初始化
Bigint Init(unsigned char str[], int length);
//复制
void Copy(Bigint& a, Bigint b);
//打印输出
void Print(Bigint a);
//打印输出并储存数组
void PrintNum(unsigned char* out, int& len, Bigint a);
//计算长度
int Length(Bigint a);
int Length(Bigint2 a);
//比较大小
int Compare(Bigint a, Bigint b); //a>b,a=b,a<b分别输出1,0,-1
int Compare(Bigint2 a, Bigint2 b);
//左移loop个字节
Bigint MoveLeft(Bigint a, int loop);
Bigint2 MoveLeft(Bigint2 a, int loop);
//右移一个比特
void BitMoveRight(Bigint& a);
//扩充数组
Bigint2 Extend(Bigint a);
//截断数组
Bigint Narrow(Bigint2 a);
//生成随机数
Bigint BigRand(Bigint n);
Bigint BigRandOdd(int bytes);
//基本运算
Bigint Add(Bigint a, Bigint b); // 加法,输入a,b, 返回a + b
Bigint2 Add(Bigint2 a, Bigint2 b); // 加法,输入a,b, 返回a + b
Bigint Sub(Bigint a, Bigint b); // 减法,输入a>b, 返回a - b
Bigint2 Sub(Bigint2 a, Bigint2 b); // 减法,输入a>b, 返回 a - b
Bigint2 Mul(Bigint a, Bigint b); // 乘法,输入a,b, 返回 a * b
Bigint Div(Bigint a, Bigint b); // 除法,输入a,b, 返回 a / b
Bigint Mod(Bigint a, Bigint b); // 求余,输入a,b, 返回 a % b
Bigint AddMod(Bigint a, Bigint b, Bigint n); // 模加: 输入a,b,模数n,返回 a + b mod n
Bigint SubMod(Bigint a, Bigint b, Bigint n); // 模减: 输入a>b,模数n,返回 a - b mod n
Bigint Sub2Mod(Bigint a, Bigint b, Bigint n); // 模减: 输入a,b,模数n,返回 a - b mod n
Bigint MulMod(Bigint a, Bigint b, Bigint n); // 模乘: 输入a,b,模数n,返回 a * b mod n
Bigint PowMod(Bigint a, Bigint b, Bigint n); // 模幂:输入a,b,模数n,返回 a ^ b mod n
Bigint GCD(Bigint a, Bigint b); // 最大公因数:输入a,b, 返回gcd(a, b)
//MillerRabin素性检测
bool MillerRabinKnl(Bigint& n); //单次MillerRabin素性检测
bool MillerRabin(Bigint& n, long loop); //loop次MillerRabin素性检测
//生成字节数为bytes的素数
Bigint GenPrime(int bytes);
//生成公私钥
Bigint GenE(Bigint PhiN);
bool Inverse(Bigint e, Bigint N, Bigint& d);
//加密
Bigint Encrypt(Bigint m, Bigint e, Bigint n);
//解密
Bigint Decrypt(Bigint c, Bigint d, Bigint n);
Bigint Init(unsigned char str[], int length)
{
Bigint res;
if (length > SIZE)
{
length = SIZE;
}
int i;
for (i = 0; i < length; i++)
res.num[i] = str[length - 1 - i];
for (i = length; i < SIZE; i++)
res.num[i] = 0;
return res;
}
void Copy(Bigint& a, Bigint b)
{
for (int i = 0; i < SIZE; i++)
a.num[i] = b.num[i];
}
void Print(Bigint a)
{
int res[2000];
int i = 0;
Bigint b = {
0 };
Bigint c = {
10 };
while (Compare(a, b) == 1)
{
res[i] = Mod(a, c).num[0];
a = Div(a, c);
i++;
}
//cout << "该数字是:" << endl;
for (int j = i - 1; j >= 0; j--)
{
//cout << res[j];
}
cout << endl;
}
void PrintNum(unsigned char* out, int& len, Bigint a)
{
int i = 0;
Bigint b = {
0 };
Bigint c = {
10 };
while (Compare(a, b
密码学课程设计-RSA
最新推荐文章于 2024-03-17 17:36:26 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)