import math
from functools import reduce #用于合并字符
from os import urandom #系统随机的字符
import binascii #二进制和ASCII之间转换 #===========================================
def Mod_1(x,n):
'''取模负1的算法:计算x2= x^-1 (mod n)的值,
r = gcd(a, b) = ia + jb, x与n是互素数'''
x0 = x
y0 = n
x1 = 0
y1 = 1
x2 = 1
y2 = 0
while n != 0:
q = x // n
(x, n) = (n, x % n)
(x1, x2) = ((x2 - (q * x1)), x1)
(y1, y2) = ((y2 - (q * y1)), y1)
if x2 < 0:
x2 += y0
if y2 < 0:
y2 += x0
return x2
#===========================================
def Fast_Mod(a,p,m):
'''快速取模指数算法:计算 (a ^ p) % m 的值,可用pow()代替'''
a,p,m=int(a),int(p),int(m)
if (p == 0) :
return 1
r = a % m
k = 1
while (p > 1):
if ((p & 1)!=0):
k = (k * r) % m
r = (r * r) % m
p >>= 1
return (r * k) % m
#===========================================
def randint(n):
'''random是伪随机数,需要更高安全的随机数产生,
所以使用os.urandom()或者SystmeRandom模块,
生成n字节的随机数(8位/字节),返回16进制转为10进制整数返回'''
randomdata = urandom(n)
return int(binascii.hexlify(randomdata),16)
#===========================================
def primality_testing_1(n):
'''测试一,小素数测试,用100以内的小素数检测随机数x,
可以很大概率排除不是素数,#创建有25个素数的元组'''
Sushubiao=(2,3,5,7,11,13,17,19,23,29,31,37,41
,43,47,53,59,61,67,71,73,79,83,89,97)
for y in Sushubiao:
if n%y==0:
return False
return True
#===========================================
def primality_testing_2(n, k):
'''测试二,用miller_rabin算法对n进行k次检测'''
if n < 2:
return False
d = n - 1
r = 0
while not (d & 1):
r += 1
d >>= 1
for _ in range(k):
a = randint(120) #随机数
x = pow(a, d, n)
if x == 1 or x == n - 1:
continue
for _ in range(r - 1):
x = pow(x, 2, n)
if x == 1:
return False
if x == n - 1:
break
else:
return False
return True
#===========================================
def getprime(byte):
while True :
n=randint(byte)
if primality_testing_1(n) :
if primality_testing_2(n, 10) :
pass
else :continue
else : continue
return n
#===========================================
def RSA():
p=getprime(128) #1024bit的大整数
q=getprime(128)
while p==q: #避免p/q值相同
q=getprime(128)
n=p*q #n值公开
OrLa=(p-1)*(q-1) #欧拉函数
e=524289
'''e的选择:e的二进制表示中应当含有尽量少量的1.
e取e=524289时,其二进制为10000000000000000001,
只有两个1,加密速度快且数字大'''
d=Mod_1(e,OrLa)
print('公钥为({0},{1});\n私钥为({2},{3})'.format(n,e,n,d))
message=input('请输入任意需要加密的内容:')
#从标准输入输出流接收数据,数字化再加解密
message=list(map(ord,message))
print('ciphertext数字化:',message)
ciphertext=[]
for x in message:
ciphertext.append(pow(x,e,n))
print('ciphertext加密:',ciphertext)
message=[]
while True :
message.append(int(input('输入密文组\n(需要结束时输入0):')))
if message[-1]==0:
del message[-1]
break
plaintext=[]
for x in message:
plaintext.append(pow(x,d,n))
print('plaintext解密:',plaintext)
plaintext=list(map(chr,plaintext))
print('plaintext字符化:',plaintext)
print('plaintext=',reduce((lambda x,y: x+y),plaintext))
#=================================================== RSA()

miller_rabin算法检测生成大素数的RSA算法实现的更多相关文章

  1. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

    Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...

  2. 计蒜客 Goldbach Miller_Rabin判别法(大素数判别法)

    题目链接:https://nanti.jisuanke.com/t/25985 题目: Description: Goldbach's conjecture is one of the oldest ...

  3. 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)

    前提知识 1,费马定理:ap−1=1(mod p)a^{p-1}=1(mod\ p)ap−1=1(mod p)

  4. 重复造轮子之RSA算法(一) 大素数生成

    出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int ...

  5. RSA算法

    RSA.h #ifndef _RSA_H #define _RSA_H #include<stdio.h> #include<iostream> #include<mat ...

  6. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  7. RSA算法原理与加密解密 求私钥等价求求模反元素 等价于分解出2个质数 (r*X+1)%[(p-1)(q-1)]=0

    Rsapaper.pdf http://people.csail.mit.edu/rivest/Rsapaper.pdf [概述Abstract 1.将字符串按照双方约定的规则转化为小于n的正整数m, ...

  8. RSA算法java实现(BigInteger类的各种应用)

    一.RSA算法 1.密钥生成 随机生成两个大素数p.q 计算n=p*q 计算n的欧拉函数f=(p-1)*(q-1) 选取1<e<f,使e与f互素 计算d,ed=1modf 公钥为(e,n) ...

  9. [转]应用RSACryptoServiceProvider类轻松实现RSA算法

    在我们现实当中经常会存在需要对某些数据进行加密保护 然后进行解密的操作,比方,我们需要对某些XML配置信息里面的某些数据进行加密,以防止任何人打开该XML配置信息都能正常的看到该配置信息里面的内容,从 ...

随机推荐

  1. pyqt系列原创入门教程

    pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...

  2. Vim快速入门

    学习自:实验楼 Vim具有6种基本模式和5种派生模式 普通模式: vim启动后的默认模式,常用的编辑器命令诸如移动光标,删除文本. 普通模式中,有很多方法进入插入模式,常用 a 或 i 键. 插入模式 ...

  3. 期待微软平台即服务技术Service Fabric 开源

    微软的Azure Service Fabric的官方博客在3.24日发布了一篇博客 Service Fabric .NET SDK goes open source ,介绍了社区呼声最高的Servic ...

  4. Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...

  5. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. java设计模式之职责链模式

    责任链模式 设计模式很多时候都是看见名字都知道意思,责任链,见名知义为请求创建一系列处理对象. 此模式基于请求的类型将请求的发送方和接收方分离.通常每个接收器包含对另一个接收器的引用.如果一个对象不能 ...

  7. 【一通百通】C/C++的std标准总结

    C/C++发展很多版本标准,sunsky(本人)早就想理理std标准了,让大家有个清晰的了解. 适用C(或C源代码,如C ++,Objective-C和Objective-C ++)的标准: -ans ...

  8. Struts2的类型转换(上)

    传统的类型转换.(略) Struts2中提供了内置的基本的类型转换器,可以实现基本类型的自动转换,包括: Integer, Float, Double, Decimal Date and Dateti ...

  9. CSS如何实现圆角的outline效果?

    一.首先,outline是个很牛逼的东西 温故而知鑫,10年的时候写过一篇可用性方面的文章:“页面可用性之outline轮廓外框的一些研究”,还算挺有用的:3年之后,也就是13年,介绍了个没什么使用价 ...

  10. 设计模式(三)—代理模式

    目录: 一.概述 二.静态代理 三.动态代理 四.静态代理和动态代理的区别 一.概述      代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对 ...