如何用 RC4 解密 HEX 缓冲区?

How to decrypt a HEX buffer with RC4?

我似乎无法解密十六进制缓冲区,我很确定它是用 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 加密了吗and/or我的密钥对吗?

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

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

此外,RC4 几乎可以用任何类型的密钥大小进行初始化。较小的密钥大小可能相对容易暴​​力破解 - 但较大的密钥大小可能需要永远(从字面上看,在宇宙的健康死亡之后幸存)。

所以简短的回答:

  • RC4 - 不知道;
  • 密钥正确 - 可能不正确。

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