2014-01-16 88 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