JavaScript ascii to utf-8转换问题与否定

时间:2014-12-06 00:13:49

标签: javascript encryption utf-8 ascii

我正在解密服务器端信息我使用不同的语言加密,因此知道解密应该是什么?

为什么在积极的情况下,否定数字不正确?

运行示例:

输出格式:

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

http://gmc.yoyogames.com/index.php?showtopic=554460

1 个答案:

答案 0 :(得分:0)

我的代码不起作用的原因有很多原因: 客户端和服务器之间的连接输出无符号32位整数,同时尝试输入有符号的16位整数,使得密钥不相等。

一旦确定,我得到负数的原因纯粹是因为Game Maker语言和JavaScript之间存在差异。

在JavaScript中,您可以将字符串转换为ascii,但是在gml中我可以收集它们将ascii与其他字符串组合在一起,给出范围从-256到256的符号,如中文,日文和拉丁文,它们不是包含在ascii或ascii中。

要解决我的问题,我必须阻止gml这样编码,并坚持使用普通的ascii字符,这样我就能在JavaScript中正确读取和解密。