2014-01-16 89 views
0

我有一个文本是罗马的一部分。有这个文本中的秘密信息,我有如下一个给定的加密密钥:如何解密给定加密密钥的文本内的秘密消息

加密密钥:6132342135343721393631633233346221233132

我发现罗马内部的秘密消息如下:

“2zujpggdxdtcergbifcw”

第一个问题是,这个键可以是什么样的键? 第二,如何找到这个信息并解密它?

+0

意思是“的罗马的一部分什么“?你有*关于使用何种加密的信息?您的描述非常含糊。 –

+0

罗马是在连接波纹管。这实际上是纯文本。 http://shakespeare.mit.edu/hamlet/hamlet.1.3.html。 我在这罗马里面发现了这条消息,它如下: “2zujpjjdxdtce”。 现在我必须明白什么是给定加密密钥的讯息 –

+0

目前还不清楚“罗马”的含义 - 看起来您将“罗马”视为名词,但我不知道您的意思通过它。这只是哈姆雷特的一小部分 - 与这个问题有什么关系? –

回答

2

首先你需要分析输入字符串和密钥。

字符串的长度是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' 
+0

好工作!谢谢。 –

+0

'map()'被生成器表达式过时了,因为它们更具可读性。 –

0

可能这不是已知的加密方法,如RSAMD5或... 您需要在您的密钥和加密密钥之间找到一个模式。这被称为Steganography

+0

这不是什么隐写术。尽管在隐藏信息之前你可以加密一条信息以获得进一步的安全性,但隐写术的目的是否认任何秘密首先被隐藏的知识。提问者已经知道存在秘密消息并且具有加密密钥。盲隐写分析是当你不知道嵌入隐写算法时检测隐藏消息(可能)的研究。这是通过使用统计信息并在封面介质中搜索修改模式来完成的,但同样,这不是寻找者在这里寻找的内容。 – Reti43

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]

莎士比亚这里

+0

恭喜!你解决了你的任务;) –

+0

@NimaSoroush谢谢!我从上面的python版本中获得灵感;) – amelieykw