【问题标题】:How to decrypt a secret message inside a text with given encryption key如何使用给定的加密密钥解密文本中的秘密消息
【发布时间】:2014-01-16 19:30:03
【问题描述】:

我有一个罗马文本的一部分。此文本中有一条秘密消息,我有一个给定的加密密钥,如下所示:

加密密钥:6132342135343721393631633233346221233132

我在罗马书里面找到了如下秘密信息:

“2zujpggdxdtcergbifcw”

第一个问题是,这把钥匙是什么钥匙? 第二,如何找到这条消息并解密?

【问题讨论】:

  • “罗马的一部分”是什么意思?您是否有任何关于已使用何种加密的信息?您的描述非常模糊。
  • 罗马在下面的链接中。这实际上是纯文本。 shakespeare.mit.edu/hamlet/hamlet.1.3.html。我在这个罗马书中找到了消息,如下所示:“2zujpjjdxdtce”。现在我必须了解给定加密密钥的消息是什么
  • 不清楚您所说的“罗马人”是什么意思 - 似乎您将“罗马人”视为名词,但我不知道您的意思。这只是哈姆雷特的一点点 - 它与问题有什么关系?
  • 这个问题似乎是题外话,因为它是关于文本的解密 - 没有任何编程参考。
  • @JonSkeet 也许 Niima 的意思是“小说”。在许多语言中,类似于“roman”的词表示“小说”,而“novel”表示“短篇小说”。

标签: encryption cryptography key


【解决方案1】:

首先你需要分析输入的字符串和key。

字符串的长度是20,key的长度是40,也许你可以重写它们以获得相同的长度。

分析key,可以识别为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”,结果为:“Shakespeare was here”。

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() 已被生成器表达式淘汰,因为它们更具可读性。
【解决方案2】:

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

【讨论】:

  • 这不是隐写术的意义所在。虽然您可以在使用隐写术隐藏消息之前对消息进行加密以提高安全性,但隐写术的目的是首先否认任何秘密被隐藏的知识。提问者已经知道有一个秘密消息并且有一个加密密钥。盲隐写分析是在您不知道嵌入隐写算法时检测(可能)存在的隐藏消息的研究。它是使用统计数据和在封面媒体中搜索修改模式完成的,但同样,这不是提问者在这里寻找的内容。
【解决方案3】:

这是我的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 版本中得到了灵感;)
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2017-08-18
  • 2013-08-16
  • 2014-10-24
  • 1970-01-01
  • 2011-12-06
  • 2022-01-28
  • 2010-12-28
相关资源
最近更新 更多