HCF of n and e (which is 1),n,e 互质。 a,p互质(即两者只有一个公约数1) 不是说两者为素数。 两个数的公因数只有1的两个非零自然数,叫做互质数。 http://www.freebuf.com/articles/terminal/101200.html mypow2(a, int(dlist[0])*(pow(2, iter)), n) mypow2(a, int(dlist[0])*(2**iter), n) 竟然输出不一样,浮点数的问题?
def binary_digits(n):
# initialize bit list
bits = []
while n>0:
# calculate last binary digit of current value of n
last_bit = n%2
# append to bit list
bits.append(last_bit)
# updata n
n = n/2
return bits
import time
start = time.time()
def mypow1(a,b,c):
return_value = 1
for i in range(1,b+1):
return_value = (return_value*a) % c
return return_value
end = time.time()
time_elapsed = int(end - start)
print time_elapsed
from binary_digits import binary_digits
import math
import time
start = time.time()
def mypow2(a, b, c):
return_value = 1
multiplier = a
# temp = binary_digits(b)
# digits = temp[::-1]
digits = binary_digits(b)
for digit in digits:
if digit == 1:
return_value = (return_value * multiplier) % c
else:
return_value = return_value
multiplier = (multiplier * multiplier) % c
return return_value
# end = time.time()
# time_elapsed = int(end - start)
# print time_elapsed
#print mypow2(2,63,2017)
# -*- coding: utf-8 -*- #设置python文件的编码为utf-8,这样就可以写入中文注释
from binary_digits import *
from mypow2 import *
from math import *
def extended_hcf(a, b):
# initialize
p1, q1, h1 = 1, 0, a
p2, q2, h2 = 0, 1, b
# loop while h2 > 0
while h2 > 0:
r = h1 / h2
p3, q3, h3 = p1 - r*p2, q1 - r*q2, h1 - r*h2
p1, q1, h1, p2, q2, h2 = p2, q2, h2, p3, q3, h3
return (p1, q1, h1)
#n=pow(5,15)
#e=pow(3,11)
#print extended_hcf(n, e)
def mrf(n,a):
s=1
k=1
slist=[]
dlist=[]
list=[]
while k<n:
k = 2**s
d = divmod((n-1), k)[0]
flag = divmod((n-1), k)[1]
if not flag and (d % 2) == 1:
dlist.append(d)
slist.append(s)
s=s+1
for r in range(0,slist[0]):
temp = mypow2(a,int(dlist[0])*(2**r),n)
list.append(temp)
return (slist,dlist,list)
def miller_rabin_test(n,a):
flag = 0
slist = mrf(n,a)[0]
dlist = mrf(n,a)[1]
list = mrf(n,a)[2]
Test = []
print slist
print dlist
print list
if mypow2(a,int(dlist[0]),n)==1:
flag = 1
return bool(flag)
for iter in range(0, slist[0]):
Test.append(mypow2(a, int(dlist[0])*(2**iter), n)) ###?pow 出问题
print Test
if mypow2(a, int(dlist[0])*(2**iter), n) == n-1:
flag=1
break
print Test
return bool(flag)
print miller_rabin_test(2017 ,7)
CTF中RSA的常见攻击方法 http://www.2cto.com/article/201609/551390.html 加密及攻击 http://www.doc88.com/p-982460038116.html Miller-Rabin素性测试c实现 http://www.cnblogs.com/fstang/archive/2013/01/07/2849807.html http://www.cnblogs.com/vongang/archive/2012/03/15/2398626.html 大数因数分解Pollard_rho 算法详解 http://blog.csdn.net/maxichu/article/details/45458569 http://blog.csdn.net/fisher_jiang/article/details/986654 字符串转数字
coding=UTF-8 将字符串转化为数字
python
from functools import reduce
import math
def char2int(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
def mulit_int(x,y):
return 10*x+y
def str2int(s):
if s.find('.')==-1:#不是浮点数
return reduce(mulit_int,map(char2int,s))
else:#是浮点数
s1=s.split('.')
s2int=reduce(mulit_int,map(char2int,s1[0])) #整数部分
s2float=reduce(mulit_int,map(char2int,s1[1]))*0.1**len(s1[1]) #小数部分
return s2int+s2float
print(str2int("123345.678"))
'''
上面涉及到的知识点:python中内置的map()和reduce()函数的应用。
其中map()函数要接收两个参数,第一个参数为函数,第二个参数为一个Iterable对象,map将传入的函数依次作用到序列的每个元素,结果以Iterable返回。
而reduce()函数也接收两个参数,与map一样,但是reduce函数是把结果和序列中剩下的元素一起继续参与运算
列表转字符串
'''
a = ['I', 0, 0, 0, 0, 0]
for i in range(0,a.__len__()):
a[i] = str(a[i])
print a
str1 = ""
str1 = str1.join(a)
print str1
strNumber= ''.join(map(str,listNumber))
关于Miller-Rabin素性测试的误判概率
当选取2、3、5、7、11、13、17这7个数时,
所有不超过341 550 071 728 320的数判定结果都正确。
http://tieba.baidu.com/p/4009980598
RSA python 实现:
https://kifish.visualstudio.com/pieces/_git/pieces?path=%2Fpython%2Fpython—RAS—%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%2Ffinalmodify.py
https://kifish.visualstudio.com/_git/pieces?path=%2Fpython%2Fpython—RAS—%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A