RSA加密算法Python实现

RSA加密算法Python实现RSA加密算法Python实现RSA加密算法是目前使用最广泛的加密方式,具体流程见RSA加密算法之前想过用C语言实现,但是由于C语言对整型的位宽有要求,RSA加密算法中需要使用的数字大小远远超出C语言中longlongint的最大值,最近学习了Python之后,发现Python没有这一要求,可以较容易的实现。以下模拟中只能输入数字,因为实际过程中所有文字信息都被转化成Unicode数字码传输,代码中没有做转化这一步,只模拟算法。fromrandomimportrandintfromd

大家好,又见面了,我是你们的朋友全栈君。

RSA加密算法Python实现

RSA加密算法是目前使用最广泛的加密方式,具体流程见RSA加密算法
之前想过用C语言实现,但是由于C语言对整型的位宽有要求,RSA加密算法中需要使用的数字大小远远超出C语言中long long int 的最大值,最近学习了Python之后,发现Python没有这一要求,可以较容易的实现。
在这里插入图片描述

from random import randint
from datetime import datetime

"""判断是否是素数"""
def is_sushu(sushu):
    for i in range(2,sushu):
        if sushu % i == 0:
            return False
    return True

"""随机生成指定范围的大素数"""
def Create_Sushu():
    while True:
        sushu = randint(100,1000 )#下限越大,加密越安全,此处考虑计算时间,取值较小
        if is_sushu(sushu):
            return sushu

"""计算欧拉函数"""
def Oula(sushu1 , sushu2):
    return (sushu1-1)*(sushu2-1)

"""判断是否互质"""
def Is_Huzhi(int_min,int_max):
    for i in range(2,int_min+1):
        if int_min % i == 0 and int_max % i == 0:
            return False
    return True

"""计算公钥,直接计算编程较简单,此处考虑了计算效率的优化"""
def Creat_E(oula):
    top = oula
    while True:
        i = randint(2,top)
        for e in range(i,top):
            if Is_Huzhi(e,oula):
                return e     
        top = i    

"""计算私钥"""
def Compute_D(oula,e):
    k = 1
    while ( k*oula+1 )% e != 0:
        k+=1
    return int((k*oula+1)/e)

""" 将字符串转成ASCII """
def Transfer_To_Ascii(messages):
    result = []
    for message in messages:
        result.append(  ord(message) ) 
    return result

""" 将列表转化成字符串 """
def Transfer_To_String(string_list):
    string = ''.join(string_list)
    return string


if __name__ == "__main__":
    """ p、q为大素数 n=p*q oula = (p-1)* (q-1) e 为公钥 d 为私钥 """

    print("通信开始,正在计算公钥与私钥...")
    time_start = datetime.now()
    p = Create_Sushu()
    q = p
    while p ==q :
        q = Create_Sushu()
    n = p * q
    oula = Oula(p, q)
    e = Creat_E(oula)
    d = Compute_D(oula,e)
    time_end = datetime.now()
    print(f"计算完成,用时{str(time_end -time_start)}秒 ")
    print(f"公钥:n = {str(n)} , e = {str(e)}")
    print(f"私钥:n = {str(n)} , d = {str(d)}")
    #print('p='+str(p)+'\n'+'q='+str(q)+'\n'+'n='+str(n)+'\n'+'oula='+str(oula)+'\n'+'d='+str(d)+'\n')

    m = input('待加密信息:')
    m_list = Transfer_To_Ascii(m)

    print("正在加密...")
    c_list = []
    for m in m_list:
        c = m**e%n
        c_list.append(c)
    print(f"密文:{c_list}")

    print("正在解密...")
    decode_messages=[]
    for c in c_list:
        decode_message = c**d%n
        decode_messages.append(chr(decode_message))
    print(f"解密信息:{Transfer_To_String(decode_messages)}")
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139987.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ctk编译linux,CTK插件框架学习5-插件间通信(Netlink实现热拔插监控)[通俗易懂]

    ctk编译linux,CTK插件框架学习5-插件间通信(Netlink实现热拔插监控)[通俗易懂]本章来写一个插件,插件功能为通过NETLINK读取linux系统中的hotplug信息,比如usb、SD卡、磁盘等设备的插拔事件产生的信息,将读到的信息通过插件间通信的方式发出。1.eventadmin库编译CTKPluginFramework下插件间通信是通过事件管理机制实现的,其代码位于CTK/Libs/PluginFramework/service/event目录下,使能事件管理机制,…

    2022年5月29日
    42
  • MySQL数据类型DECIMAL用法

    MySQL数据类型DECIMAL用法MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。要定义数据类型为DECIMAL的列,请使用

    2022年7月1日
    20
  • python进阶(13)装饰器[通俗易懂]

    python进阶(13)装饰器[通俗易懂]装饰器装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,

    2022年8月7日
    5
  • 出现Permission denied的解决办法(750权限谨慎使用)

    出现Permission denied的解决办法(750权限谨慎使用)提示Permissiondenied解决的办法:$sudochmod-R777某一目录其中-R是指级联应用到目录里的所有子目录和文件777是所有用户都拥有最高权限

    2022年6月14日
    73
  • 矢量编程——随着MNIST案例

    矢量编程——随着MNIST案例

    2022年1月13日
    38
  • 基于OpenCv的人脸识别(Python完整代码)

    基于OpenCv的人脸识别(Python完整代码)目前人脸识别有很多较为成熟的方法,这里调用OpenCv库,而OpenCV又提供了三种人脸识别方法,分别是LBPH方法、EigenFishfaces方法、Fisherfaces方法。本文采用的是LBPH(LocalBinaryPatternsHistogram,局部二值模式直方图)方法。opencv是一个开源的的跨平台计算机视觉库,内部实现了图像处理和计算机视觉方面的很多通用算法,对于python而言,在引用opencv库的时候需要写为importcv2。其中,cv2是opencv的C++命名空间名称

    2022年6月7日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号