Python实现RSA算法

  1 #coding:utf-8
  2 import random
  3 __author__ = 'Kerne0'
  4 class RSA:
  5     def __init__(self):
  6         self.p=0#大素数P
  7         self.q=0#大素数Q
  8         self.n=0#p*q
  9         self.nx=0#(p-1)*(q-1)
 10         self.e=0#公钥
 11         self.d=0#私钥
 12 
 13     #计算a*b%n
 14     def ModMul(self,a,b,n):
 15         res=0
 16         while(b):
 17             if(b&1):
 18                 res=(res+a)%n
 19             a=(a+a)%n
 20             b=b>>1
 21         return res
 22 
 23     #a^b % n
 24     def ModExp(self,a,b,n):
 25         res=1
 26         while(b):
 27             if(b&1):
 28                 res=self.ModMul(res,a,n)
 29             a=self.ModMul(a,a,n)
 30             b=b>>1
 31         return res
 32 
 33     #MillersRabin素性测试
 34     def MillersRabin(self,n):
 35         for x in range(10):#可以自定义次数
 36             a=random.randint(2,n-1)
 37             if self.ModExp(a,n-1,n)!=1:
 38                 return False
 39         return True
 40 
 41     #随机数产生
 42     def PrimeRandom(self,m=0):
 43         flag=True
 44         while(flag):
 45             for x in range(12):
 46                 y=random.randint(0,9)
 47                 m=m*10+y
 48             flag=not(self.MillersRabin(m))
 49             if flag==True:
 50                 m=0
 51         return m
 52 
 53     #计算e,辗转相除法
 54     def CalculationE(self,nx):
 55         y=0
 56         while(True):
 57             for x in range(5):
 58                 r=random.randint(1,9)
 59                 y=y*10+r
 60             a=y
 61             while(nx%a!=0):
 62                 a,nx=nx%a,a
 63             if a==1:
 64                 break
 65             y=0
 66         return  y
 67 
 68     #扩展的欧几里德算法
 69     def EGcd(self,a,b,x,y):
 70         if b==0:
 71             x[0]=1
 72             y[0]=0
 73             return a
 74         ans=self.EGcd(b,a%b,x,y)
 75         temp=x[0]
 76         x[0]=y[0]
 77         y[0]=temp-a/b*y[0]
 78         return ans
 79 
 80     #计算d
 81     def Cal(self,a,m):
 82         x=[0]
 83         y=[0]
 84         gcd=self.EGcd(a,m,x,y)
 85         if 1%gcd!=0:
 86             return -1
 87         x[0]*=1/gcd
 88         m=abs(m)
 89         ans=x[0]%m
 90         if ans<=0:
 91             ans+=m
 92         return ans
 93 
 94     #生成公私钥
 95     def rsa(self):
 96         self.p=self.PrimeRandom()
 97         print "大素数P:     ",self.p
 98         self.q=self.PrimeRandom()
 99         print "大素数Q:     ",self.q
100         self.n=self.p*self.q
101         print "P与Q乘积:    ",self.n
102         self.nx=(self.p-1)*(self.q-1)
103         print "(p-1)*(q-1)  ",self.nx
104         self.e=self.CalculationE(self.nx)
105         print "e            ",self.e
106         self.d=self.Cal(self.e,self.nx)
107         print "d            ",self.d
108 
109     #加解密测试
110     def RSAT(self,stringM):
111         print '明文:',stringM
112         #将字符串stringM转换为列表lm
113         lm=[]
114         for x in stringM:
115             lm.append(ord(x))
116         #将每个字符的ASC值加密存入lc
117         lc=[]
118         stringC=''
119 
120         for m in lm:
121             mx=self.ModExp(m,self.e,self.n)
122             lc.append(mx)
123             stringC+=str(mx)
124         print '密文:',stringC
125         #将密文解密,存入lx列表中
126         lx=[]
127         for c in lc:
128             lx.append(self.ModExp(c,self.d,self.n))
129         #将列表转换为字符串并输出
130         string=''
131         for ch in lx:
132             string+=chr(ch)
133         print '解密:',string
134 if __name__=="__main__":
135     s=RSA()
136     s.rsa()
137     x='hello world'
138     s.RSAT(x)

运行结果截图:

转载于:https://www.cnblogs.com/Kerne0/p/5067955.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值