Vigenere Cipher - 解密(手动)

Posted

技术标签:

【中文标题】Vigenere Cipher - 解密(手动)【英文标题】:Vigenere Cipher - decryption (by hand) 【发布时间】:2011-06-23 13:21:01 【问题描述】:

这是一个 Vigenere 密文

EORLL TQFDI HOEZF CHBQN IFGGQ MBVXM SIMGK NCCSV
WSXYD VTLQS BVBMJ YRTXO JCNXH THWOD FTDCC RMHEH
SNXVY FLSXT ICNXM GUMET HMTUR PENSU TZHMV LODGN
MINKA DTLOG HEVNI DXQUG AZGRM YDEXR TUYRM LYXNZ
ZGJ

巧合指数给出了六 (6) 的转变:我知道这是正确的(我使用在线 Java 小程序使用密钥“QUARTZ”解密整个事情)。

但是,在这个问题中,我们只知道密钥的第一个和最后两个字母 - 'Q' 和 'TZ'。

到目前为止,我已经使用 this awesome applet 将密文分割成片段。所以第一个切片是0、k、2k、3k、4k;第二个是1,k + 1,2k + 1,3k + 1;等等。

KeyPos=0: EQEQQSCXQJJHDEYIUTSVMTVUMTYJ
KeyPos=1: OFZNMICYSYCWCHFCMUULILNGYUX
KeyPos=2: RDFIBMSDBRNOCSLNERTONOIADYN
KeyPos=3: LICFVGVVVTXDRNSXTPZDKGDZERZ
KeyPos=4: LHHGXKWTBXHFMXXMHEHGAHXGXMZ
KeyPos=5: TOBGMNSLMOTTHVTGMNMNDEQRRLG

我的想法是计算每个块中出现频率最高的字母,希望最常见的字母能给我一些关于如何找到“U”、“A”和“R”的线索。但是,这些块中最常见的字母是:

KeyPos=0: Q,4 T,3 E,3, J,3
KeyPos=1: C,4 U,3 Y,3
KeyPos=2: N,4 O,3 R,3 D,3 B,2
KeyPos=3: V,4 D,3 Z,3
KeyPos=4: H,6 X,6 M,3 G,3
KeyPos=5: M,4 T,4 N,3 G,3

产生 QCNVHM 或 QUNVHM(慷慨),两者都与 QUARTZ 不相近。有online applets 可以破解这个没问题,所以它不能太短的文本从块中产生合适的频率计数。

我想我一定是以错误的方式处理这个问题。我只是希望你们中的一个人能够提供一些线索来说明我哪里出错了。

附言这是一个数字加密类。

【问题讨论】:

如果您想知道如何“手工”完成,可以说这不是一个编程问题 是的,我也这么想。基础知识是构建加密货币所必需的,所以我认为从这个意义上说可能没问题。我会投票赞成你的评论,因为我同意。 :// ……嗯。我可以发誓那里有一个密码学 SE 网站,但我现在找不到。 有很多密码学家在security.stackexchange.com闲逛 有一个即将推出的密码学网站提案:area51.stackexchange.com/proposals/15811/cryptography 【参考方案1】:

有趣的问题...

我没有破解原始密文的编程解决方案,但我能够用一点点脑力和一些有用的 javascript 来解决它。

我首先使用this page 和您提供的信息。提供密文,密钥长度为 6 并点击初始化。该方法的优点在于明文或密钥中的未知数都保留为连字符。

更新密钥,只添加你知道的Q---TZ,然后点击“更新明文”。此时我们知道:

o---sua---opo---oca---nha---enc---rom---dth---ama---int---ept---our-- -mun---tio---ewi---eus---the---ond---loc---onf---now---hed---off---ere---nsw ---esd---tmi---ght

在这里,我运用了一些脑力。您开始识别明文的位。 thenowoff 亮相。最后是ght——这让我觉得前面的字母很可能是元音。例如lightthought。我用u 替换了相应的连字符并单击更新关键字以查找哪个字母会产生该组合。匹配的字母原来是F。我认为更新了明文以查看结果。他们看起来并不乐观。所以我尝试了i,结果是:

o--usua--ropo--loca--onha--eenc--prom--edth--eama--eint--cept--gour--mmun--atio--wewi--beus- -gthe--cond--yloc--ionf--mnow--thed--poff--mere--insw--nesd--atmi--ight

现在我们正在取得进展。一开始我看到的东西可能是usual,然后我看到int--cept 和接近结尾的w--nesd-- at mi--ight。瞧。填写wednesday 的字母并更新关键字产生QUARTZ

... 那么,如何将这种方法移植到代码中呢?目前还不确定最好的方法。使用密钥中的已知字符、部分解密密文并暴力破解其余部分的想法很有吸引力。但是如果没有手边的字典,我不确定最好的暴力破解方法是什么......

待续(可能)...

【讨论】:

谢谢,这将是一个很好的解决方法(前提是明文是英文并且没有被打乱两次)。教科书的方法是使用 Kasiski 攻击或频率分析,但我不确定如何计算切片的重合指数。【参考方案2】:

算法不仅会考虑最常见的字母,还会考虑整个字母表的频率模式。从技术上讲,您为每个可能的班次计算 index of coincidence 并考虑最大班次。

【讨论】:

以上是关于Vigenere Cipher - 解密(手动)的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere Cipher使用命令行提示

C++ 链表凯撒密码 Vigenere Cipher

java cipher

Vigenere-cipher 错误输出

PSET 2:Vigenere Cipher 部分工作?

Vigenere Cipher - 不给信[关闭]