ICT Protege WX高固件版本(>4.00.1676)认证失败:Node.js XOR实现与C#示例差异排查求助
ICT Protege WX高固件版本(>4.00.1676)认证失败:Node.js XOR实现与C#示例差异排查求助
首先,你的认证失败大概率是XOR函数的核心逻辑错误导致的,我仔细看了你的代码,发现了几个关键问题:
1. 致命错误:XOR函数的字节截取逻辑完全错误
你的xorFn中,初始startPosition被设置为numBinary.length(也就是32,因为是32位二进制字符串),第一次循环执行numBinary.substring(startPosition, startPosition + 8)时,相当于从索引32开始截取——但字符串的最大索引是31,所以这段截取结果是空字符串!后续parseInt(byteString, 2)得到NaN,和字符码XOR后结果全错,这直接导致认证哈希完全无效。
2. 正确的XOR实现思路(对齐C#逻辑)
官方C#示例的XOR逻辑应该是:把32位随机数拆分为4个字节,然后循环将输入字符串的每个字节与这4个字节依次循环做XOR(第1个字符用第1个字节,第2个用第2个,…第5个回到第1个,以此类推)。
我给你两种对齐C#的Node.js实现,你可以根据实际情况测试(Windows系统下C#默认用小端字节序,优先试第二种):
小端字节序版本(Windows C#默认)
export const xorFn = (inputString: string, number: number): string => { // 把32位随机数拆分为小端字节数组(低位在前) const bytes = [ number & 0xff, (number >> 8) & 0xff, (number >> 16) & 0xff, (number >> 24) & 0xff ]; let result = ""; for (let i = 0; i < inputString.length; i++) { // 只取字符的低8位字节 const charCode = inputString.charCodeAt(i) & 0xff; // 循环使用4个字节 const byte = bytes[i % 4]; // 异或后转成两位大写16进制字符 result += (charCode ^ byte).toString(16).padStart(2, "0").toUpperCase(); } return result; };
大端字节序版本
export const xorFn = (inputString: string, number: number): string => { // 把32位随机数拆分为大端字节数组(高位在前) const bytes = [ (number >> 24) & 0xff, (number >> 16) & 0xff, (number >> 8) & 0xff, number & 0xff ]; let result = ""; for (let i = 0; i < inputString.length; i++) { const charCode = inputString.charCodeAt(i) & 0xff; const byte = bytes[i % 4]; result += (charCode ^ byte).toString(16).padStart(2, "0").toUpperCase(); } return result; };
3. 其他需要验证的细节
- SHA1编码一致性:确认C#示例中计算密码SHA1时用的是UTF8还是ASCII编码。如果C#用
Encoding.ASCII.GetBytes(password),你需要把createSHA1Hash中的"utf8"改成"ascii"(纯英文密码无影响,有特殊字符时才会出问题)。 - 随机数范围:确保
randomNumber是32位有符号整数,避免数值溢出导致拆字节错误。 - 请求参数格式:检查
performAuth中的请求参数是否和官方示例完全一致(比如参数名大小写、是否有多余转义)。
替换XOR函数后,重新测试认证流程,应该能解决第二个随机数的验证问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

