python语言实现rsa公钥密码算法_Python 25行代码实现的RSA算法详解

本文实例讲述了Python 25行代码实现的RSA算法。分享给大家供大家参考,具体如下:

网络上很多关于RSA算法的原理介绍,但是翻来翻去就是没有一个靠谱的算法实现,即使有代码介绍,也都是直接调用JDK或者Python代码包中的API实现,或者即使有代码也都写得特别烂。无形中让人感觉RSA加密算法竟然这么高深,然后就看不下去了。还有我发现对于“大整数的幂次乘方取模”竟然采用直接计算的幂次的值,再取模,类似于(2 ^ 1024) ^ (2 ^ 1024),这样的计算就直接去计算了,我不知道各位博主有没有运行他们的代码???知道这个数字有多大吗?这么说吧,把全宇宙中的物质都做成硬盘都放不下,更何况你的512内存的电脑。所以我说他们的代码只可远观而不可亵玩已。

于是我用了2天时间,没有去参考网上的代码重新开始把RSA算法的代码完全实现了一遍以后发现代码竟然这么少,25行就全部搞定。为了方便整数的计算,我使用了Python语言。为什么用Python?因为Python在数值计算上比较直观,而Java语言需要用到BigInteger类,数值的计算都是用方法调用,所以使用起来比较麻烦。如果有同学对我得代码感兴趣的话,先二话不说,不管3X7=22,把代码粘贴进pydev中运行一遍,是驴是马拉出来溜溜。看不懂可以私信我,我就把代码具体讲讲,如果本文章没有人感兴趣,我就不做讲解了。

RSA算法的步骤主要有以下几个步骤:

①、选择 p、q两个超级大的质数

②、令n = p * q。取 φ(n) =(p-1) * (q-1)。

③、取 e ∈ 1 < e < φ(n) ,( n , e )为公钥对

④、令 ed mod φ(n) = 1,取得d,( n , d ) 为私钥对。 利用扩展欧几里的算法进行计算。

⑤、销毁 p、q。密文 = 明文 ^ e mod n , 明文 = 密文 ^ d mod n。利用蒙哥马利方法进行计算

代码主要涉及到三个Python可执行文件:计算最大公约数、大整数幂取模算法、公钥私钥生成及加解密。这三个文件构成了RSA算法的核心。

前方高能,我要开始装逼了。看不懂的童鞋请绕道,先去看看理论,具体内容如下:

1. 计算最大公约数

2. 超大整数的超大整数次幂取超大整数模算法(好拗口,哈哈,不拗口一点就显示不出这个算法的超级牛逼之处)

3. 公钥私钥生成

1、计算最大公约数与扩展欧几里得算法

gcd.py文件,gcd方法用来计算两个整数的最大公约数。ext_gcd是扩展欧几里得方法的计算公式。

# -*- coding: utf-8 -*-

# 求两个数字的最大公约数(欧几里得算法)

def gcd(a, b):

if b == 0:

return a

else:

return gcd(b, a % b)

'''

扩展欧几里的算法

计算 ax + by = 1中的x与y的整数解(a与b互质)

'''

def ext_gcd(a, b):

if b == 0:

x1 = 1

y1 = 0

x = x1

y = y1

r = a

return r, x, y

else:

r, x1, y1 = ext_gcd(b, a % b)

x = y1

y = x1 - a / b * y1

return r, x, y

2、大整数幂取模算法

exponentiation.py文件,主要用于计算超大整数超大次幂然后对超大的整数取模。我在网上查询到这个算法叫做“蒙哥马利算法”。

# -*- coding: utf-8 -*-

'''

超大整数超大次幂然后对超大的整数取模

(base ^ exponent) mod n

'''

def exp_mode(base, exponent, n):

bin_array = bin(exponent)[2:][::-1]

r = len(bin_array)

base_array = []

pre_base = base

base_array.append(pre_base)

for _ in range(r - 1):

next_base = (pre_base * pre_base) % n

base_array.append(next_base)

pre_base = next_base

a_w_b = __multi(base_array, bin_array)

return a_w_b % n

def __multi(array, bin_array):

result = 1

for index in range(len(array)):

a = array[index]

if not int(bin_array[index]):

continue

result *= a

return result

有同学就不服了,说是我为啥不把这个幂次的数字计算出来,再取模。我说这样做,理论上是对的,但是实际上行不通。因为:一个2048位的数字的2048位次的幂,计算出来了以后,这个数字很可能把全宇宙的物质都做成硬盘也放不下。不懂的童鞋请私信我。所以需要用“蒙哥马利算法”进行优化。

3、公钥私钥生成

rsa.py,生成公钥、私钥、并对信息加密解密。

# -*- coding: utf-8 -*-

from gcd import ext_gcd

from exponentiation import exp_mode

# 生成公钥私钥,p、q为两个超大质数

def gen_key(p, q):

n = p * q

fy = (p - 1) * (q - 1) # 计算与n互质的整数个数 欧拉函数

e = 3889 # 选取e 一般选取65537

# generate d

a = e

b = fy

r, x, y = ext_gcd(a, b)

print x # 计算出的x不能是负数,如果是负数,说明p、q、e选取失败,一般情况下e选取65537

d = x

# 返回: 公钥 私钥

return (n, e), (n, d)

# 加密 m是被加密的信息 加密成为c

def encrypt(m, pubkey):

n = pubkey[0]

e = pubkey[1]

c = exp_mode(m, e, n)

return c

# 解密 c是密文,解密为明文m

def decrypt(c, selfkey):

n = selfkey[0]

d = selfkey[1]

m = exp_mode(c, d, n)

return m

if __name__ == "__main__":

'''公钥私钥中用到的两个大质数p,q'''

p = 106697219132480173106064317148705638676529121742557567770857687729397446898790451577487723991083173010242416863238099716044775658681981821407922722052778958942891831033512463262741053961681512908218003840408526915629689432111480588966800949428079015682624591636010678691927285321708935076221951173426894836169

q = 144819424465842307806353672547344125290716753535239658417883828941232509622838692761917211806963011168822281666033695157426515864265527046213326145174398018859056439431422867957079149967592078894410082695714160599647180947207504108618794637872261572262805565517756922288320779308895819726074229154002310375209

'''生成公钥私钥'''

pubkey, selfkey = gen_key(p, q)

'''需要被加密的信息转化成数字,长度小于秘钥n的长度,如果信息长度大于n的长度,那么分段进行加密,分段解密即可。'''

m = 1356205320457610288745198967657644166379972189839804389074591563666634066646564410685955217825048626066190866536592405966964024022236587593447122392540038493893121248948780525117822889230574978651418075403357439692743398250207060920929117606033490559159560987768768324823011579283223392964454439904542675637683985296529882973798752471233683249209762843835985174607047556306705224118165162905676610067022517682197138138621344578050034245933990790845007906416093198845798901781830868021761765904777531676765131379495584915533823288125255520904108500256867069512326595285549579378834222350197662163243932424184772115345

'''信息加密'''

c = encrypt(m, pubkey)

print c

'''信息解密'''

d = decrypt(c, selfkey)

print d

代码就是这么简单,RSA算法就是这么任性。代码去除掉没用的注释或者引用,总长度不会超过25行,有疑问的我们掰扯掰扯。

实测:秘钥长度在2048位的时候,我的thinkpad笔记本T440上面、python2.7环境的运行时间是4秒,1024位的时候是1秒。说明了RSA加密算法的算法复杂度应该是O(N^2),其中n是秘钥长度。不知道能不能优化到O(NlogN)

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:http://tools.jb51.net/password/hash_md5_sha

希望本文所述对大家Python程序设计有所帮助。

python rsa加解密 今天要说的加密方式RSA,随笔简单记录下。RSA加密是一种非对称加密,通常使用公钥加密,私钥解密私钥签名,公钥验签。而通常 公钥比较短,私钥比较长。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。RSA算法通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开。 阅读详情

相关推荐

python使用RSA加密算法

最近换了工作,由于新公司是做个人和企业征信业务的,所以对数据的隐私性看的非常重要,所有涉及隐私的数据一律都要进加密进传输。 那么问题来了,对我我要做的工作,就是要实现我们接口自动化,免不了要接触加密-签名-解密-验签等一系列过程。这时候就觉得大学真的白学密码学了。。。 基于我用python语言搞,那我这里就说说我是如何实现python对数据进RSA加解密的吧。。 一、查找python支...

MTbaby的博客 2万+

RSA加密算法Python实现

RSA加密算法Python实现,最详细的RSA算法简介

天天学安全专属博客 2万+

RSA算法原理及CTF解题

The RSA encryption algorithm is an asymmetric encryption algorithm. RSA is widely used in public key cryptography and electronic commerce. RSA was proposed in 1977 by Ron Rivest, Adi Shamir, and Leonard Adleman. All three of them were working at the Massac

qq_45521281的博客 2万+

Python实现RSA算法

一、RSA算法 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复明文的难度,等价于分解两个大素数之积。 RSA公钥、私钥的组成,以及加密、解密的公式可见于下表: 公钥KU n: 两素数p和q的乘积 -----e: 与(p-1)(...

qq_36944952的博客 1万+

SM2椭圆曲线公钥密码算法(Python实现)

Python实现SM2椭圆曲线公钥密码算法

m0_51913750的博客 1万+

验三 RSA密码算法的设计与实现

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆🔥系列专栏 :简单外包单💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不动,只能看别人成功!没有人会关心你付过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。

Martin-share的博客 2229

python语言实现rsa公钥密码算法_python实现RSA算法

文章最后更新时间为:2018年12月26日 23:07:29RSA是一种公钥密码算法,其影响力我就不多说了,算法原理网上多的是,看了几篇,还是觉得阮一峰写的好懂。要想实现RSA,其关键在于大数运算,无论是大数之间的加减乘除还是模幂运算,都是普通的数据结构无法完成的,如果你是使用C语言实现,那么你还需要首先解决五百位数字的加减乘除问题。但是python语言有个好处,就是自动实现大数运算,其数据结构...

weixin_27031001的博客 1568

python 实现RSA密码算法

RSA密码算法是一种非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年共同提。这种算法的安全性主要基于数论中的两个重要问题:质因数分解和求离散对数。具体来说,RSA算法通过选择两个大的质数p和q,计算它们的乘积N=p*q,并基于N构造公钥和私钥。公钥用于加密数据,而私钥则用于解密数据。

luthane的博客 1852

RSA密码算法 + python代码

因为m,n不互素,意味着m,n有公约数。故 m 只能是 p 或 q 的倍数。由于 m

qinquanquan的博客 2411

python语言实现rsa公钥密码算法_python 实现 rsa 算法加解密密码

python版本:2.7需要用到的模块:pycrypto模块下载地址:https://pypi.org/project/pycrypto/#files私钥和公钥的准备:在进RSA加密前,我们先要准备好私钥和公钥。首先,在命令以下命令以生成一个RSA密钥对:openssl genrsa -aes256 -out rsa-key.pem 2048根据提示输入密码,这个密码是用来加密RSA密钥的...

weixin_34802266的博客 792

公钥密码——RSA和Elgamal

简介 公钥密码算法也叫非对称加密,主要有RSA算法、Elgamal算法、ECC算法RSA算法是基于大素数难分解这一数学难题而提的(两个大质数相乘得到的大数难以被因式分解),原理如下: RSA 秘钥生成 选取大素数p,q;计算n=pq以及n的欧拉函数φ(n) = φ§ φ(q)=(p-1)(q-1)。关于欧拉函数,大家肯定是学过滴,素数的欧拉函数等于它自己减1,比如φ (3) = 2;φ (...

dphonor 3507

RSA加密算法-python

RSA加密

qq_45286306的博客 6252

实现RSA公钥密码设计

前言:   自己动手实现RSA公钥密码,加强理解。 一、验目的   通过际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。   二、验原理   对称密码算法要求通信双方通过交换密钥实现使用同一个密钥,这在密钥的管理、发布和安全性方面存在很多问题,而非对称密码算法解决了这个问题。   非对称密码算法是指一个加密系统的加密密钥和解密密钥是不同的,或者说不能用其中一个推导另一个。在非对称密码算法的两个密钥中,一个是用于加密的密钥,它是可以公开的,称为公钥;另一个是用于

1ance's blog 2064

RSA加解密算法数学基础及python实现

密码算法实现与应用 步骤一 Alice 与 Bob 协商会话密钥。采用公钥密码体系,通过自选密码库实现密钥协商,session key 长度 1024 bits. 注:密钥协商所需公钥与私钥,采用两种方式生成: 1、密码库实现; 使用python实现RSA算法,先简单的对RSA说明: 在对称密码体制中,密钥分发过程复杂,代价高;密钥量增大造成密钥管理困难;保密通信系统的开放性差;如果收发双方素不相识,或没有可靠的密钥传递渠道,则无法通信;当用对称密码算法实现数字签名时,由于通信双方拥有相同的密钥,使得接

Goallegoal的博客 2382

【图解RSA加密算法RSA非对称密码算法Python实现保姆级教程 | 物联网安全 | 信息安全

RSA非对称(公钥密码算法Python实现【物联网安全】【信息安全】

菜菜的菜园子 6296

Python基于RSA算法的数字签名生成软件(附源码,文档说明)

Python基于RSA算法的数字签名生成软件,是利用RSA算法来进信息数字签名的内容设计,通对于数字签名的内容讨论,来更好的掌握这项技术,通过对该技术的掌握来达到对密码学、安全知识的掌握能力,能够更好的实现对信息的保护和安全管理的内容学习,并且通过结合python技术来实现数字签名软件的设计,来提升整体对于系统搭建、数字签名的快速加密的内容研究,实现对国家信息安全推广的促进和帮助作用。Python基于RSA算法的数字签名生成软件数字签名是在这种公钥密码算法下所最为常用的一项技术内容。

IT徐师兄 1094

python语言实现rsa公钥密码算法_rsa算法python实现 | 学步园

'''Created on 2012-11-5@author: Pandara'''import mathimport randomimport sysdef is_prime(num):'''determine wether num is prime'''for i in range(int(math.floor(float(num) / 2)) + 1)[2:]:if num % i == 0...

weixin_40007175的博客 310

公钥密码算法RSA验C语言,完整版RSA算法验报告

《完整版RSA算法验报告》由会员分享,可在线阅读,更多相关《完整版RSA算法验报告(17页珍藏版)》请在人人文库网上搜索。1、RSA算法实现 验原理 算法原理 RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导解密密钥在计算上是不可的”密码体制。 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加...

weixin_42469749的博客 2082
上一篇: python两列数据相关性_python – 使用.corr获取两列之间的相关性
下一篇: python输入回车跳出循环咋表示_怎么输入回车跳出循环
weixin_39647180
博客等级 码龄9年 36粉丝 128原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值