【愚公系列】2022年04月 编码解码-栅栏密码原理

举报
愚公搬代码 发表于 2022/04/30 22:09:27 2022/04/30
【摘要】 一、栅栏密码原理 1.栅栏密码编码原理与摩尔斯密码相对,栅栏密码应该算是古典密码学中最经典的移位密码了,两者可以说代表了密码学中最重要的两个概念(扩散和混淆)。我们以2栏栅栏密码为例来讲解它的加密和解密过程。比如明文:THERE IS A CIPHER两个一组,得到:(TH) (ER) (E ) (IS) ( A) © (IP) (HE) (R )先取出第一个字母:TEEI IHR再取出第...

一、栅栏密码原理

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))

总结

栅栏密码比较简单可以采用以下两种方案进行密码加强:

  • 在选择行数时可以使多行,这样对于加密强度有所提高

  • 可以在加密之后在使用其他密码进行加密,增加强度

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。