python实现RSA算法,对数据进行加密认证

RSA算法

  • RSA
  • 一、数学原理
  • 二、实现代码
    • 1 生成素数
    • 2 生成秘钥
    • 3 对数据进行加密、解密
  • 总结


RSA

RSA是一种非对称加密体制,由公钥和私钥组成,数学原理是实数域的模余法。在使用私钥对数据进行加密后,可用公钥对数据进行解密。
在RSA算法中,设公钥为(D, N),私钥为(E, N),加密过程可以表示为明文EmodN=密文明文^{E} \ mod\ N=密文 E mod N=
解密算法一致,把E换成D,密文DmodN=明文密文^{D} \ mod\ N=明文  mod N=
当然,能这样计算对N、E、D是有要求的。

RSA是目前公认的安全算法,对它进行破解需要进行大数的质数分解,目前除了穷举法没有发现其他方法能计算,而穷举法在足够大的大数面前计算是需要非常漫长的时间的,因此当RSA算法采用的N、E、D足够大时,就认为是安全的。目前来说需要N达到1024bits。

一、数学原理

  1. 欧拉函数的性质:
    n=qp,p和q是两个质数,则φ(n)=(q−1)(p−1)n = qp,p和q是两个质数,\ 则{\varphi}(n) = (q-1)(p-1)n=qppq, φ(n)=(q1)(p1)

  2. 欧拉定理:若a与n互质,即gcd(a,n)=1,则aφ(n)≡1modngcd(a,n)=1, 则a^{\varphi(n)}\ {\equiv}\ 1\mod\ ngcd(a,n)=1,aφ(n)  1mod n
    进一步,若n是质数,an−1≡1modna^{n-1}\ {\equiv}\ 1\mod nan1  1modnan≡amodna^{n}\ {\equiv}\ a\mod nan  amodn

  3. 费马小定理:若n是质数,a与n互质,,则an−1≡1modna^{n-1}\ {\equiv}\ 1 \mod \ nan1  1mod n

  4. 逆元:如果ab≡1modn,则a和b互为逆元ab\ {\equiv}\ 1\mod\ n, 则a和b互为逆元ab  1mod n,ab

  5. RSA加密的条件:
    · n=p×qn = p{\times}qn=p×q
    · L=φ(n)=(p−1)(q−1)L = {\varphi}(n) = (p-1)(q-1)L=φ(n)=(p1)(q1)
    · 随机选取 1<e<L,使得gcd(e,L)=11<e<L,使得gcd(e,L)=11<e<L使gcd(e,L)=1
    ·计算 ed≡1modLed\ {\equiv}\ 1\mod\ Led  1mod L
    ·公钥对 =(n, d),私钥对 =(n, e)

    继续设明文 = M,密文 = C,现在来证明可以用上述方法加解密的条件。
    MEmodN=C,CDmodN=MM^{E}\ mod\ N = C,\ C^{D}\mod\ N = MME mod N=C, CDmod N=M
    根据模法,CD−kN=MC^{D}\ -\ kN = MCD  kN=M,代回第一个式子,
    (CD−kN)E≡1modN(C^{D}\ -\ kN)^{E}\ {\equiv}\ 1\mod\ N(CD  kN)E  1mod N CDE≡CmodNC^{DE}\ {\equiv}\ C\mod\ NCDE  Cmod N由于 E×D≡1modφ(N)E\times D\equiv 1\mod\ \varphi(N)E×D1mod φ(N),也即 ED−kφ(N)=1ED-k\varphi(N) = 1EDkφ(N)=1
    若gcd(C, N) = 1,根据欧拉定理,Cφ(N)≡1modNC^{{\varphi}(N)}\ {\equiv}\ 1\mod\ NCφ(N)  1mod NCkφ(N)+1≡CmodNC^{k{\varphi}(N)+1}\ {\equiv}\ C\mod\ NCkφ(N)+1  Cmod NCED≡CmodNC^{ED}\ {\equiv}\ C \mod\ N CED  Cmod N若C与N不互质,由于N是两个质数的积,所以gcd(C,N)=q or gcd(C,N)=p。设 C=k1qorC=k2pC= k_{1}q\ or \ C=k_{2}pC=k1q or C=k2p,假设C = kp,而且gcd(m,q)=1,由欧拉定理和欧拉函数的性质,(kp)q−1≡1modq(kp)^{q-1} \ {\equiv} \ 1 \mod \ q(kp)q1  1mod q((kp)q−1)k2(p−1)≡(kp)q−1≡1modq((kp)^{q-1})^{k_{2}(p-1)}\ {\equiv}\ (kp)^{q-1} \ {\equiv} \ 1 \mod \ q((kp)q1)k2(p1)  (kp)q1  1mod q(kp)k2φ(n)≡1modq(kp)^{k_{2}{\varphi}(n)} \ {\equiv} \ 1 \mod \ q(kp)k2φ(n)  1mod qCk2φ(n)−aq=1C^{k_{2}{\varphi}(n)}-aq = 1Ck2φ(n)aq=1两边同时乘上C,Ck2φ(n)+1=aCq+C=akpq+C=akN+C=k3N+CC^{k_{2}{\varphi}(n)+1}=aCq+C=akpq+C=akN+C=k_{3}N+CCk2φ(n)+1=aCq+C=akpq+C=akN+C=k3N+C也即 CED≡CmodNC^{ED}\ {\equiv}\ C\mod\ NCED  Cmod N,原式得证。

  6. 素数检验(Miller-Rabbin算法)
    涉及到两个定理:
    5.1 费马小定理:参见3,但是费马小定理的逆定理不一定成立
    5.2 二次探测定理:如果 p是一个素数,0<x<p0<x<p0<x<p,则方程 x2≡1modpx^{2}\ {\equiv}\ 1 \mod px2  1modp 的解为 x=1x=1x=1x=p−1x=p-1x=p1
    算法内容:
    · 设一个数为x,分解为2st=x−12^{s}t\ =\ x-12st = x1,t为x不断除以2得到的最大奇数
    · 随机取a,a=ata=a^{t}a=at,对a进行s次平方(也即计算b=a2modx,a=bb = a^{2}\mod x,a = bb=a2modx,a=b),如果其中有次平方的结果为b=1而且此时a不为1或x-1,则不满足二次探测定理
    · 如果 ax−1modx≠1a^{x-1}\mod x {\neq}1ax1modx=1,则不满足费马小定理
    如果可以,a取小于x的足够多的质数或者随机选取a进行多次检测。Miller-Rabbin算法只能保证x大概率是一个素数,不过这个概率已经足够大了。

  7. 快速幂
    计算axmodn=?a^x\mod n=?axmodn=?,当a和x很大的时候,中间结果超出存储容量又或者数字太大计算复杂,此时需要快速计算这个指数模余值,可以如下进行:
    对x分解为二进制形式,则有axmodn=a2bk+2bk−1+⋅⋅⋅⋅⋅⋅+2b0modn=((a2bkmodn)⋅⋅⋅⋅⋅⋅(a2b0modn))modna^{x}mod\ n= a^{2^{b_{k}}+2^{b_{k-1}}+······+2^{b_0}}mod\ n =((a^{2^{b_k}} mod\ n)······(a^{2^{b_0}} mod\ n))mod\ naxmod n=a2bk+2bk1++2b0mod n=((a2bkmod n)(a2b0mod n))mod n

二、实现代码

重新看下RSA算法的流程,
· n=p×qn = p{\times}qn=p×q
· L=φ(n)=(p−1)(q−1)L = {\varphi}(n) = (p-1)(q-1)L=φ(n)=(p1)(q1)
· 随机选取 1<e<L,使得gcd(e,L)=11<e<L,使得gcd(e,L)=11<e<L使gcd(e,L)=1
·计算 ed≡1modLed\ {\equiv}\ 1\mod\ Led  1mod L
·公钥对 =(n, d),私钥对 =(n, e)

由于RSA的安全性取决于n的大小,所以生成的p和q越大越好,那么需要

  1. 生成大素数p和q
  2. 计算L = (p-1)*(q-1)
  3. 随机选取与L互质的e,2<e<L
  4. 计算e对L的逆元d
  5. 销毁p、q,保存n,e,d

1 生成素数

用基础算法列出1-1000的素数,从2到x\sqrt xx求x是非能被1和他自身外的其他数整除。

def createPrime():ret = []for i in range(1000):for j in range(2,ceil(sqrt(i))+1):if i % j == 0:breakif j == ceil(sqrt(i)):ret.append(i)return ret

先实现快速幂算法,再用Miller-Rabbin算法生成一个大的素数,这个大有多大看需求。

# 1000以内的质数
prime_list = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103,107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347,349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883,887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]def quickPowerMod(a,x,n):# 计算a**x % nc = b = 1binary = bin(x)[2:]binary = reversed(binary)for it in binary:if it == '0':# 结果不动,乘子指数加一a = (a ** 2) % nelse:# 结果乘上当前权重,乘子指数加一b = (a * b) % na = (a ** 2) % nreturn bdef MillerRabin(num):# 偶数if num & 1 == 0:return False# 将num分解为 (2**s)*t = num-1s = 1# 这时t必定是偶数,将其分解到为奇数t = num - 1while t & 1 == 0:s += 1t = t // 2for it in prime_list:if it >= num:breaka = quickPowerMod(it,t,num)# 二次探测定理for i in range(s):b = a * a % numif b == 1 and a != 1 and a != num-1:return Falsea = bif a != 1:# (it**t) 同余 1 mod num, 费马小定理return Falsereturn Truedef createBigPrime():pMin = 10 ** 54pMax = 10 ** 64a = random.randint(pMin,pMax)while  not MillerRabin(a):a = random.randint(pMin, pMax)return a

2 生成秘钥

接下来编写函数生成公钥私钥对,求逆元的时候有几种算法,由于明文和N关系未知,选取扩展欧几里得算法,又需要求最大公因子和最小公倍数的函数,这两个很简单,直接上代码。

def gcd(a,b):if a % b == 0:return belse:return gcd(b, a % b)def lcm(a,b):c = gcd(a, b)return a * b // cdef inverseGCD(a,b):# 递推求扩展欧几里得算法if b == 0:return 1, 0else:k = a // bx2, y2 = inverseGCD(b, a % b)x1, y1 = y2, x2 - k * y2# 注意x1可能为负,在外面再求一次模return x1, y1def createKeys():q = createBigPrime()p = createBigPrime()n = q * p# n的欧拉函数L = (p - 1) * (q - 1)e = random.randint(2,L)while gcd(e,L) != 1:e = random.randint(2,L)# 计算e * d 同余 1 mod L# 扩展欧几里得算法求逆元d, _ = inverseGCD(e,L)d = d % L#d = e**(L-2)with open('e.txt', 'w') as f:f.write(str(e))with open('d.txt', 'w') as f:f.write(str(d))with open('n.txt', 'w') as f:f.write(str(n))return n, e, d

3 对数据进行加密、解密

有了私钥对,加密只是进行一个求快速幂的过程。

m = 8916534261681675
n,e,d = createKeys()
print('私钥对:\n',n,e)
print('公钥对:\n',n,d)
en = quickPowerMod(m,e,n)
print('原消息: ', m)
print('加密后:', en)
de = quickPowerMod(en,d,n)
print('解密后:', de)

看下结果
RSA结果
已经完成正确的加解密!


总结

RSA算法用到数论、离散数学的基础,加密速度慢,而且每次加密过程中消息大小M不能大于N。但RSA算法是公认非常安全的算法。
如果想对大小超出N的消息加密,一般需要先用DES、SHA等对原消息计算成一定长度的摘要,再对摘要进行RSA加密。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

他研究了5000家AI公司,说人工智能应用该这么做!

来源&#xff1a;公众号InfoQ编辑&#xff1a;陈思 Eva&#xff1b;视频剪辑&#xff1a;汪春良 概要&#xff1a;本文作者 Henry Shi是美国人工智能的博士&#xff0c;连续创业者&#xff0c;专注于 AI 领域的早期投资&#xff08;AI List Capital管理合伙人&#xff09;。无…

简明Python教程学习笔记_6_面向对象编程

面向对象编程&#xff1a;https://www.liaoxuefeng.com/wiki/897692888725344/923030496738368面向对象高级编程&#xff1a;https://www.liaoxuefeng.com/wiki/897692888725344/9230305380126401、类、对象 类 和 对象 是面向对象编程的两个主要方面。 类 是创建一个 新类型&a…

哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗

前文 使用socket实现局域网不同主机通信 SHA256算法的实现和消息的哈希散列值计算 python实现RSA算法&#xff0c;对数据进行加密认证 文章目录数字签名与认证攻击类型算法选择实现流程总结数字签名与认证 什么是数字签名&#xff1f; 签名我们大家都知道&#xff0c;A在纸上签…

2017 年脑机接口研发热点回眸

来源&#xff1a;科技导报概要&#xff1a;脑机接口&#xff08;brain-computer interface&#xff0c;BCI&#xff09;通过解码人类思维活动过程中的脑神经活动信息&#xff0c;构建大脑与外部世界的直接信息传输通路&#xff0c;在神经假体、神经反馈训练、脑状态监测等领域有…

地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫

文章目录前言1 随机房间和房门2 生成走廊2.1生成迷宫2.4 使用循环改进2.3 走廊缩减2.3 走廊再简化总结前言 前面通过随机房间、房门&#xff0c;对房门寻路生成走廊。由于使用A星算法&#xff0c;寻到的是最短路径&#xff0c;这样生成的走廊过直和简单。如果需要生成弯曲的走廊…

Introduce Parameter Object(引入参数对象)

某些参数总是很自然地同时出现 重构&#xff1a;以一个对象取代这些参数

深度解析,马斯克最新发射的先进火箭

来源&#xff1a;环球时报概要&#xff1a;就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。虽然中芯级火箭在回收过程中坠毁&a…

技术专栏 | 两万字深度长文!从原理到趋势 解剖风口上的区块链技术

来源&#xff1a;芯师爷概要&#xff1a;区块链不是一项新技术&#xff0c;而是一个新的技术组合。其关键技术包括P2P动态组网、基于密码学的共享账本、共识机制、智能合约等技术。区块链不是一项新技术&#xff0c;而是一个新的技术组合。其关键技术包括P2P动态组网、基于密码…

Python 进阶

​Python 进阶&#xff1a;https://eastlakeside.gitbook.io/interpy-zh/ Python 经典教程 专题 系列&#xff1a;https://www.jb51.net/Special/520.htm Python 黑魔法指南&#xff1a;https://magic.iswbm.com/ Python 中文指南&#xff1a;https://python.iswbm.com/ Python…

2018年中国65家机器人产业园布局与规划汇总盘点

来源&#xff1a;机器人创新生态概要&#xff1a;“机器人换人”大潮下&#xff0c;中国已连续两年坐上世界机器人最大消费国的宝座&#xff0c;根据国际机器人联合会&#xff08;IFR&#xff09;发布的数据&#xff0c;2016年中国工业机器人的销量为9万台&#xff0c;同比增长…

人工智能与经济学:关于近期文献的一个综述

来源&#xff1a;财新网概要&#xff1a;相比于之前的历次技术进步&#xff0c;“人工智能革命”所引发的冲击更为巨大&#xff0c;其对经济学造成的影响也将更为广泛和深远。人工智能技术的突飞猛进&#xff0c;对经济社会的各个领域都产生了重大影响&#xff0c;这种影响当然…

Pull Up Field(字段上移)

两个子类拥有形同的字段 重构&#xff1a;将该字段移至超类

DeepMind推出分布式深度强化学习架构IMPALA,让一个Agent学会多种技能

维金 编译自 DeepMind Blog量子位 出品 | 公众号 QbitAI目前&#xff0c;深度增强学习&#xff08;DeepRL&#xff09;技术在多种任务中都大获成功&#xff0c;无论是机器人的持续控制问题&#xff0c;还是掌握围棋和雅达利的电子游戏。不过&#xff0c;这些方面的进展仅限于孤…

AAAI2018正式落幕 13个世界顶尖AI教授都讲了啥?

来源&#xff1a;智东西概要&#xff1a;2月8日消息&#xff0c;第32届AAAI大会在美国新奥尔良正式闭幕。2月8日消息&#xff0c;第32届AAAI大会在美国新奥尔良正式闭幕。本次大会不仅颁发了最佳论文奖、最佳学生论文奖、经典论文将等一系列奖项。作为顶级学术会议之一&#xf…

Linux 中 VIM 的使用

Vim 官网&#xff1a;http://www.vim.org/ VIM 实用技巧&#xff1a;https://wenku.baidu.com/view/21c5f387d4d8d15abe234ecb.html vim 的一些小技巧&#xff1a;https://www.douban.com/group/topic/1815089 vim 简单实用的技巧总结&#xff1a;http://www.tuicool.com/arti…

Pull Up Method(函数上移)

有些函数&#xff0c;在各个子类中产生完全相同的结果 重构&#xff1a;将该函数移至超类

重磅 | 中国工程院提出新一代智能制造【附下载】

来源&#xff1a;走向智能论坛近日&#xff0c;中国工程院院刊《Engineering》推出最新观点性文章“走向新一代智能制造”&#xff0c;作者周济、李培根、周艳红等&#xff0c;文章指出智能制造是一个不断演进发展的大概念&#xff0c;可归纳为三个基本范式&#xff1a;数字化制…

Python 装饰器 函数

Python装饰器学习&#xff08;九步入门&#xff09;&#xff1a;http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 浅谈Python装饰器&#xff1a;https://blog.csdn.net/mdl13412/article/details/22608283 Python装饰器与面向切面编程&#xff1a;http://www.cn…

Homepod评测:一款音质超棒但低智商的音箱

来源&#xff1a;The Verge今天&#xff0c;让我们再近距离看看Homepod这款明星产品吧。Homepod拥有卓越的音质HomePod的电源线内置并包裹在面料中&#xff0c;顶部有LED背光音量按钮和一个“显示屏”。之所以打引号是因为它不是真正意义上的显示屏&#xff0c;而是一块LED。它…

Python 生成器 和 yield 关键字

Python 中 yield 的作用&#xff1a;http://youchen.me/2017/02/10/Python-What-does-yield-do/# Python 生成器详解&#xff1a;http://codingpy.com/article/python-generator-notes-by-kissg/#generator Python yield与实现&#xff1a;http://www.cnblogs.com/coder2012/p/…