vigenere密码 Java编程破译

本文主要关注如何使用Java编程来破译Vigenere密码。通过读取存储在E盘名为ciphertext的TXT文件中的密文,利用特定算法,将大写密文转换为小写明文。在代码中,密钥存储于数组key中,经过计算得到密钥长度为6,分别为19,12,15,14,22,8。最终成功解密,输出的明文显示了一段对话内容。" 103536167,8751879,Node.js 实现支付宝接口集成,"['node.js', '支付宝接口', '支付集成']
摘要由CSDN通过智能技术生成

本文不会过多讨论理论,只谈编程。
示例密文:
OCWYIKOOONIWUGPMXWKTZDWGTSSAYJZWYEMDLBNQAAAVSUWDVBRFLAUPLOOUBFGQHGCSCMGZLATOEDCSDEIDPBHTMUOVPIEKIFPIMFNOAMVLPQFXEJSMXMPGKCCAYKWFZPYUAVTELWHRHMWKBBNGTGUVTEFJLODFEFKVPXSGRSORVGTAJBSAUHZRZALKWUOWHGEDEFNSWMRCIWCPAAAVOGPDNFPKTDBALSISURLNPSJYEATCUCEESOHHDARKHWOTIKBROQRDFMZGHGUCEBVGWCDQXGPBGQWLPBDAYLOOQDMUHBDQGMYWEUIK

代码:
/*
* 请把密文以txt格式存储到E盘,并命名为ciphertext
*/

public class vigenere {

public static void main(String[] args) {
    /*
     * import ciphertext from file 
     */

    File file = new File("E:\\ciphertext.txt"); 
    FileReader reader = null;
    try {
        reader = new FileReader(file);
    } catch (FileNotFoundException e) {         
        e.printStackTrace();
        System.out.println("\n请把密文以txt格式存储到D盘,并命名为ciphertext");
        System.exit(0);
    }   
    BufferedReader bReader = new BufferedReader(reader);
Vigenere密码是一种多表密码,它使用一个关键字来加密明文。具体来说,它使用一个类似于凯撒密码的移位表,但每个字母的移位量是根据关键字中的字符来确定的。因此,它比凯撒密码更加复杂和安全。 破译Vigenere密码的一般方法是使用Kasiski检测法和Friedman测试。Kasiski检测法是一种统计方法,可以找到Vigenere密码中的重复模式。Friedman测试则是一种频率分析方法,可以确定密钥长度和每个字母的移位量。 以下是一个Python程序,可以使用Kasiski检测法和Friedman测试来破解Vigenere密码: ```python import collections def kasiski(text): # 寻找重复模式 repeats = collections.defaultdict(list) for i in range(len(text)): for j in range(i+3, len(text)): if text[i:i+3] == text[j:j+3]: repeats[text[i:i+3]].append(j-i) return repeats def gcd(a, b): # 计算最大公约数 while b != 0: a, b = b, a % b return a def friedman(text): # 使用Friedman测试计算密钥长度 freqs = collections.Counter(text) IC = sum(n*(n-1) for n in freqs.values()) / (len(text)*(len(text)-1)) keylen = 0.027 / (IC - 0.038) * len(text) return round(keylen) def decrypt(text, key): # 解密文本 plaintext = '' for i in range(len(text)): shift = ord(key[i % len(key)]) - ord('a') plaintext += chr((ord(text[i]) - shift - ord('a')) % 26 + ord('a')) return plaintext ciphertext = 'KZBDRSGLXGZJLGRYLXGZHZQYKZBDRSGLXGZJLGRYLXGZHZQY' repeats = kasiski(ciphertext) distances = [] for repeat in repeats.values(): for i in range(len(repeat)-1): for j in range(i+1, len(repeat)): distances.append(gcd(repeat[i], repeat[j])) keylen = min(distances) print('Key length:', keylen) key = '' for i in range(keylen): freqs = collections.Counter(ciphertext[i::keylen]) max_freq = max(freqs.values()) for letter, freq in freqs.items(): if freq == max_freq: key += chr((ord(letter) - ord('E')) % 26 + ord('a')) print('Key:', key) plaintext = decrypt(ciphertext, key) print('Plaintext:', plaintext) ``` 该程序首先使用Kasiski检测法来找到Vigenere密码中的重复模式,并计算它们之间的距离。然后,它使用Friedman测试来估计密钥长度。接下来,它使用频率分析来确定每个字母的移位量,从而得出密钥。最后,它使用密钥解密文本并输出明文。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值