简体   繁体   English

加盐解扰javascript阵列

[英]Scrambling and descrambling javascript array with salt

So i made a javascript string scrambler with md5.所以我用 md5 做了一个 javascript 字符串加扰器。

var MD5 = function(d){var r = M(V(Y(X(d),8*d.length)));return r.toLowerCase()};function M(d){for(var _,m="0123456789ABCDEF",f="",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}function X(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}function V(d){for(var _="",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}function Y(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}function md5_cmn(d,_,m,f,r,i){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}function md5_ff(d,_,m,f,r,i,n){return md5_cmn(_&m|~_&f,d,_,r,i,n)}function md5_gg(d,_,m,f,r,i,n){return md5_cmn(_&f|m&~f,d,_,r,i,n)}function md5_hh(d,_,m,f,r,i,n){return md5_cmn(_^m^f,d,_,r,i,n)}function md5_ii(d,_,m,f,r,i,n){return md5_cmn(m^(_|~f),d,_,r,i,n)}function safe_add(d,_){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_}

var hex = {
    a: 10,
    b: 11,
    c: 13,
    d: 14,
    e: 15,
    f: 16
}

function scrambleText(text, salt) {
    if(text.length > 32) throw "No more than 32 chars.";

    var strs = text.split("");
    var final = "";

    var hash = MD5(salt);
    var hashlength = hash.length, i = 0;

    while(i < hashlength) {
        if(!strs.length) break;
        var num = (hex[hash[i]] || parseInt(hash[i])) * 2 % strs.length;
        final += strs[num];
        strs.splice(num, 1);
        ++i;
    }
    return final
}

I can scramble strings but how do I unscramble the scrambled text assuming I know the salt?我可以打乱字符串,但假设我知道盐,我该如何解读打乱的文本?

I tried an attempt but it's not doing a good job我尝试过,但效果不佳

function unscrambleText(text, salt) {
    var strs = text.split("");

    var hash = MD5(salt);
    var hashlength = hash.length, i = strs.length - 1, c = 0;;

    var final = [];

    while(i >= 0) {
        var num = (hex[hash[i]] || parseInt(hash[i])) * 2 % (strs.length - i);
        final[num] = strs[c];

        final += strs[num];
        strs.splice(num, 1);
        --i;
        ++c;
    }
    return final
}

Can you guys help me solve this problem?你们能帮我解决这个问题吗? I have been trying for hours.我已经尝试了几个小时。

I take the md5 of the string called "salt" then use it as a reference to scramble the string.我取名为“salt”的字符串的 md5,然后将其用作打乱字符串的参考。 I only use strings to simplify the problem.我只使用字符串来简化问题。 In my actual code, I have an array of image datas that I want to scramble, then be able to descramble it example of image在我的实际代码中,我有一组要加扰的图像数据,然后能够对其进行解扰

Here's a silly script to scramble/unscramble text.这是一个用于加扰/解读文本的愚蠢脚本。

The hash function is from here: Simple (non-secure) hash function for JavaScript? The hash function is from here: Simple (non-secure) hash function for JavaScript? Apparently, it's a JavaScript version of a Java hash function.显然,它是 JavaScript 版本的 Java hash ZC1C42525468E68394F1C1

The script takes the "salt", hashes it, and uses each character in the hash as an offset to shift the letters up or down the ascii table.该脚本采用“盐”,对其进行哈希处理,并使用 hash 中的每个字符作为偏移量,以在 ascii 表中上下移动字母。 So it's essentially ROT n where n is one of the values of the hashed salt.所以它本质上是ROT n ,其中n是散列盐的值之一。 "Rotten" is probably a pretty good description of this scramble function:D. “烂”可能是对这种争夺 function:D 的一个很好的描述。

 const hash = (str) => str.split("").reduce((hash, char) => { hash = (hash << 5) - hash + char.charCodeAt(0); return hash & hash; }, 0); const offset = (num, i) => parseInt(num.toString().charAt(i % num.toString().length)); const scramble = (st, sa, d = 1) => st.split("").map((c, i) => String.fromCharCode(c.charCodeAt(0) + offset(sa, i) * d)).join(""); const unscramble = (str, salt) => scramble(str, salt, -1); const salt = "This is my salt"; const str = "My text to 'scramble'."; const scram = scramble(str, hash(salt)); const unscram = unscramble(scram, hash(salt)); console.log("scrambled:", scram); console.log("unscrambled:", unscram);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM