在节点js中解密XOR
Decipher XOR in node js
我正在制作一个 websocket 服务器,但我卡在了一个部分。解密 XOR。我有密钥和数据。我确保数据与密钥的长度相同,但我仍然遇到这个问题。
问题
当我破译数据时,我有时会得到一部分数据。示例:
datasend
变成:
sep
密钥是ec1ee034ec1ee034
,数据是887f94559f7b8e50
。我知道这不是数据问题,因为我使用了 this website that deciphers data。当我输入密钥和数据时,我得到数据发送。
(我得到了十六进制数据 73657000
un-xoring 时)
根据上面提到的网站应该是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
s一次性异或:
keyNum = BigInt('0x' + key)
strNum = BigInt('0x' + str)
decoded = keyNum ^ strNum
outBuf = Buffer.from(decoded.toString(16), 'hex')
console.log(outBuf.toString())
第一种方法的优点是密钥可以比文本短,因此允许“循环”异或编码。
我正在制作一个 websocket 服务器,但我卡在了一个部分。解密 XOR。我有密钥和数据。我确保数据与密钥的长度相同,但我仍然遇到这个问题。
问题
当我破译数据时,我有时会得到一部分数据。示例:
datasend
变成:
sep
密钥是ec1ee034ec1ee034
,数据是887f94559f7b8e50
。我知道这不是数据问题,因为我使用了 this website that deciphers data。当我输入密钥和数据时,我得到数据发送。
(我得到了十六进制数据 73657000
un-xoring 时)
根据上面提到的网站应该是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
s一次性异或:
keyNum = BigInt('0x' + key)
strNum = BigInt('0x' + str)
decoded = keyNum ^ strNum
outBuf = Buffer.from(decoded.toString(16), 'hex')
console.log(outBuf.toString())
第一种方法的优点是密钥可以比文本短,因此允许“循环”异或编码。