日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

仿射密码

發(fā)布時(shí)間:2024/8/1 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿射密码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

仿射密碼定義原理:
??仿射密碼為單表加密的一種,字母系統(tǒng)中所有字母都借一簡(jiǎn)單數(shù)學(xué)方程加密,對(duì)應(yīng)至數(shù)值,或轉(zhuǎn)回字母。 其仍有所有替代密碼之弱處。所有字母皆借由方程加密,b為移動(dòng)大小。
??在仿射加密中,大小為m之字母系統(tǒng)首先對(duì)應(yīng)至0…m-1范圍內(nèi)之?dāng)?shù)值, 接著使用模數(shù)算數(shù)來(lái)將原文件中之字母轉(zhuǎn)換為對(duì)應(yīng)加密文件中的數(shù)字。 單一字母的加密函數(shù)為:
??
取余m為字母系統(tǒng)大小且a和b為密碼關(guān)鍵值。a之值必須使得a與m互質(zhì)。
解密方程為
??
舉例說(shuō)明:

代換密碼算法的原理是使用替代法進(jìn)行加密,就是將明文中的字符用其它字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做對(duì)應(yīng)替換后形成密文。
代換密碼包括多種類(lèi)型,如單表代換密碼、多表代換密碼等。下面介紹一種典型的單表代換密碼——仿射密碼。它的加密、解密過(guò)程可以表示為下面的函數(shù):

仿射加密要求gcd(k1,26)=1,否則就褪化為 y=f(k)=k2(mod 26)。
故密鑰空間大小為: (k1,k2)=12x26=312
例如:密鑰k=(7,3),7-1(mod 26)=15
加密函數(shù): y=f(x)=7x+3(mod 26)
解密函數(shù): x=f^(-1)(y)=15(y-3)(mod 26)=15y-9(mod 26)
設(shè)明文:China,首先轉(zhuǎn)換為數(shù)字:2,7,8,13,0
原始消息“China”得到恢復(fù)

1、實(shí)驗(yàn)?zāi)康?#xff1a;
??通過(guò)編程實(shí)現(xiàn)代換密碼算法——仿射密碼和簡(jiǎn)單置換密碼算法,加深對(duì)古典密碼體制的了解,為深入學(xué)習(xí)密碼學(xué)奠定基礎(chǔ)。
2、實(shí)驗(yàn)內(nèi)容:
??根據(jù)仿射密碼的實(shí)現(xiàn)原理,實(shí)現(xiàn)利用仿射密碼進(jìn)行加密和解密的程序。
??(1)設(shè)計(jì)加密程序:能夠根據(jù)用戶(hù)輸入明文的內(nèi)容產(chǎn)生加密的密文并輸出。
??(2)設(shè)計(jì)解密程序:能夠?qū)斎氲拿芪膬?nèi)容破解并輸出得到其對(duì)應(yīng)的明文。

# -*- coding: UTF-8 -*- import math """仿射密碼加密解密模塊@author WQ@time 2020/11/18 """ class Affine():"""仿射密碼Encrypt:加密方法Decrypt:解密方法letters:字母數(shù)字對(duì)應(yīng)字典"""def __init__(self):self.ciphertext='' #加密后的密文self.plaintext='' #解密后的明文self.reverse=0 #秘鑰a的逆元self.list_keya=[3,5,7,9,11,15,17,19,21,23,25] #秘鑰a可能取值self.letters = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g':6, 'h': 7,'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20,'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}def gcd(self,a,b=26):if(a<b):return self.gcd(b,a)while(a%b!=0):temp = bb = a%ba = tempreturn b def Encrypt(self,a=0,b=0,input=""):"""對(duì)輸入的字符串進(jìn)行加密加密算法:c=Ea,b(m)=am+b(mod26) m是單個(gè)明文字母args={a,b:秘鑰input:用于加密的明文} """if(self.gcd(a)!=1):print("秘鑰a錯(cuò)誤,應(yīng)與26互質(zhì),請(qǐng)重輸!")exit(0)if(b>=26):print("秘鑰b錯(cuò)誤[0~26],請(qǐng)重輸!")exit(0)input=input.lower()digitals=[]#加密轉(zhuǎn)化成密文對(duì)應(yīng)數(shù)字for i in input:for j in self.letters:if(i==j):d=(a*self.letters[i]+b)%26digitals.append(d)#將對(duì)應(yīng)數(shù)字轉(zhuǎn)化對(duì)應(yīng)密文字母for i in digitals:for j in self.letters:if(i==self.letters[j]):self.ciphertext=self.ciphertext+j def Decrypt(self, a, b, input=""):"""對(duì)輸入的字符串進(jìn)行解密解密算法:m=Da,b(m)=a(-1)(c-b)(mod26) c是單個(gè)密文字母args={a(-1):秘鑰a的逆元b:秘鑰input:用于解密的秘文} """if(self.gcd(a)!=1):print("秘鑰a錯(cuò)誤,應(yīng)與26互質(zhì),請(qǐng)重輸!")exit(0)if(b>=26):print("秘鑰b錯(cuò)誤[0~26],請(qǐng)重輸!")exit(0)digitals=[]self.reverse=self.Inverse(a) #求逆元for i in input:#解密 密文轉(zhuǎn)化成對(duì)應(yīng)數(shù)字for j in self.letters:if(i==j):digitals.append(self.letters[j])#解密for i in digitals:t=(self.reverse*(i-b))%26for j in self.letters:if(t==self.letters[j]):self.plaintext=self.plaintext+jdef BruteForce(self, input=''):#暴力破解仿射密碼digitals=[]plaintext=''for i in input: #解密 密文轉(zhuǎn)化成對(duì)應(yīng)數(shù)字for j in self.letters:if(i==j):digitals.append(self.letters[j])for keya in self.list_keya:a=self.Inverse(keya)for keyb in range(0,26):for i in digitals:t=(keya*(i-keyb))%26for j in self.letters:if(t==self.letters[j]):plaintext=plaintext+jbreakprint(plaintext)plaintext=''def Inverse(self, a,mod=26):#求秘鑰a的逆元 歐幾里得算法 x1,x2,x3 = 1,0,mody1,y2,y3 = 0,1,awhile(1):if(y3==0):g=x3breakif(y3==1):g=y3breakq=math.floor(x3/y3)#向下取整t1,t2,t3=x1-q*y1,x2-q*y2,x3-q*y3x1,x2,x3=y1,y2,y3y1,y2,y3=t1,t2,t3return y2 #逆元求得為y2,y3為gcd(a,26),最大公因數(shù) if __name__ == "__main__":test=Affine()#a=test.Inverse(615647919867658945209035999713482421889581801898774401730949,691310408299283134015133178155232316338199895735303344369216)#print(a)inputs=input("請(qǐng)輸入待加密明文:")a=int(input("請(qǐng)輸入秘鑰[a]:"))b=int(input("請(qǐng)輸入秘鑰[b]:"))test.Encrypt(a,b,inputs)test.Decrypt(a,b,test.ciphertext)s1 = "加密為:" + test.ciphertexts2 ="解密為:" + test.plaintexts3 = str(a) + "的逆元為: " + str(test.reverse)print(s1)print(s2)print(s3)#test.BruteForce(test.ciphertext)

運(yùn)行結(jié)果:

小結(jié):仿射密碼是利用簡(jiǎn)單的置換原理,實(shí)現(xiàn)比較容易;增加了一個(gè)爆破函數(shù),利用窮舉爆破仿射密碼。

總結(jié)

以上是生活随笔為你收集整理的仿射密码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。