我正在解密服务器端信息我使用不同的语言加密,因此知道解密应该是什么?
为什么在积极的情况下,否定数字不正确?
运行示例:
输出格式:
str
pos
S[t]
str.charAt(str, pos + 1)
str.charCodeAt(pos + 1)
根据GML解密:
Input:
Str: ���
Key: 472
--------------
str: ���
pos: 0
ST: 195
char: ⮫
value: -94
str: ���
pos: 1
ST: 140
char:
value: -18
str: ���
pos: 2
ST: 136
char:
value: -21
服务器端等效(JS):
Input:
Str: ���
Key: 472
---------------
str: ���
pos: 0
ST: 195
char: �
value: 65533
str: ���
pos: 1
ST: 140
char: �
value: 65533
str: ���
pos: 2
ST: 136
char:
value: NaN
信息如何获得输入: 数据从Server.js传递 - > Client.js获取标头并通过开关语句,然后使用以下方法解析数据包的其余部分:
var Parser = require('binary-parser').Parser;
login: new Parser().skip(1)
.string("command", StringOptions)
.string("username", StringOptions)
.string("password", StringOptions),
然后输入到方法: console.log(rc4(data.password,c.dhprivatekey));
我需要的代码:
function rc4(str, key) {
var out = "";
var len = byteCount(key);
var S = [], j;
var t;
for(var i = 0; i < 256; i++) {
S[i] = i;
}
j = 0;
for( var i = 0; i< 256; i++) {
var test = string_byte_at(key, (i % len) + 1)[0];
if (typeof test != "number") {
test = parseInt(test);
}
j = (j + S[i] + test % 256);
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
i = 0;
j = 0;
for (var pos = 0; pos < str.length; pos++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
var temp = S[i];
S[i] = S[j];
S[j] = temp;
t = (S[i] + S[j]) % 256;
out += str.charCodeAt(string_byte_at(str, pos + 1)[0] ^ S[t]);
}
return out;
}
正确使用GML进行解密
var str,key,out,len,i,S,j,temp,pos,t;
str = argument0;
key = string(argument1);
out = "";
len = string_byte_length(key);
for (i=0; i<256; i+=1) S[i] = i;
j = 0;
for (i=0; i<256; i+=1) {
//show_debug_message(string_byte_at(key, (i mod len) + 1));
j = (j + S[i] + string_byte_at(key,(i mod len)+1)) mod 256;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
i = 0;
j = 0;
for (pos=0; pos < string_byte_length(str); pos+=1) {
i = (i + 1) mod 256;
j = (j + S[i]) mod 256;
temp = S[i];
S[i] = S[j];
S[j] = temp;
t = (S[i] + S[j]) mod 256;
out += ansi_char(string_byte_at(str,pos+1) ^ S[t]);
}
return out;
http://docs.yoyogames.com/source/dadiospice/002_reference/strings/string_byte_at.html
http://docs.yoyogames.com/source/dadiospice/002_reference/strings/ansi_char.html
答案 0 :(得分:0)
我的代码不起作用的原因有很多原因: 客户端和服务器之间的连接输出无符号32位整数,同时尝试输入有符号的16位整数,使得密钥不相等。
一旦确定,我得到负数的原因纯粹是因为Game Maker语言和JavaScript之间存在差异。
在JavaScript中,您可以将字符串转换为ascii,但是在gml中我可以收集它们将ascii与其他字符串组合在一起,给出范围从-256到256的符号,如中文,日文和拉丁文,它们不是包含在ascii或ascii中。
要解决我的问题,我必须阻止gml这样编码,并坚持使用普通的ascii字符,这样我就能在JavaScript中正确读取和解密。