我的文字是罗马文字的一部分。本文中有一条秘密消息,我有一个给定的加密密钥,如下所示:
加密密钥:6132342135343721393631633233346221233132
我在罗马内部发现了秘密信息,如下所示:
“2zujpggdxdtcergbifcw”
第一个问题是,这个键可以是什么样的键? 第二,如何找到这条消息并解密呢?答案 0 :(得分:3)
首先,您需要分析输入字符串和密钥。
字符串的长度是20,密钥的长度是40,也许你可以重写它们以获得相同的长度。
分析密钥,您可以将其识别为ASCII字符的十六进制值:
key = ['0x61', '0x32', '0x34', '0x21', '0x35', '0x34', '0x37', '0x21', '0x39', '0x36', '0x31', '0x63', '0x32', '0x33', '0x34', '0x62', '0x21', '0x23', '0x31', '0x32']
输入字符串“2zujpggdxdtcergbifcw”可以用十六进制ASCII编写:
msg = ['0x32', '0x7a', '0x75', '0x6a', '0x70', '0x67', '0x67', '0x64', '0x78', '0x64', '0x74', '0x63', '0x65', '0x72', '0x67', '0x62', '0x69', '0x66', '0x63', '0x77']
现在输入字符串和密钥长度相同,您可以尝试应用一些按位操作来解密消息。
尝试使用XOR运算符,对于列表中的每个元素:
secret[i] = msg[i] XOR key[i]
结果是:“SHAKESPEAREWASHERE”,这是一个很好的结果,但不是很易读。
由于ASCII区分大小写,您可以尝试将大写字母设为大写 输入字符串“2ZUJPGGDXDTCERGBIFCW”,结果将是:“莎士比亚在这里”。
在python中有解密消息的代码:
#!/usr/bin/env python3
msg = '2ZUJPGGDXDTCERGBIFCW'
key = '6132342135343721393631633233346221233132'
# Creating a list of integers parsing the key string as hex values
key_parts = list(map(lambda x: (int(x,16)), map(''.join, zip(*[iter(key)]*2))))
# Creating a list of integers values of the msg string treated as ascii
msg_parts = list(map(ord, list(msg)))
# Applying the bitwise XOR and convert to char every result
secret_msg = ''.join(map(lambda x: chr(x[0] ^ x[1]), zip(msg_parts, key_parts)))
print(secret_msg) # Prints 'Shakespeare was here'
答案 1 :(得分:0)
可能这不是像RSA
或MD5
或......的已知加密方法。
您需要在密钥和加密密钥之间找到模式。这称为Steganography
答案 2 :(得分:0)
这是我的java版本代码:
String Encryption_key = "6132342135343721393631633233346221233132";
List<Integer> Encryption_key_int = new ArrayList<>();
for (int i = 0; i < Encryption_key.length(); i+=2) {
String substr = Encryption_key.substring(i, i+2);
Encryption_key_int.add(Integer.parseInt(substr, 16));
}
System.out.println(Encryption_key_int);
String msg = "2ZUJPGGDXDTCERGBIFCW";
List<Integer> msg_hex_int = new ArrayList<>();
for (int i = 0; i < msg.length(); i++) {
int ascii = (int) msg.charAt(i);
msg_hex_int.add(Integer.parseInt(Integer.toHexString(ascii), 16));
}
System.out.println(msg_hex_int);
String result = "";
for(int i = 0; i < msg_hex_int.size(); i++) {
char XOR_int = (char)(msg_hex_int.get(i) ^ Encryption_key_int.get(i));
result += XOR_int;
}
System.out.println(result);
输出结果为:
[97,50,52,33,53,52,55,33,57,54,49,99,50,51,52,98,33,35,49,50]
[50,90,85,74,80,71,71,68,88,68,84,67,69,82,71,66,73,70,67,87]
莎士比亚在这里