簡體   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