• 古典密码-维吉尼亚密码Vigenere


    维吉尼亚密码Vigenère基础知识

    维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码中的一种

    生成维吉尼亚密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。如下

    0ptgfJ.png

    Tip:横着看为密钥,竖着读为明文

    这样单单看,很难了解到其中的原理,下面引入一个例子

    举个栗子

    假设我们的明文M为:

    CRYPTOGRAPHY
    

    选择一组任意长度的密钥K(若小于明文长度,则重复),这里我们选择NIGHT作为关键字,重复关键字得到最终的密钥K:

    NIGHTNIGHTNI
    

    加密

    从明文的第一个字母C开始,对应密钥中第一位字母N,查表得知为P(明文竖着读,密钥横着读),重复此操作,最终得到:

    明文:CRYPTOGRAPHY
    密钥:NIGHTNIGHTNI
    密文:PZEWMBOXHIUG
    

    解密

    找到密钥第一个字母N对应的那一栏,找到P,再看最左边对应的字母,重复此操作得到明文

    维吉尼亚密码Vigenère的破译

    参考:维吉尼亚密码破译

    普通的加密可以通过使用简单的频率分析破解。但是在维吉尼亚密码中,E可以被加密成不同的密文,因而简单的频率分析在这里并没有用。

    卡西斯基试验

    卡西斯基试验的原理就是是基于类似the这样的常用单词在密文中的重复出现。例如,明文中不同的CRYPTO可能被密钥ABCDEF加密成不同的密文:

    密钥:ABCDEF AB CDEFA BCD EFABCDEFABCD
    明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY
    密文:CSASXT IT UKSWT GQU GWYQVRKWAQJB
    

    此时明文中重复的元素在密文中并不重复。然而,如果密钥相同的话,结果可能便为(使用密钥ABCD):

    密钥:ABCDAB CD ABCDA BCD ABCDABCDABCD
    明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY
    密文:CSASTP KV SIQUT GQU CSASTPIUAQJB
    

    此时卡西斯基试验就能产生效果。对于更长的段落此方法更为有效,因为通常密文中重复的片段会更多。如通过下面的密文就能破译出密钥的长度:

    密文:DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD

    其中,两个DYDUXRMH的出现相隔了18个字母。因此,可以假定密钥的长度是18的约数,即长度为18、9、6、3或2。而两个NQD则相距20个字母,意味着密钥长度应为20、10、5、4或2。取两者的交集,则可以基本确定密钥长度为2。

    弗里德曼试验

    佛里德曼于1920年发明佛里德曼试验,其基本原理是使用了重合指数来描述密文字母频率的不匀性,进而破译密码。(K_p)指目标语言中两个任意字母相同的概率(英文中为0.067),(K_r)指字母表中这种情况出现的概率(英文中为1/26=0.0385),从而密钥长度可以估计为:

    [{K_p - K_r}over {K_o - K_r} ]

    其中,观察概率(K_o)

    [K_o = {{sum_{i=1}^c}n_i(n_i-1)over N(N-1)} ]

    其中,c是指字母表的长度(英文为26),N指文本的长度,(n_1)(n_c)是指密文的字母频率,为整数。

    此方法只是一种估计,会随着文本长度的增加而更为精确。

    在线网站破译

    网站地址

    相关题目

    题目来源:https://adworld.xctf.org.cn/task/answer?type=crypto&number=5&grade=1&id=5451&page=1

    文件信息

    0pyriq.png

    解题方法

    这里提供一个非常强的在线解密网站,在线解密维吉尼亚密码,页面如下

    0p6G79.png

    将密文cipher填入方框中,点击解密即可

    在下方会显示出分析的信息

    0pcCNR.png

    在明文里面搜索得到flag关键字,即可得到flag

    flag{vigenereisveryeasyhuh}

    0pcKUA.png

  • 相关阅读:
    php--有限继承
    面向对象三大特性(封装/继承/多态)
    定义文本溢出
    设计模式
    js数组sort方法
    鼠标移动事件
    单击事件
    数据类型转换与比较
    html主要笔记
    字符串常用的方法
  • 原文地址:https://www.cnblogs.com/labster/p/13727130.html
Copyright © 2020-2023  润新知