实验6实验内容与步骤:
RSA加解密算法步骤
①随机地选择两个大素数 p和 q,而且保密;
②计算n=pq,将 n公开;
③计算φ(n)=(p-1)(q-1),对φ(n)保密;
④随机选取一个正整数e,1<e<φ(n)且(e,φ(n))=1,将 e公开;
⑤根据 ed=1 mod φ(n),求出d,并对d保密;
⑥加密运算:C=M e mod n
⑦解密运算:M=C d mod n
RSA加解密算法思考
加密
对于明文M<n,密文C = Me (mod n)
思考:如果M>n?
1.把长信息分割成若干段短消息,每段分别加密;
2.先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。
解密
对密文C的解密:M=Cd(mod n)
RSA加解密算法题目
RSA密码示例
选择素数:p=47 和 q=71。
计算n和(n):
n = pq =47×71=3337,
(n)=(p–1)(q-1)=46×70=3220。
选择e:使gcd(e, 3220)=1,选取e=79;
决定d:de≡1 mod 3220,得d =1019
公开公钥 {79, 3337},
保存私钥 {1019, 3337};
练习:明文M=688 232 687 966 668 3,求密文C.
代码如下
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main(){
int p=47;
int q=71;
int n=3337;
int _n=3220;
int e=79;
int d=1019;
int M[6]={688,232,687,966,668,3};
//加密运算:C=M e mod n
for(int i=0;i<6;i++){
int m=M[i];
//Me次方 数据太大 这样来处理
int number=1;
int num=m;
for(int j=0;j<e;j++){
number=(number*num)%n;
}
cout<<number<<" ";
}
}
RSA加解密算法实验任务
实验(1)令 p=3,q=11,d=7,m=5, 编程计算密文 C 。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//求最大公约数
int gcd(int m,int n){
if(n==0){
return m;
}else{
return gcd(n,m%n);
}
}
int main(){
int p=3;
int q=11;
int d=7;
int M=5;
int n=p*q;
int _n=(p-1)*(q-1);
//求e
int e=0;
for(int i=1;i<_n;i++){
if(gcd(_n,i)==1 && (d*i)%_n==1){
e=i;
//cout<<e<<endl;
}
}
//加密运算:C=M e mod n
int C_=pow(M,e);
int C=C_%n;
cout<<C;
}
实验(2)设 RSA 密码的 e=3,n=33,C=9, 编程计算明文 M 。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//求最大公约数
int gcd(int m,int n){
if(n==0){
return m;
}else{
return gcd(n,m%n);
}
}
//判断是否是素数
bool Prime(int x){
if(x==1){
return true;
}
for(int i=2;i<=sqrt(x);i++){
if(x%i==0){
return false;
}
}
return true;
}
int main(){
int e=3;
int n=33;
int C=9;
//求pq
int p=0,q=0;
for(int i=3;i<n;i++){
for(int j=3;j<n;j++){
if(Prime(i)&&Prime(j)&&i*j==n){
if(gcd(e,(p-1)*(q-1)) ==1){
p=i;
q=j;
}
}
}
}
//cout<<p<<q;
//求d
int d;
int _n=(q-1)*(p-1);
for(int i=1;i<_n;i++){
if((i*e)%_n==1){
d=i;
}
}
//cout<<d;
//解密运算:M=C d mod n
int M_=pow(C,d);
int M=M_%n;
cout<<M;
}
实验(3)令 p=17,q=11, e=7,试计算 RSA 密码其余参数 。进一步对于 m=88, 计算密文 C 。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//求最大公约数
int gcd(int m,int n){
if(n==0){
return m;
}else{
return gcd(n,m%n);
}
}
int main(){
int p=17;
int q=11;
int e=7;
int M=88;
int n=p*q;
int _n=(p-1)*(q-1);
cout<<"n: "<<n<<endl;
cout<<"_n: "<<_n<<endl;
//求d
int d;
for(int i=1;i<_n;i++){
if((i*e)%_n==1){
d=i;
}
}
cout<<"d: "<<d<<endl;
//加密运算:C=M e mod n
long long C_=pow(M,e);
int C=C_%n;
cout<<"密文C: "<<C;
}