#-*- coding:utf-8 -*- import base64 defRC4(text,key): ## 将0到255的互不重复的元素装入S盒。 lk = len(key) S = [0] * 256#S数组S T=''#临时向量T for i in range(256) : S[i] = i#S赋初值 T += key[i%lk]#T赋初值,填充满T ## 根据密钥打乱S盒 j = 0 for i in range(256): j = (j+S[i]+ord(T[i]))%256 S[i],S[j] = S[j],S[i] ## 生成伪随机数,构造密文 i = j = 0 ans = "" for x in text: i = (i+1)%256 j = (j+S[i])%256 S[i],S[j] = S[j],S[i] t = (S[i]+S[j])%256 k = S[t] #加密时,将k与明文异或;解密时,k与密文异或 ans += chr(ord(x)^k) return ans # RC4加密: 明文转成base64编码的密文 defRC4Encrypt(message,key): return base64.b64encode(RC4(message,key)) # RC4解密: base64编码的密文转成明文 defRC4Decrypt(cipher,key): return RC4(base64.b64decode(cipher),key)
#Miller-Rabin测试:不断选取不超过n-1的基b(s次), #计算是否每次都有bn-1 ≡ 1(mod n),若每次都成立则n是素数,否则为合数。 #Miller_Rabin算法 defmiller_rabin(a,n): temp=n-1 j=0 while temp&1==0: temp=temp>>1 j+=1 x=fast_mod(a,temp,n) if x==1or x==n-1: returnTrue while j: x=fast_mod(x,2,n) if x==n-1: returnTrue j-=1 returnFalse
#判断是否为素数 defis_prime(n): times=100 if n==2: returnTrue if n<2or n%2==0: returnFalse i=1 while i<=times: a=random.randint(1,n-2)+1 if miller_rabin(a,n)==False: returnFalse i+=1 returnTrue
#模重复平方计算法 deffast_mod(b,n,m): a=1 while n!=0: temp=n&1 n=n>>1 if temp==1: a=(a*b)%m b=(b*b)%m return a
#生成素数 defcreate_prime(): whileTrue: #p=random.randrange(1<<64,1<<128,3) p=random.randrange(1<<512,1<<1024,3) if(is_prime(p)): return p
#生成公钥,随机得到小素数,(e,Φ(n))=1 defE(fn): whileTrue: e=random.randint(1<<16,fn) temp=e t=fn d=1 while d!=0: d=t%temp t=temp temp=d if t==1: return e