目錄
- 前言
- 一、移位密碼
- 二、仿射變換
- 三、全部代碼
- 總結(jié)
前言
這個代碼是很久之前的,已經(jīng)忘記具體的思路了,你可以結(jié)合此文章來了解兩個加密方式的內(nèi)容。
前兩個步驟是對應(yīng)加密方式的函數(shù),第三個步驟是整合。
一、移位密碼
def yiwei(string,number):
'''
將字符串的每個字母,向右移動指定的位數(shù),并返回移動后的字符串
如:A 向右移動3位,返回值為D
string為字符串,number為整型
A的ASCII碼為65
'''
new_string = ""
string = string.upper() #轉(zhuǎn)換為大寫
for i in string: #移位操作
#轉(zhuǎn)換為ascii碼后,經(jīng)過移位變?yōu)樾碌腶scii,再轉(zhuǎn)換回字母
new_string += chr((ord(i)-65+number)%26+65)
return new_string
##print(yiwei('AAA',3)) #測試函數(shù)正確性
def yiwei_decode(c):
'''移位密碼解密,并打印解密的結(jié)果'''
for i in range(1,27): #窮盡密鑰搜索,遍歷范圍[1,26]
print(yiwei(c,i))
print("解密結(jié)束")
##yiwei_decode("A") #測試函數(shù)正確性
二、仿射變換
def fangshe_key(m,c):
'''
通過已知的兩對明文密文,求解得到兩個密鑰
m為明文,c為密文
[A-Z]轉(zhuǎn)換為數(shù)字為[0-25]
'''
#大寫
m = m.upper()
c = c.upper()
#切片
m1 = m[:1:] #明文的第一個字母
m2 = m[-1::] #明文的最后一個字母
c1 = c[:1:] #密文的第一個字母
c2 = c[-1::] #密文的最后一個字母
## print(m1,m2)
## print(c1,c2)
#轉(zhuǎn)換為整數(shù)
m1 = ord(m1)-65
m2 = ord(m2)-65
c1 = ord(c1)-65
c2 = ord(c2)-65
## print(m1,m2)
## print(c1,c2)
#窮舉法
for i in range(0,26):
for j in range(0,26):
if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同時滿足加密算法時
return i,j
return False
##print(fangshe_key("IF","ED")) #測試函數(shù)正確性
def fangshe_reverse(x,y):
'''
計算乘法逆元,求解x^-1(%y)的乘法逆元,并返回對應(yīng)值
'''
i = 0
while True:
if x*i%26==1: #符合乘法逆元條件時
return i
i += 1
##print(fangshe_reverse(9,26)) #測試函數(shù)正確性
def fangshe_decode(c,a,b):
'''
仿射變換解密,并打印解密的結(jié)果
c為密文,a和b為密鑰
0=a,b=25,且滿足gcd(a,26)=1,a^-1表示a的逆元
加密公式:c = a*m + b%26
解密公式:m = (a^-1)*(c-b)%26
'''
new_string = ''
c = c.upper() #大寫轉(zhuǎn)換
for i in c: #逐個字母解密
new_i = ord(i)-65 #轉(zhuǎn)換成數(shù)字
new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密
new_string += chr(new_i + 65) #轉(zhuǎn)換回大寫字母
print(new_string)
print("解密結(jié)束")
##fangshe_decode("ED",9,10) #測試函數(shù)正確性
三、全部代碼
移位密碼
仿射變換
# coding=utf-8
# 作者:小狐貍FM
# 題目:古典密碼
def menu():
'''
菜單界面
'''
print("-----------------------")
print("| 0. 退出 |")
print("| 1. 移位密碼解密 |")
print("| 2. 仿射變換解密 |")
print("-----------------------")
##menu() #測試函數(shù)
def yiwei(string,number):
'''
將字符串的每個字母,向右移動指定的位數(shù),并返回移動后的字符串
如:A 向右移動3位,返回值為D
string為字符串,number為整型
A的ASCII碼為65
'''
new_string = ""
string = string.upper() #轉(zhuǎn)換為大寫
for i in string: #移位操作
#轉(zhuǎn)換為ascii碼后,經(jīng)過移位變?yōu)樾碌腶scii,再轉(zhuǎn)換回字母
new_string += chr((ord(i)-65+number)%26+65)
return new_string
##print(yiwei('AAA',3)) #測試函數(shù)正確性
def yiwei_decode(c):
'''移位密碼解密,并打印解密的結(jié)果'''
for i in range(1,27): #窮盡密鑰搜索,遍歷范圍[1,26]
print(yiwei(c,i))
print("解密結(jié)束")
##yiwei_decode("A") #測試函數(shù)正確性
def fangshe_key(m,c):
'''
通過已知的兩對明文密文,求解得到兩個密鑰
m為明文,c為密文
[A-Z]轉(zhuǎn)換為數(shù)字為[0-25]
'''
#大寫
m = m.upper()
c = c.upper()
#切片
m1 = m[:1:] #明文的第一個字母
m2 = m[-1::] #明文的最后一個字母
c1 = c[:1:] #密文的第一個字母
c2 = c[-1::] #密文的最后一個字母
## print(m1,m2)
## print(c1,c2)
#轉(zhuǎn)換為整數(shù)
m1 = ord(m1)-65
m2 = ord(m2)-65
c1 = ord(c1)-65
c2 = ord(c2)-65
## print(m1,m2)
## print(c1,c2)
#窮舉法
for i in range(0,26):
for j in range(0,26):
if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同時滿足加密算法時
return i,j
return False
##print(fangshe_key("IF","ED")) #測試函數(shù)正確性
def fangshe_reverse(x,y):
'''
計算乘法逆元,求解x^-1(%y)的乘法逆元,并返回對應(yīng)值
'''
i = 0
while True:
if x*i%26==1: #符合乘法逆元條件時
return i
i += 1
##print(fangshe_reverse(9,26)) #測試函數(shù)正確性
def fangshe_decode(c,a,b):
'''
仿射變換解密,并打印解密的結(jié)果
c為密文,a和b為密鑰
0=a,b=25,且滿足gcd(a,26)=1,a^-1表示a的逆元
加密公式:c = a*m + b%26
解密公式:m = (a^-1)*(c-b)%26
'''
new_string = ''
c = c.upper() #大寫轉(zhuǎn)換
for i in c: #逐個字母解密
new_i = ord(i)-65 #轉(zhuǎn)換成數(shù)字
new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密
new_string += chr(new_i + 65) #轉(zhuǎn)換回大寫字母
print(new_string)
print("解密結(jié)束")
##fangshe_decode("ED",9,10) #測試函數(shù)正確性
if __name__=='__main__':
while True:
menu()
choose = int(input("請選擇: "))
if choose==1:
string = input("請輸入密文: ")
yiwei_decode(string)
elif choose==2:
string = input("請輸入密文: ")
m = input("已知明文:")
c = input("對應(yīng)密文:")
a,b = fangshe_key(m,c)
fangshe_decode(string,a,b)
else:
break
總結(jié)
到此這篇關(guān)于Python移位密碼、仿射變換解密的文章就介紹到這了,更多相關(guān)Python移位密碼仿射變換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python序列循環(huán)移位的3種方法推薦
- python的移位操作實現(xiàn)詳解
- python移位運算的實現(xiàn)
- python實現(xiàn)整數(shù)的二進制循環(huán)移位
- python實現(xiàn)移位加密和解密
- 詳解Python計算機視覺 圖像扭曲(仿射扭曲)
- 基于Python解密仿射密碼
- Python實現(xiàn)仿射密碼的思路詳解