RSA密码
这是之前学的内容,想了想还是放到了博客上。自己对密码学还是挺有兴趣的。
RSA密码介绍
RSA来自与同余方程,其破解难度在于大数的分解,现用的标准的RSA往往位数都达到了1024位,分解难度极大,这也保障了其安全性。涉及的有n,p,q,d,e。
步骤为选取大质数p,q,并得其乘积n和欧拉函数值φ(n),φ(n)即(p-1)(q-1),再取一个小于φ(n)且与φ(n)互质的值e。此时,通过辗转相除法算得方程e*d≡1 mod φ(n),得到d,就得到了一组公钥和私钥 公钥(e,n) 私钥(d,n) 这里也是贴出二面的时候写的一个简单的加密解密脚本(当然,位数肯定不能支持标准位数,而且也没用辗转相除法去求d的值。)
p=int(input("请输入质数p:")) #输入p值
if p > 1:
for i in range(2,p):
if (p % i) == 0:
print(p,"不是质数")
print(i,"乘于",p//i,"是",p)
exit()
else:
print("输入成功")
else:
print(p,"不是质数")
exit()
q=int(input("请输入质数q:")) #输入q值
if q > 1:
for i in range(2,q):
if (q % i) == 0:
print(q,"不是质数")
print(i,"乘于",q//i,"是",q)
exit()
else:
print("输入成功")
else:
print(q,"不是质数")
exit()
print("请记录下p和q的值!")
n = p*q #得到n值
print("n的值为",n)
f = (p-1)*(q-1) #得到φ(n)值
print("φ(n)的值为",f)
def hcf(x, y): #取e的值并判断是否符合
if x > y:
smaller = y
else:
smaller = x
for i in range(1,smaller + 1):
if((x % i == 0) and (y % i == 0)):
hcf = i
return hcf
while True:
e = int(input("请输入e的值,e需小于φ(n):"))
if 0<e<f and hcf(e,f) == 1:
break
else:
print("e不为",f,"的互质数或不在1到",f,"之间,请重新输入")
print("输入成功!e的值为",e,"!请记录下e的值")
print("请从下列参考数据中选择d的值,没有就请重新来过= =(自己算个合适的d的值也不是不行!)") #取d的值
for i in range(1,200):
l = (i*f+1)/e
if int(l) == l:
print(l)
d=int(input("请输入选择的d的值:"))
print("公钥为(",e,",",n,")")
print("密钥为(",d,",",n,")")
mingwen=list(input("输入需要加密的明文:"))
zimu=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
shuzi=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
def zts_jiami(x): #加密
k=[]
h=[]
for i in x:
k.append(zimu.index(i)+1)
for i in k:
h.append(pow(i,e,n))
print(h)
print(''.join([str(j) for j in h]))
zts_jiami(mingwen)
miwen=input("输入需要解密的密文(相邻密文间请打空格):")
r=miwen.split(' ')
def zts_jiemi(x): #解密
k=[]
h=[]
for i in r:
k.append(pow(int(i),d,n))
for i in k:
h.append(zimu[i-1])
print(" ".join(h))
zts_jiemi(r)
可进行位数低的加密解密。现实中的RSA要比我这个复杂好多… 另外还有rsa算法可行性证明。不过图片不方便放…改天找个机会打上来