zoukankan      html  css  js  c++  java
  • 使用Python 模拟RSA 加密与解密

    一、关于

    RSA具体原理请移步其他文章,本文主要使用Python 来模拟RSA 算法的实现过程

    二、简要分析

    在RSA算法中,存在以下几个参数:

    1、大素数p、q

    2、n = p *q

    3、Phi_n = (p-q) * (q-1)

    4、E = 0x10001

    5、计算得到数d, 使得 e *d % phi_n = 1

    6、明文:a

    7、密文:b

    其中,公钥对(p, e)以及RSA加密算法对公众开放,私钥对(q, d)由加密者自己保留。RSA加密过程为:发送者使用公钥对明文加密得到密文,接收者使用私钥可以解密;RSA签名过程为:发送者使用私钥对明文进行加密(签名),接受者使用公钥可以成功解密,则证明发送者确实是私钥的拥有者。

    RSA加密实验基本流程:

    一、选取两个大素数p、q,并计算得到n、phi_n

    二、选取常用的e = 0x10001,方便将幂运算优化为左移,加快运算速度

    三、计算d,使用了扩展欧几里得算法

    四、输入明文a,将明文转化为可以用于计算的数字形式

    五、对a使用快速幂取模,得到密文b,以16进制显示

    RSA解密流程:

    六、对b使用快速幂取模,得到明文a,以字符形式显示

    三、Python 代码

    文件Main.py 为加密解密主程序,methods.py 文件内定义了一些被调用的函数

    #  RSA Generate By SOOWIN
    #  2019/11/26 
    #
    
    import math
    import os
    from methods import exgcd,quick_algorithm,get_prime
    
    # p = get_prime(20)
    # q = get_prime(10)
    
    p = 10001569
    q = 10001567
    print("p is : ",end='')
    print(p)
    print("q is : ",end='')
    print(q)
    n = p * q
    print("n is : ",end='')
    print(n)
    phi_n = (p-1) * (q-1)
    print("phi_n is : ",end='')
    print(phi_n)
    
    e = 0x10001
    d = 0
    d = exgcd(e, phi_n)
    if(d == 0):
        print("Can't generate a proper number d to fit the requirement.")
        os.system("pause")
    if(d < 0 ):
        d += phi_n
    print("d is : "+ str(d))
    
    mText = "Hpptus"
    mHex = mText.encode().hex()
    print("mHex is : ",end='')
    print(mHex)
    mInt = int(mHex,16)
    print("mInt is : ",end='')
    print(mInt)
    
    
    c = quick_algorithm(mInt, e, n)
    print("c is : ",end='')
    print(c)
    print("The message to be encrypt: "+mText)
    print("The encrypted message is: "+ str(bytes.fromhex(hex(c)[2:])))
    
    
    decr = quick_algorithm(c, d, n)
    
    # print(bytes.fromhex(hex(decr)[2:]))
    
    decrHex = bytes.fromhex(hex(decr)[2:])
    # print(decrHex)
    print("The message recovered: "+ str(decrHex,encoding="utf-8"))
    Main.py
    import sys,random
     
    def exgcd(m, n, x = 0, y = 0):
        if n == 0:
            x = 1
            y = 0
            return (m,x,y)
        a1 = b = 1
        a = b1 = 0
        c = m
        d = n
        q = int(c/d)
        r = c%d
        while r:
            c = d
            d = r
            t = a1
            a1 = a
            a = t-q*a
            t = b1
            b1 = b
            b = t-q*b
            q = int(c/d)
            r = c%d
        x = a
        y = b
        return x
    
    def quick_algorithm(a,b,c):
        a=a%c
        ans=1
        while b!=0:
            if b&1:
                ans=(ans*a)%c
            b>>=1
            a=(a*a)%c
        return ans
    methods.py
  • 相关阅读:
    Mysql 批量插入数据的方法
    sql server 多行合并一行
    跨服务器多库多表查询
    OPENQUERY用法以及使用需要注意的地方
    C# 判断操作系统的位数
    rpc介绍
    JavaScript decodeURI()与decodeURIComponent() 使用与区别
    UNIX 时间戳 C#
    C# winform javascript 互调用
    oracle 实例名和服务名以及数据库名区别
  • 原文地址:https://www.cnblogs.com/soowin/p/12008883.html
Copyright © 2011-2022 走看看