置換密碼是一種通過一定規則改變字串中字元的順序從而實現加密的密碼演算法。常見的是將明文本串按照n個一行形成矩陣,然後再按列讀出,矩陣的列數(n)和按列讀出的順序便是金鑰。
我們以字串「hello-my-cipher」為例來演示加密過程
選擇金鑰,我們這裡使用「4213」作為金鑰。該金鑰共4位,表示中間結果的矩陣共4列,4213表示按照第四列,第二列,第一列,第三列的順序讀出形成密文
生成中間結果矩陣(該行不夠4個則用明文中不包含的固定字元填充,這裡使用『@』)
h e l l
o - m y
- c i p
h e r @
按照金鑰所示的列順序讀出
lyp@e-ceho-hlmir
至此加密完成
解密過程即按照金鑰所示的長度順序恢復出矩陣,再按行讀取即可。
根據置換密碼演算法的特點,破解的主要難點是確定金鑰的長度。我們可以根據密文的第乙個和第二個字元在明文中的位置之差得出金鑰的長度,但這中方法並不總是有效,例如helloeye用金鑰1234加密後密文前兩個字元是he,而h,e在明文中的位置有1和4,再例如helloeye用3124加密後前兩個字元是ly,而l,y在明文中的位置有4和5,所以這個方法無法完全確定金鑰長度。假如我們確定了金鑰長度,就可以把明文形成矩陣,然後比對密文和明文矩陣的列,便能確定按列讀出的順序,也就得到了金鑰。(這裡還有碰到明文矩陣中兩列完全一樣情況,這樣就得不到完整的金鑰)
舉個栗子:
明文:abcdefgh
金鑰:2143
加密結果:bfaedhcg(8個字元)
根據bf在明文中的位置,第2和第6,得到金鑰長度為4,則每列長度為8/4
=2,然後生成矩陣
a b c d
e f g h
密文中前2個字元為bf,找到矩陣中bf列為第二列,金鑰第一位是2,密文中接下來2個字元是ae,找到矩陣中ae
列為第一列,金鑰第二位是1,按這個方法,就可以得到金鑰為2143了
當面對金鑰長度有多種可能的時候,目前在我看來只能全部試過,所以這個破解不算完全。
/*置換密碼編碼
*permutation_encode(plain_text,len,key,key_len,&result)
*@para1:字串明文
*@para2:該明文的長度
*@para3:以字串數字表示的金鑰,即讀取列的順序
*@para4:金鑰的長度,也是置換中矩陣行的長度
*@para5:用來接收結果的二級指標(傳入引數時使用&+一級指標)
*返回加密後字串的長度
**permutation_decode(cipher_text,len,key,key_len,&result)
*引數與加密函式類似,區別是第乙個為密文字串
*返回解密後明文的長度
*//*編碼*/
intpermutation_encode
(const
char
* plain_text,
int len,
const
char
* key,
int key_len,
char
** result)
else
/*該列最後一行沒有字元,則填充@*/
/*取該列下乙個字元*/
p_plain = p_plain + key_len;
} cipher_text[space]
='\0'
;*result = cipher_text;
return space;
}int
permutation_decode
(char
* cipher_text,
int len,
char
* key,
int key_len,
char
** result)
else
/*正常讀取*/
p_plain = p_plain + key_len;
} plain_text[plain_text_len]
='\0'
;*result = plain_text;
return plain_text_len;
}
古典密碼之置換密碼
古典密碼編碼方法主要有兩種,即置換和代換。置換密碼 換位密碼 是一種早期的加密方法,與明文的字母保持相同,區別是順序被打亂了。加密方法 縱行換位密碼,在簡單的縱行換位密碼中,明文以固定的寬度水平的寫在一張圖表紙上,密文按垂直方向讀出,解密就是密文按相同的寬度垂直的寫在圖表紙上,然後水平的讀出明文。例...
古典密碼 凱撒密碼Caeser
在早期,凱撒密碼 caeser cipher 是指將密文平移三位,後來經過推廣,平移個數擴充套件為任意位,即移位密碼 shift cipher 凱撒密碼 caesar 加密時會將明文中的每個字母都按照其在字母表中的順序向後 或向前 移動固定數目 迴圈移動 作為密文。例如,當偏移量是左移 3 的時候 ...
古典密碼演算法 替代密碼演算法
替代密碼演算法 的原理是使用替代法進行加密,就是將明文中的字元用其它字元替代後形成密文。例如 明文本母a b c d 用d e f g做對應替換後形成密文。替代密碼包括多種型別,如單錶替代密碼 多明碼替代密碼 多字母替代密碼 多表替代密碼等。下面我們介紹一種典型的單錶替代密碼,愷撒 caesar 密...