我有一个文本是罗马的一部分。有这个文本中的秘密信息,我有如下一个给定的加密密钥:如何解密给定加密密钥的文本内的秘密消息
加密密钥:6132342135343721393631633233346221233132
我发现罗马内部的秘密消息如下:
“2zujpggdxdtcergbifcw”
第一个问题是,这个键可以是什么样的键? 第二,如何找到这个信息并解密它?
我有一个文本是罗马的一部分。有这个文本中的秘密信息,我有如下一个给定的加密密钥:如何解密给定加密密钥的文本内的秘密消息
加密密钥:6132342135343721393631633233346221233132
我发现罗马内部的秘密消息如下:
“2zujpggdxdtcergbifcw”
第一个问题是,这个键可以是什么样的键? 第二,如何找到这个信息并解密它?
首先你需要分析输入字符串和密钥。
字符串的长度是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'
好工作!谢谢。 –
'map()'被生成器表达式过时了,因为它们更具可读性。 –
可能这不是已知的加密方法,如RSA
或MD5
或... 您需要在您的密钥和加密密钥之间找到一个模式。这被称为Steganography
这不是什么隐写术。尽管在隐藏信息之前你可以加密一条信息以获得进一步的安全性,但隐写术的目的是否认任何秘密首先被隐藏的知识。提问者已经知道存在秘密消息并且具有加密密钥。盲隐写分析是当你不知道嵌入隐写算法时检测隐藏消息(可能)的研究。这是通过使用统计信息并在封面介质中搜索修改模式来完成的,但同样,这不是寻找者在这里寻找的内容。 – Reti43
这是我的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]
莎士比亚这里
恭喜!你解决了你的任务;) –
@NimaSoroush谢谢!我从上面的python版本中获得灵感;) – amelieykw
意思是“的罗马的一部分什么“?你有*关于使用何种加密的信息?您的描述非常含糊。 –
罗马是在连接波纹管。这实际上是纯文本。 http://shakespeare.mit.edu/hamlet/hamlet.1.3.html。 我在这罗马里面发现了这条消息,它如下: “2zujpjjdxdtce”。 现在我必须明白什么是给定加密密钥的讯息 –
目前还不清楚“罗马”的含义 - 看起来您将“罗马”视为名词,但我不知道您的意思通过它。这只是哈姆雷特的一小部分 - 与这个问题有什么关系? –