2020-1-9 crawled pages 20-js reverse entry (SHA encryption - Message Digest / Secure Hash Algorithm)

This article applies only to beginners, we will only break point tracking it.

Js code in addition to the front end Base64 encoding and decoding , the MD5 encryption , the AES encryption , the RSA encryption , the DES encryption outside, there will be encrypted SHA.

Brief introduction

Let me talk about what is the message digest algorithm
the following explanation comes from Baidu Encyclopedia

The main feature of the message digest algorithm is the process does not require encryption key, and the encrypted data can not be decrypted, the current can be decrypted only reverse CRC32 algorithm, only the plaintext data input through the same identical message digest algorithm to get the same density Wen. Message digest algorithm management and key distribution problem does not exist, suitable for use on a distributed network. Encryption due to its enormous workload calculation, so that before the encryption algorithm is normally used only in a limited amount of data, for example using a password computer is irreversible encryption algorithm.

Message digest algorithm is mainly applied in the "digital signature" field, as a digest algorithm to plaintext, there are MD5 , HMAC, SHA and so on.

See SHA encryption on the link .

SHA (English name: Secure Hash Algorithm, Chinese name: Secure Hash Algorithm), is a cryptographic hash function, it is more complicated than the same hashing algorithm MD5. Designed by the National Security Agency. The family is very large, there is SHA-0, SHA-1, SHA-2, SHA-3 , four types of algorithms.

其中, SHA-2 comprehensive Ryo SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 or the like algorithm.

SHA-3 include SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256 algorithms.

About SHA encryption introduce family See link .

Js realization of

See the following website
Here Insert Picture Description
password is 123456, but shows the encrypted content.

Therefore, the search for the keyword "password"
Here Insert Picture Description
to directly see the encryption function SHA256.
Continue to search for the keyword "SHA256"
Here Insert Picture Description
a total of only three results.
Do not tracked, SHA256 realization should be in sha256.js file.

Find sha256.js, very simple, it is a function.
It alone in the implementation of some of the nodejs


/**
 *
 *  Secure Hash Algorithm (SHA256)
 *  http://www.webtoolkit.info/
 *
 *  Original code by Angel Marin, Paul Johnston.
 *
 **/
/*sha256加密js代码*/
function SHA256(s){

    var chrsz   = 8;
    var hexcase = 0;

    function safe_add (x, y) {
        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
        return (msw << 16) | (lsw & 0xFFFF);
    }

    function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
    function R (X, n) { return ( X >>> n ); }
    function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
    function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
    function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
    function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
    function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
    function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }

    function core_sha256 (m, l) {
        var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
        var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
        var W = new Array(64);
        var a, b, c, d, e, f, g, h, i, j;
        var T1, T2;

        m[l >> 5] |= 0x80 << (24 - l % 32);
        m[((l + 64 >> 9) << 4) + 15] = l;

        for ( var i = 0; i<m.length; i+=16 ) {
            a = HASH[0];
            b = HASH[1];
            c = HASH[2];
            d = HASH[3];
            e = HASH[4];
            f = HASH[5];
            g = HASH[6];
            h = HASH[7];

            for ( var j = 0; j<64; j++) {
                if (j < 16) W[j] = m[j + i];
                else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);

                T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
                T2 = safe_add(Sigma0256(a), Maj(a, b, c));

                h = g;
                g = f;
                f = e;
                e = safe_add(d, T1);
                d = c;
                c = b;
                b = a;
                a = safe_add(T1, T2);
            }

            HASH[0] = safe_add(a, HASH[0]);
            HASH[1] = safe_add(b, HASH[1]);
            HASH[2] = safe_add(c, HASH[2]);
            HASH[3] = safe_add(d, HASH[3]);
            HASH[4] = safe_add(e, HASH[4]);
            HASH[5] = safe_add(f, HASH[5]);
            HASH[6] = safe_add(g, HASH[6]);
            HASH[7] = safe_add(h, HASH[7]);
        }
        return HASH;
    }

    function str2binb (str) {
        var bin = Array();
        var mask = (1 << chrsz) - 1;
        for(var i = 0; i < str.length * chrsz; i += chrsz) {
            bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
        }
        return bin;
    }

    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    }

    function binb2hex (binarray) {
        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
        var str = "";
        for(var i = 0; i < binarray.length * 4; i++) {
            str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
                hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
        }
        return str;
    }

    s = Utf8Encode(s);
    return binb2hex(core_sha256(str2binb(s), s.length * chrsz));

}


console.log(SHA256("123456"))

result

8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

And on exactly the same page.

In fact nodejs has a built-in crypto module can be implemented directly SHA256 algorithms



const cryptojs = require('crypto') 


var hash = cryptojs.createHash('sha256');// sha256 
hash.update('123456');
var res = hash.digest('hex');
console.log(res)

The results are also consistent

8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

SHA256 implemented method as follows python

import hashlib
def getSHA256(e):
    
    md5 = hashlib.sha256()

    md5.update(e.encode('utf-8'))
    sign = md5.hexdigest()

    return sign

print getSHA256("123456")

Operating results consistent

8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Published 122 original articles · won praise 7 · views 20000 +

Guess you like

Origin blog.csdn.net/weixin_42555985/article/details/103902667