如何使用给定的加密密钥解密文本内的秘密消息

时间:2014-01-16 19:30:04

标签: encryption cryptography key

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

加密密钥:6132342135343721393631633233346221233132

我在罗马内部发现了秘密信息,如下所示:

“2zujpggdxdtcergbifcw”

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

3 个答案:

答案 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)

可能这不是像RSAMD5或......的已知加密方法。 您需要在密钥和加密密钥之间找到模式。这称为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]

莎士比亚在这里