2022秋季信息安全实验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))
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不服输的小乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值