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算法可行性证明。不过图片不方便放…改天找个机会打上来