【愚公系列】2022年04月 编码解码-栅栏密码原理
一、栅栏密码原理
1.栅栏密码编码原理
与摩尔斯密码相对,栅栏密码应该算是古典密码学中最经典的移位密码了,两者可以说代表了密码学中最重要的两个概念(扩散和混淆)。
我们以2栏栅栏密码为例来讲解它的加密和解密过程。
比如明文:THERE IS A CIPHER
两个一组,得到:(TH) (ER) (E ) (IS) ( A) © (IP) (HE) (R )
先取出第一个字母:TEEI IHR
再取出第二个字母:HR SACPE
连在一起就是:TEEI IHRHR SACPE
还原为所需密码。
而解密的时候,我们先把密文从中间分开,变为两行:
TEEI IHR
HR SACPE
再按上下上下的顺序组合起来:
THERE IS A CIPHER
那么将2栏密码扩展到多栏呢?
相信你也已经注意到,在之前的明文中,我在CIPHER这个单词之后加了一个空格,那么目的相信你也已经猜测出来,就是为了让明文字符串的长度是2的倍数,那么栅栏密码的分栏的第一个前提就是分的栏数是明文长度的倍数,这样才会分出来的每个栏长度都一样。
对于多栏,我们还是用上面的例子来讲解。
上面的明文字符串(THERE IS A CIPHER )的长度是18,所以我们可以把他分为2,3,4,6,9栏,这里我们以6栏为例。
以每个元素相隔6个字符分割出栅栏。
第一栏:TII
第二栏:HSP
第三栏:E H
第四栏:RAE
第五栏:E R
第六栏: C
连接在一起就是:TIIHSPE HRAEE R C
2.栅栏密码脚本
def fenceEncode(m, key):
text = ''
k = int(key)
for i in range(k):
text += m[i::k]
return text
def fenceDecode(c, key):
text = ''
k = len(c) // int(key)
for i in range(k):
text += c[i::k]
return text
if __name__ == "__main__":
m = "flag{wdfafw-adwa-awfawf}"
c = fenceEncode(m, 4)
print(c)
print(fenceDecode(c, 4))
总结
栅栏密码比较简单可以采用以下两种方案进行密码加强:
-
在选择行数时可以使多行,这样对于加密强度有所提高
-
可以在加密之后在使用其他密码进行加密,增加强度
- 点赞
- 收藏
- 关注作者
评论(0)