• 2022秋季信息安全实验2


    一、请将“三、RSA加密算法的实现”这个题目的修改正确后的所有代码粘贴在下方(字体五号):注意:请用Java、Python等语言改写程序,提交改写后的代码。

    C++:
    在这里插入图片描述

    #include
    #include
    #include
    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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    二、请用教材41页介绍的平方-乘算法计算下列各式的值,并编程实现平方-乘算法来进行验证。编程语言不限,将算法实现为1个函数,接收输入,给出输出,请将完整的函数代码粘贴在下方,代码中注释输入输出参数的意义及代码编译环境。

    (1) 34^60 mod 51的结果是:34
    (2) 345^89 mod 101的结果是:34
    (3) 请注明所用编程语言,并将函数代码粘贴在下方(字体五号):
    C++:
    在这里插入图片描述

    #include
    #include
    #include 
    #include 
    #include
    #include
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    锐捷网络C++开发实习有感
    HTTP/HTTPS协议
    【iOS开发】-UIViewController加载过程和生命周期
    2011-2022年北大法宝省市县环保行政处罚数据
    django-项目
    实现ALV页眉页脚
    一周速学SQL Server(第四天)
    [WPF] 使用 HandyControl 的 CirclePanel 画出表盘刻度
    【Linux】——目录结构
    计算机网络
  • 原文地址:https://blog.csdn.net/qq_61963074/article/details/126711313