2022秋季信息安全实验2-密码与隐藏技术2
一、请将“三、RSA加密算法的实现”这个题目的修改正确后的所有代码粘贴在下方(字体五号):注意:请用Java、Python等语言改写程序,提交改写后的代码。
C++:
#include<stdio.h>
#include<math.h>
#include<string.h>
int getd(int p,int q,int e){
int qn,d=1;
qn=(p-1)*(q-1);
while(d){
if((d*e)%qn==1){
return(d);
}else{
d++;
}
}
}
int pfcheng(int m,int a,int r)
{
int b[100],length=0;
int c=1;
do
{
b[length++]=a%2;
a=a/2;
}
while(a!=0);
while(length>=0)
{
c=(c*c)%r;
if(b[length]==1)
{
c=(c*m)%r;
}
length--;
}
return c;
}
int jiemi(int e,int n,int p){
int q;
q=pfcheng(p,e,n);
return q;
}
int jiami(int e,int n,int p){
int q;
q=pfcheng(p,e,n);
return q;
}
int main(){
int prime1,prime2,p;
int d,e,n,miwen,minwen;
int getd(int p,int q,int e);
printf("请输入两个大的素数和公钥:\n");
scanf("%d%d%d",&prime1,&prime2,&e);
n=prime1*prime2;
printf("n为:%d\n",n);
d=getd(prime1,prime2,e);
printf("私有密匙是:%d\n",d);
printf("请输入要加密的数字串:\n");
scanf("%d",&p);
while(p!=0){
miwen=jiami(e,n,p);
printf("加密的数值是:%d\n",miwen);
minwen=jiemi(d,n,miwen);
printf("解密后的数值为:%d\n",minwen);
scanf("%d",&p);
}
}
Pytthon:
def getd(p,q,e):
d=1
qn=(p-1)*(q-1)
while(d):
if (d*e)%qn==1:
return (d)
else:
d+=1
def pfcheng(m,a,r):
b=[0 for i in range(m*a)]
length=0
c=1
b[length]=a%2
a=a//2
while(a!=0):
length+=1
b[length] = a % 2
a = a // 2
while(length>=0):
c=(c*c)%r
if(b[length]==1):
c=(c*m)%r
length-=1
return c
def jiemi(e,n,p):
q=pfcheng(p,e,n)
return q
def jiami(e,n,p):
q=pfcheng(p,e,n)
return q
while True:
miwen=0
minwen=0
print("请输入两个大的素数和公钥:")
prime1,prime2,e=map(int,input().split())
n=prime1*prime2
print("n为:"+str(n))
d=getd(prime1,prime2,e)
print("私有密匙是:"+str(d))
print("输入要加密的数字串:")
p=int(input())
while(p!=0):
miwen = jiami(e, n, p)
print("加密的数值是:"+str(miwen))
minwen=jiemi(d,n,miwen)
print("解密后的数值为:"+str(minwen))
p = int(input())
二、请用教材41页介绍的平方-乘算法计算下列各式的值,并编程实现平方-乘算法来进行验证。编程语言不限,将算法实现为1个函数,接收输入,给出输出,请将完整的函数代码粘贴在下方,代码中注释输入输出参数的意义及代码编译环境。
(1) 34^60 mod 51的结果是:34
(2) 345^89 mod 101的结果是:34
(3) 请注明所用编程语言,并将函数代码粘贴在下方(字体五号):
C++:
#include<iostream>
#include<cstdio>
#include <math.h>
#include <algorithm>
#include<cstring>
#include<stack>
#include<map>
using namespace std;
//位运算
int fastPow(int a,int n,int mod){
int base = a; //不定义 base,直接用 a 进行计算也行
int res = 1; //用 res 返回结果
while(n){
if(n & 1) //如果 n 的最后一位是 1,表示这个地方需要乘
res = (res * base) % mod;
base = (base * base) % mod; //推算乘积,a^2 --> a^4 --> a^9 --> a^16 ...
n >>= 1; // n 右移一位,把刚处理过的 n 的最后一位去掉
}
return res;
}
int main(){
long long a,n,mod;
while(~scanf("%d%d%d",&a,&n,&mod)){
int res;
res=fastPow(a,n,mod);
printf("%d\n",res);
}
return 0;
}
Python:
def fastExpMod(b, e, m):
result = 1
while e != 0:
if (e&1) == 1:
# ei = 1, then mul
result = (result * b) % m
e >>= 1
# b, b^2, b^4, b^8, ... , b^(2^n)
b = (b*b) % m
return result
while True:
a,n,mod=map(int,input().split())
print(fastExpMod(a,n,mod))