【问题标题】:How to decrypt a HEX buffer with RC4?如何使用 RC4 解密 HEX 缓冲区?
【发布时间】:2020-04-08 00:49:20
【问题描述】:

我似乎无法解密十六进制缓冲区,我很确定它是用 RC4 加密的,而且我很确定我知道密钥。作为密码学的初学者,我只是想确保在开始认为我的假设是错误的之前,我实际上做的一切都是正确的。

const crypto = require('crypto');

const buffer = Buffer.from('471b...', 'hex');

const decipher = crypto.createDecipheriv('rc4', 'MyKey', '');
let decrypted = '';
decrypted += decipher.update(buffer, 'hex', 'utf8');
decrypted += decipher.final('utf8');

console.log(decrypted) // outputs stuff like "�Y6�k�"

我的十六进制缓冲区是否真的在 RC4 中加密和/或我的密钥是否正确?

【问题讨论】:

  • 有一种 RC4 变体,其中密钥流的前 256 个字节被丢弃以避免已知攻击之一。
  • 我的示例中的密钥流对应于“MyKey”还是缓冲区?如果它对应于“MyKey”,我想这不适用于我的情况,因为它甚至没有 256 个字节,
  • 密钥流是 RC4 引擎生成的伪随机字节流。它们是您与明文进行异或以生成密文的字节,反之亦然。 plaintext XOR keysteam -> ciphertextciphertext XOR keystream -> plaintext。 RC4 是流密码;阅读该主题可能会有所帮助。

标签: encryption hex rc4-cipher node-crypto


【解决方案1】:

我们无法判断。算法或密钥可能不正确,除非输入消息是二进制而不是文本,因为它看起来不像任何已知的字符编码。

密文与随机密文无法区分,这使得检测现代密码变得非常困难(加倍如此,因为您遗漏了大部分密文)。然而,RC4 可以被区分,但您需要复杂的攻击才能将其与随机噪声区分开来;即使不知道密钥,这也可能会识别密码。

此外,RC4 几乎可以使用任何类型的密钥大小进行初始化。较小的密钥大小可能相对容易暴​​力破解 - 较大的密钥大小可能需要很长时间(从字面上看,在宇宙的荒芜中幸存下来)。

所以简短的回答:

  • RC4 - 不知道;
  • 键正确 - 可能不是。

顺便说一句:以十六进制打印出明文,以防您想检查它是否有意义。 ASCII 很容易以这种方式区分,但其他方案也可能以二进制显示模式,如果你只是得到一个带有问号的菱形(或任何其他替换字符,尽管实际上有一些字体/终端),你看不到这种模式在字体内显示十六进制值,这很好)。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2015-04-22
    相关资源
    最近更新 更多