算法基本思路:

1.公钥与私钥的生成:

(1)随机挑选两个大质数 p 和 q,构造N = p*q;

(2)计算欧拉函数φ(N) = (p-1) * (q-1);

(3)随机挑选e,使得gcd(e, φ(N)) = 1,即 e 与 φ(N) 互素;

(4)计算d,使得 e*d ≡ 1 (mod φ(N)),即d 是e 的乘法逆元。

此时,公钥为(e, N),私钥为(d, N),公钥公开,私钥自己保管。

2.加密信息:

(1)待加密信息(明文)为 M,M < N;(因为要做模运算,若M大于N,则后面的运算不会成立,因此当信息比N要大时,应该分块加密)

(2)密文C = Memod N

(3)解密Cd mod N = (Me)d mod N = Md*e mod N ;

要理解为什么能解密?要用到欧拉定理(其实是费马小定理的推广)aφ(n) ≡ 1 (mod n),再推广:aφ(n)*k ≡ 1 (mod n),得:aφ(n)*k+1 ≡ a (mod n)

注意到 e*d ≡ 1 mod φ(N),即:e*d = 1 + k*φ(N)。

因此,Md*e mod N = M1 + k*φ(N) mod N = M

简单来说,别人用我的公钥加密信息发给我,然后我用私钥解密。

3.数字签名:

(1)密文C = Md mod N

(2)解密M = Cemod N = (Md)e mod N = Md*e mod N  = M ;(原理同上)

简单来说,我用自己的密钥加密签名,别人用我的公钥解密可以看到这是我的签名。注意,这个不具有隐私性,即任何人都可以解密此签名。

算法的安全性:基于大整数N难以分解出p和q,构造φ(N);或由N直接构造φ(N)同样难。

算法的实现:

实现代码:

importrandomdeffastExpMod(b, e, m):"""e = e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n)

b^e = b^(e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n))

= b^(e0*(2^0)) * b^(e1*(2^1)) * b^(e2*(2^2)) * ... * b^(en*(2^n))

b^e mod m = ((b^(e0*(2^0)) mod m) * (b^(e1*(2^1)) mod m) * (b^(e2*(2^2)) mod m) * ... * (b^(en*(2^n)) mod m) mod 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) %mreturnresultdefprimeTest(n):

q= n - 1k=0#Find k, q, satisfied 2^k * q = n - 1

while q % 2 ==0:

k+= 1;

q/= 2a= random.randint(2, n-2);#If a^q mod n= 1, n maybe is a prime number

if fastExpMod(a, q, n) == 1:return "inconclusive"

#If there exists j satisfy a ^ ((2 ^ j) * q) mod n == n-1, n maybe is a prime number

for j inrange(0, k):if fastExpMod(a, (2**j)*q, n) == n - 1:return "inconclusive"

#a is not a prime number

return "composite"

deffindPrime(halfkeyLength):whileTrue:#Select a random number n

n = random.randint(0, 1<

found=True#If n satisfy primeTest 10 times, then n should be a prime number

for i in range(0, 10):if primeTest(n) == "composite":

found=Falsebreak

iffound:returnndefextendedGCD(a, b):#a*xi + b*yi = ri

if b ==0:return (1, 0, a)#a*x1 + b*y1 = a

x1 = 1y1=0#a*x2 + b*y2 = b

x2 =0

y2= 1

while b !=0:

q= a /b#ri = r(i-2) % r(i-1)

r = a %b

a=b

b=r#xi = x(i-2) - q*x(i-1)

x = x1 - q*x2

x1=x2

x2=x#yi = y(i-2) - q*y(i-1)

y = y1 - q*y2

y1=y2

y2=yreturn(x1, y1, a)defselectE(fn, halfkeyLength):whileTrue:#e and fn are relatively prime

e = random.randint(0, 1<

(x, y, r)=extendedGCD(e, fn)if r == 1:returnedefcomputeD(fn, e):

(x, y, r)=extendedGCD(fn, e)#y maybe < 0, so convert it

if y <0:return fn +yreturnydefkeyGeneration(keyLength):#generate public key and private key

p = findPrime(keyLength/2)

q= findPrime(keyLength/2)

n= p *q

fn= (p-1) * (q-1)

e= selectE(fn, keyLength/2)

d=computeD(fn, e)return(n, e, d)defencryption(M, e, n):#RSA C = M^e mod n

returnfastExpMod(M, e, n)defdecryption(C, d, n):#RSA M = C^d mod n

returnfastExpMod(C, d, n)#Unit Testing

(n, e, d) = keyGeneration(1024)#AES keyLength = 256

X = random.randint(0, 1<<256)

C=encryption(X, e, n)

M=decryption(C, d, n)print "PlainText:", Xprint "Encryption of plainText:", Cprint "Decryption of cipherText:", Mprint "The algorithm is correct:", X == M

Python

rsa python实现_RSA算法python实现相关推荐

  1. python leetcode_Leetcode 常用算法 Python 模板

    小 trick overlap条件:start1 < end2 and end1 > start2 在DFS中我们说关键点是递归以及回溯,在BFS中,关键点则是状态的选取和标记 树算法 B ...

  2. pca算法python实现_PCA算法——Python实现

    一.流程生成模拟数据 模型训练 特征向量重要性分析 画图 二.Python语言 1.生成模拟数据 # 导入相关数据库 from sklearn import datasets ​ # 提取数据 dig ...

  3. python抢红包程序算法,Python 抢红包算法模拟

    抢红包算法模拟 本篇内容为抢随机红包模拟算法,仅供参考. 方法 本篇使用的是二倍均值法,在此之前,先大概讲下普通随机法. 普通随机方法 该方法的原理是:每次都以 [最小值,剩余金额值] 之间进行随机取 ...

  4. 算法python实现_Relief算法python实现

    文章目录 一.算法流程图 二.代码步骤 1.第一步:定义类和init方法 2.第二步:数据处理 3.第三步:通过计算距离,找出猜错近邻和猜对近邻 4.第四步:计算特征权重 5.第五步:根据权重过滤式选 ...

  5. Python版插入排序算法

    问题描述:在插入排序算法中,把所有元素分为前面的已排序序列和后面的未排序序列两部分,每次处理未排序序列中的第一个元素,将其插入到前面已排序序列中的合适位置,从而不停地扩大已排序序列并缩小未排序序列,直 ...

  6. Python使用超高效算法查找所有类似123-45-67+89=100的组合

    问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式. 昨天发了一个暴力测试的方法来解决问题,详见Python查找所有类似于123-4 ...

  7. python实现RSA数字签名(纯算法实现)

    python实现RSA数字签名(纯算法实现) 一:什么是数字签名 数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明.它是一种类 ...

  8. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  9. 基于Python实现的RSA加密和解密算法

    目录 第 一部分 RSA 加密和解密算法 1 算法原理 1 1.1 RSA 原理概述 1 用中国剩余定理CRT对RSA运算进行加 2 代码实现 2 2.1 RSA 代码实现 2 2.2 CRT-RSA ...

最新文章

  1. Java String.substring内存泄露?
  2. 这还是你所认知的Python吗?原来是这么牛!
  3. js-带操作的赋值表达式
  4. 基于PSO算法的带时间窗的车辆路径问题的仿真
  5. 可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取) ....
  6. ctf音频yinxie_ctf-图片隐写术
  7. 华为浏览器:即日起全面清理违规信息 严管“自媒体”账号
  8. JavaScript 带给学习者的意外和深入认识
  9. 【翻译】什么是最重要的机器学习技术?
  10. 程序员计算器HEX、EDC、OCT的意思
  11. 【mmdetection3d】——学习配置文件
  12. 线性代数基本公式结论简要总结(1)
  13. 信息论实验-信源编码算法 (Huffman and Shannonn Fano编码C++实现)
  14. 计算机专业英语问卷调查,关于英语调查问卷的总结
  15. spring boot 拦截 以及Filter和interceptor 、Aspect区别
  16. Ubuntu实时监控网速、CPU、内存
  17. ubuntu安装网易云音乐 打不开, 或者不想使用root权限打开 尝试思路
  18. Rosalind Java| Computing GC Content
  19. 基于JAVA后台微信买菜小程序系统 开题报告
  20. 计算用户的平均次日、三日和七日留存率

热门文章

  1. 对学校的希望和寄语_家长对学校的寄语怎么写
  2. img 隐藏_CSS3界面样式和溢出文字隐藏overflow
  3. 【控制】傅里叶系列(二)傅里叶变换的推导
  4. 成员函数和成员变量分开存储
  5. 【PC工具】开源绿色windows右键管理工具软件
  6. 几种替代MATLAB的工具,堪称完美!
  7. 第1章 Qt概述和下载安装及创建工程
  8. 学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)
  9. 实现基于注解(Annotation)的数据库框架(三)自定义注解(Annotation)
  10. 12月20日学习内容整理:博客系统之media配置