一、简述
实验目的:掌握Rabin公钥密码体制的原理,并能利用该原理保障数据传输的安全性
实验内容与要求:
用户Alice打算和用户Bob通信,然而,担心发送数据在网络上传输时的安全,请结合Rabin公钥密码体制原理,分析、设计并实现一套方案,确保数据在网络上的安全传输。
输入:自己姓名的拼音字母,如,张三,则输入为zhang san
密钥:密钥值不限,密钥p和q为素数,满足
输出:要有密文的输出,以及密文解密,还原为明文的输出
说明:可以根据ASCII码表,将拼音字母转换为对应十进制数,例如,LIHAO转换为76,73,72,65,79,也可以选择其他编码方式。
二、实现
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int exgcd(int a, int b, int* x, int* y)//扩展欧几里得算法解同余方程组的s,t;
{
if (b == 0)
{
*x = 1;
*y = 0;
return a;
}
int ret = exgcd(b, a % b, x, y);
int t = *x;
*x = *y;
*y = t - a / b * (*y);
return ret;
}
int main()
{
string abc;
cin >> abc;
//转义
const char* s = abc.c_str();
int N = strlen(s);
int pt[100];
for (int i = 0; i < N; i++)
{
pt[i] = int(s[i]);
}
//加密
int p = 1000003, q = 1000033;
long long n = p * q;
int ct[100];
char* s2 = new char[100];
cout << "加密后(ASCII码,密文):";
for (int i = 0; i < N; i++)
{
ct[i] = pt[i] * pt[i] % n;
s2[i] = char(ct[i]);
cout << i + 1 <<"、"<< ct[i] << "," << s2[i] << " ";
}
cout << endl;
//解密
int b1, b2;
cout << "解密后:" << endl;
for (int i = 0; i < N; i++)
{
b1 = sqrt(ct[i] % p);
b2 = sqrt(ct[i] % q);
int t1, t2, s1, s2;
exgcd(p, q, &s1, &t1);
exgcd(q, p, &s2, &t2);
long long x1 = (b1 * t1 * q + b2 * t2 * p) % n;
long long x2 = (b1 * t1 * q + -b2 * t2 * p) % n;
long long x3 = (-b1 * t1 * q + b2 * t2 * p) % n;
long long x4 = (-b1 * t1 * q + -b2 * t2 * p) % n;
cout << "第" << i + 1 << "个字母可能的(ASCII码,明文)是:";
cout <<"1、"<< x1 << "," << char(x1) << " ";
cout <<"2、"<< x2 << "," << char(x2) << " ";
cout <<"3、"<< x3 << "," << char(x3) << " ";
cout <<"4、"<< x4 << "," << char(x4) << " ";
cout << endl;
}
}
三、参考
求t用到的扩展欧几里得算法:关于欧几里得及其扩展算法(C语言实现,更新C++模板)_c语言扩展欧几里得算法-优快云博客2
***11.29错误修正:部分字母小写加密后解密会导致排版错误,现已将密钥扩大一个数量级,能加密解密26个字母大小写。