將明文p以設定的固定分組寬度m按行寫出,即每行有m個字元;若明文長度不是m的整數倍,則不足部分用雙方約定的方式填充,如雙方約定用空格代替空缺處字元,不妨設最後得字元矩陣[mp
]n×m
按1,2…,m的某一置換σ交換列的位置次序得字元矩陣[mp
]n×m
把矩陣按[mp
]n×m
列的順序依次讀出得密文序列c。
將密文c以分組寬度n按列寫出得到字元矩陣[mp
]n×m
按加密過程用的置換σ的逆置換σ
-1交換列的位置次序得字元矩陣[mp
]n×m
把矩陣[mp
]n×m
按1,2…,n行的順序依次讀出得明文p
以例3.2為例
σ=(143)(56)即每個括號裡部分輪著相對應
1→4→3→1
5→6→5
這裡我是用字典表示
for i in
range
(len
(s))
:for j in
range
(len
(s[i])-
1): key[
int(s[i]
[j])]=
int(s[i]
[j+1])
#金鑰字典
antikey[
int(s[i]
[j+1])
]=int(s[i]
[j])
#反金鑰字典
key[
int(s[i][-
1])]
=int
(s[i][0
])#解決最後乙個的問題
antikey[
int(s[i][0
])]=
int(s[i][-
1])int
(s[i][-
1]))
當然,這兒σ=(143)(56)中沒有2,因為2對應他自己即
2→2所以要再單獨表示
samekey=lenkey-
set(temp)
#找到沒有變化的金鑰
for i in samekey:
key[i]
=i antikey[i]
=i
而加密的時候,便是把明文先變為矩陣,載根據金鑰進行轉換
比如本題便將矩陣第一列轉換為第四列,第四列轉換為第三列,第三列轉換為第一列,以此類推
這裡可以用生成式完成
m=
[m[i]
[key[j+1]
-1]for i in
range
(n)for j in
range
(m)]
#矩陣轉換
'''列置換密碼
auher:jarrycow
time:2020-04-17
'''import re
class
colcode
: __m=
0 __n=
0 __key=
# 金鑰
__apamsg=
""# 明文
__secmsg=
""#密文
def__init__
(self,m)
:# 初始化,定義矩陣寬
self.__m=m
__n=
0 __key=
__apamsg=
"" __secmsg=
""def
getkey
(self,s)
:# 金鑰形成函式
m=self.__m
key=
antikey=
s=re.split(r'[()]'
,s)#以()分界
while
''in s:
# 消除''
s.remove('')
temp=
lenkey=
#金鑰長度
for i in
range
(len
(s))
:for j in
range
(len
(s[i])-
1): key[
int(s[i]
[j])]=
int(s[i]
[j+1])
#金鑰字典
antikey[
int(s[i]
[j+1])
]=int(s[i]
[j])
#反金鑰字典
int(s[i]
[j])
)#鑰匙收錄
key[
int(s[i][-
1])]
=int
(s[i][0
])#解決最後乙個的問題
antikey[
int(s[i][0
])]=
int(s[i][-
1])int
(s[i][-
1]))
samekey=lenkey-
set(temp)
#找到沒有變化的金鑰
for i in samekey:
key[i]
=i antikey[i]
=idef
encode
(self,p)
:#加密函式
self.__apamsg=p
m=self.__m
n=self.__n
key=self.__key[0]
p=p.replace(
' ','')
#去除空格
p+=' '*
(m-len
(p)%m)
#末尾補齊
n=len(p)
//m #矩陣列數
self.__n=n
m=[p[i*m:
(i+1
)*m]
for i in
range
(n)]
#矩陣生成
m=[m[i]
[key[j+1]
-1]for i in
range
(n)for j in
range
(m)]
#矩陣轉換
m=''.join(m)
#列表轉換為字串
self.__secmsg=m
return m
defdecode
(self,q)
: self.__apamsg=p
m=self.__m
n=self.__n
key=self.__key[1]
m=[q[i*m:
(i+1
)*m]
for i in
range
(n)]
m=[m[i]
[key[j+1]
-1]for i in
range
(n)for j in
range
(m)]
m=''.join(m)
self.__secmsg=m
return m
defprint
(self)
:print
(self.__m,self.__n,self.__key,self.__apamsg,self.__secmsg)
if __name__==
'__main__'
: m=
6 p=
"beijing 2008 olympic games"
s='(143)(56)'
a=colcode(m)
a.getkey(s)
q=a.encode(p)
e=a.decode(q)
a.print(
)def
main()
:pass
古典密碼 置換密碼
置換密碼是一種通過一定規則改變字串中字元的順序從而實現加密的密碼演算法。常見的是將明文本串按照n個一行形成矩陣,然後再按列讀出,矩陣的列數 n 和按列讀出的順序便是金鑰。我們以字串 hello my cipher 為例來演示加密過程 選擇金鑰,我們這裡使用 4213 作為金鑰。該金鑰共4位,表示中間...
古典密碼之置換密碼
古典密碼編碼方法主要有兩種,即置換和代換。置換密碼 換位密碼 是一種早期的加密方法,與明文的字母保持相同,區別是順序被打亂了。加密方法 縱行換位密碼,在簡單的縱行換位密碼中,明文以固定的寬度水平的寫在一張圖表紙上,密文按垂直方向讀出,解密就是密文按相同的寬度垂直的寫在圖表紙上,然後水平的讀出明文。例...
密碼學概述 置換密碼
如何將資訊進行加密,傳送到接收方,接收方在進行解密獲取資訊,中間即使有竊聽者竊聽到資訊也可解密破解。密碼編輯學 保密 密碼分析學 破譯 密碼系統圖示 密碼系統定義 密碼學 cryptography 加密 encryption 解密 decryption 1.置換定義 在限集x上的運算 x x若是雙射...