日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

仿射密码

發布時間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿射密码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

仿射密碼定義原理:
??仿射密碼為單表加密的一種,字母系統中所有字母都借一簡單數學方程加密,對應至數值,或轉回字母。 其仍有所有替代密碼之弱處。所有字母皆借由方程加密,b為移動大小。
??在仿射加密中,大小為m之字母系統首先對應至0…m-1范圍內之數值, 接著使用模數算數來將原文件中之字母轉換為對應加密文件中的數字。 單一字母的加密函數為:
??
取余m為字母系統大小且a和b為密碼關鍵值。a之值必須使得a與m互質。
解密方程為
??
舉例說明:

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

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

1、實驗目的:
??通過編程實現代換密碼算法——仿射密碼和簡單置換密碼算法,加深對古典密碼體制的了解,為深入學習密碼學奠定基礎。
2、實驗內容:
??根據仿射密碼的實現原理,實現利用仿射密碼進行加密和解密的程序。
??(1)設計加密程序:能夠根據用戶輸入明文的內容產生加密的密文并輸出。
??(2)設計解密程序:能夠對輸入的密文內容破解并輸出得到其對應的明文。

# -*- coding: UTF-8 -*- import math """仿射密碼加密解密模塊@author WQ@time 2020/11/18 """ class Affine():"""仿射密碼Encrypt:加密方法Decrypt:解密方法letters:字母數字對應字典"""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=""):"""對輸入的字符串進行加密加密算法:c=Ea,b(m)=am+b(mod26) m是單個明文字母args={a,b:秘鑰input:用于加密的明文} """if(self.gcd(a)!=1):print("秘鑰a錯誤,應與26互質,請重輸!")exit(0)if(b>=26):print("秘鑰b錯誤[0~26],請重輸!")exit(0)input=input.lower()digitals=[]#加密轉化成密文對應數字for i in input:for j in self.letters:if(i==j):d=(a*self.letters[i]+b)%26digitals.append(d)#將對應數字轉化對應密文字母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=""):"""對輸入的字符串進行解密解密算法:m=Da,b(m)=a(-1)(c-b)(mod26) c是單個密文字母args={a(-1):秘鑰a的逆元b:秘鑰input:用于解密的秘文} """if(self.gcd(a)!=1):print("秘鑰a錯誤,應與26互質,請重輸!")exit(0)if(b>=26):print("秘鑰b錯誤[0~26],請重輸!")exit(0)digitals=[]self.reverse=self.Inverse(a) #求逆元for i in input:#解密 密文轉化成對應數字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: #解密 密文轉化成對應數字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),最大公因數 if __name__ == "__main__":test=Affine()#a=test.Inverse(615647919867658945209035999713482421889581801898774401730949,691310408299283134015133178155232316338199895735303344369216)#print(a)inputs=input("請輸入待加密明文:")a=int(input("請輸入秘鑰[a]:"))b=int(input("請輸入秘鑰[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)

運行結果:

小結:仿射密碼是利用簡單的置換原理,實現比較容易;增加了一個爆破函數,利用窮舉爆破仿射密碼。

總結

以上是生活随笔為你收集整理的仿射密码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。