微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解密节点js中的XOR

如何解决解密节点js中的XOR

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

问题
当我破译数据时,我有时会得到一部分数据。示例:
datasend 变成:
sep
键是ec1ee034ec1ee034,数据是887f94559f7b8e50。我知道数据没有问题,因为我使用了 this website that deciphers data。当我输入密钥和数据时,我会收到数据发送。
(我在解异或时得到了十六进制数据 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 一次性对它们进行异或:

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

decoded = keyNum ^ strNum

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

console.log(outBuf.toString())

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。