题目 1003: [编程入门]密码破译 java

题目 1003: [编程入门]密码破译

在这里插入图片描述

  • 语言Java

public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		String string = scanner.next();

		// A-65 Z-90 a-97 z-122
		for (int num : string.getBytes()) {

			// 确认a-z或A-Z的最后4个的变化
			if ((86 < num && num < 91) || (118 < num && num < 123)) {
				char a = (char) (num - 22);
				System.out.print(a);
			} else {
				char a = (char) (num + 4);
				System.out.print(a);
			}
		}

	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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测试来估计密钥长度。接下来,它使用频率分析来确定每个字母的移位量,从而得出密钥。最后,它使用密钥解密文本并输出明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值