📄 rsa.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
long int E_KEY;
long int D_KEY;
unsigned long int N;
unsigned long int PN;
/*
函数作用:将十进制数用二进制表示
参数:十进制数
返回值:转换成二进制的数组
*/
int *ten_to_two(unsigned long int m)
{
int *array;
unsigned long int i, k;
array = new int[1024];
i = 0;
k = m;
while(k != 0)
{
array[i] = (k % 2);
k = k / 2;
i++;
}
array[i] = 2;
return array;
}
/*
函数作用:快速指数算法
参数:指数变成二进制表示的数组, 底数
返回值:计算的出的结果
*/
unsigned long int pow(int *array, unsigned long int a)
{
unsigned long int d = 1;
int i = 0, k;
while(array[i] != 2)
i++;
k = i;
for(i = k - 1;i >= 0;i--)
{
d = (d * d) % N;
if(array[i] == 1)
d = (d * a) % N;
}
return d;
}
/*
函数作用:素数判断
参数:要进行判断的素数
返回值:是否是素数的标志
*/
int judge_prime(unsigned long int prime)
{
unsigned long int k, i;
int flag = 1;
k = unsigned long int(sqrt((double)prime));
for(i = 2;i < k;i++)
{
if((prime % i) == 0)
{
flag = 0;
return flag;
}
}
return flag;
}
int gcd(int a, int n)
{
int i;
if(n % a == 0)
return a;
else
{
i = 1;
while(1)
{
i++;
if((a % i == 0) && (n % i == 0))
return i;
else if(i > 1 + (int)(sqrt((double)a)))
return -1;
}
}
}
/*
函数作用:产生公钥和私钥
参数:无
返回值:无
*/
void make_key()
{
unsigned long int p, q, i, j;
char string[12];
int flag = 0, k = 0;
p = q = 0;
srand(time(NULL));
while(flag != 1)
{
p = rand() % 256;
flag = judge_prime(p);
}
flag = 0;
while(flag != 1)
{
q = rand() % 256;
flag = judge_prime(q);
}
N = p * q;
i = 0;
PN = (p - 1) * (q - 1);
cout<<"请输入构造密钥的字符(11位例如:tangtaishan):"<<endl;
cin>>string;
for(i = 0;i < 11;i++)
{
k += (int)string[i];
k = (k * k +1) % 256;
flag = gcd(k, PN);
if(flag == -1)
break;
}
E_KEY = k;
j = 2;
i = (E_KEY * j) % PN;
while(i != 1)
{
j += 1;
i = (E_KEY * j) % PN;
}
D_KEY = j;
}
/*
函数作用:rsa加密算法
参数:无
返回值:无
*/
void rsa_encrytion()
{
FILE *fp1, *fp2;
unsigned long int all = 0;
unsigned char str1[8], str2[16];
int *array, i, j;
unsigned char head[66];
fp1 = fopen("5.bmp", "rb");
fp2 = fopen("15.bmp", "wb");
fread(head, sizeof(unsigned char), 66, fp1);
fwrite(head, sizeof(unsigned char), 66, fp2);
make_key();
array = ten_to_two(E_KEY);
fread(str1, sizeof(unsigned char), 8, fp1);
while(!feof(fp1))
{
for(i = 0;i < 8;i++)
{
if(str1[i] < 0)
str1[i] = str1[i] + 256;
all = pow(array, (unsigned long int)str1[i]);
str2[2 * i] = (unsigned char)(all % 100);
str2[2 * i + 1] = (unsigned char)(all / 100);
}
for(j = 0;j < 8;j++)
str1[j] = str2[j];
fwrite(str1, sizeof(unsigned char), 8, fp2);
for(j = 8;j < 16;j++)
str1[j - 8] = str2[j];
fwrite(str1, sizeof(unsigned char), 8, fp2);
fread(str1, sizeof(unsigned char), 8, fp1);
}
fclose(fp1);
fclose(fp2);
}
/*
函数作用:rsa解密算法
参数:无
返回值:无
*/
void rsa_distion()
{
FILE *fp1, *fp2;
unsigned long int all = 0;
unsigned char str1[8], str2[8];
int *array, i;
unsigned char head[66];
fp1 = fopen("15.bmp", "rb");
fp2 = fopen("1115.bmp", "wb");
fread(head, sizeof(unsigned char), 66, fp1);
fwrite(head, sizeof(unsigned char), 66, fp2);
array = ten_to_two(D_KEY);
fread(str1, sizeof(unsigned char), 8, fp1);
while(!feof(fp1))
{
for(i = 0;i < 4;i++)
{
all = str1[2 * i + 1] * 100 + str1[2 * i];
all = pow(array, all);
str2[i] = (unsigned char)all;
}
fread(str1, sizeof(unsigned char), 8, fp1);
for(i = 0;i < 4;i++)
{
all = str1[2 * i + 1] * 100 + str1[2 * i];
all = pow(array, all);
str2[4 + i] = (unsigned char)all;
}
fwrite(str2, sizeof(unsigned char), 8, fp2);
fread(str1, sizeof(unsigned char), 8, fp1);
}
fclose(fp1);
fclose(fp2);
}
void main()
{
rsa_encrytion();
rsa_distion();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -