繁体   English   中英

在节点js中解密XOR

[英]Decipher XOR in node js

我正在制作 websocket 服务器,但我被困在一个部分。 破译异或。 我有钥匙和数据。 我确保数据与密钥的长度相同,但我仍然有这个问题。

问题
当我破译数据时,我有时会得到一部分数据。 例子:
datasend变成:
sep
密钥是ec1ee034ec1ee034 ,数据是887f94559f7b8e50 我知道这不是数据问题,因为我使用了这个解密数据的网站 当我输入密钥和数据时,我得到数据发送。
(我在 un-xoring 时得到了十六进制数据73657000
根据上述网站,它应该是6461746173656E64

这是我的代码:

const hextext = (parseInt(newkey, 16)^parseInt(rawdata, 16)).toString(16);   
// I had to convert this to a number for the xor to work
const realtext = Buffer.from(hextext, "hex").toString("utf-8")
// The above converts the hex into utf8 text

我尝试对其进行硬编码,但仍然无法正常工作。 我的理论是,由十六进制数据产生的数字太大了,以至于它变成了一个浮点数(确实如此),但我不知道如何解决这个问题。

有任何想法吗?

问题是您的编码值远大于 2^32,因此当您将它们转换为数字和异或时,您会丢失信息。

您可以逐字节处理这两个字符串:

key = 'ec1ee034ec1ee034'
str = '887f94559f7b8e50'


let keyBuf = Buffer.from(key, 'hex')
let strBuf = Buffer.from(str, 'hex')
let outBuf = Buffer.alloc(strBuf.length)

for (let n = 0; n < strBuf.length; n++)
    outBuf[n] = strBuf[n] ^ keyBuf[n % keyBuf.length]

console.log(outBuf.toString())

或使用BigInt将它们异或到一个 go 中:

keyNum = BigInt('0x' + key)
strNum = BigInt('0x' + str)

decoded = keyNum ^ strNum

outBuf = Buffer.from(decoded.toString(16), 'hex')

console.log(outBuf.toString())

第一种方法的优点是密钥可以比文本短,因此允许“循环”异或编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM