pwp 发表于 2023-1-13 01:30

这个superMd5三十二位加密如何用python实现

本帖最后由 pwp 于 2023-1-13 02:00 编辑

/*
'请注意文件编码,如果客户端的md5文件编码和服务器端的md5文件编码不一样,则加密出来的字符串不一样
'修改:xilou 2080711
'例子:
       'www.52pojie.cn'.MD5();//默认为16位加密
         'www.52pojie.cn'.MD5(32);//32位加密
*/
String.prototype.MD5 = function (bit) {
    var sMessage = this;

    function RotateLeft(lValue, iShiftBits) {
      return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
    }

    function AddUnsigned(lX, lY) {
      var lX4, lY4, lX8, lY8, lResult;
      lX8 = (lX & 0x80000000);
      lY8 = (lY & 0x80000000);
      lX4 = (lX & 0x40000000);
      lY4 = (lY & 0x40000000);
      lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
      if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
      if (lX4 | lY4) {
            if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
      } else return (lResult ^ lX8 ^ lY8);
    }

    function F(x, y, z) {
      return (x & y) | ((~x) & z);
    }

    function G(x, y, z) {
      return (x & z) | (y & (~z));
    }

    function H(x, y, z) {
      return (x ^ y ^ z);
    }

    function I(x, y, z) {
      return (y ^ (x | (~z)));
    }

    function FF(a, b, c, d, x, s, ac) {
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
      return AddUnsigned(RotateLeft(a, s), b);
    }

    function GG(a, b, c, d, x, s, ac) {
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
      return AddUnsigned(RotateLeft(a, s), b);
    }

    function HH(a, b, c, d, x, s, ac) {
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
      return AddUnsigned(RotateLeft(a, s), b);
    }

    function II(a, b, c, d, x, s, ac) {
      a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
      return AddUnsigned(RotateLeft(a, s), b);
    }

    function ConvertToWordArray(sMessage) {
      var lWordCount;
      var lMessageLength = sMessage.length;
      var lNumberOfWords_temp1 = lMessageLength + 8;
      var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
      var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
      var lWordArray = Array(lNumberOfWords - 1);
      var lBytePosition = 0;
      var lByteCount = 0;
      while (lByteCount < lMessageLength) {
            lWordCount = (lByteCount - (lByteCount % 4)) / 4;
            lBytePosition = (lByteCount % 4) * 8;
            lWordArray = (lWordArray | (sMessage.charCodeAt(lByteCount) << lBytePosition));
            lByteCount++;
      }
      lWordCount = (lByteCount - (lByteCount % 4)) / 4;
      lBytePosition = (lByteCount % 4) * 8;
      lWordArray = lWordArray | (0x80 << lBytePosition);
      lWordArray = lMessageLength << 3;
      lWordArray = lMessageLength >>> 29;
      return lWordArray;
    }

    function WordToHex(lValue) {
      var WordToHexValue = "",
            WordToHexValue_temp = "",
            lByte, lCount;
      for (lCount = 0; lCount <= 3; lCount++) {
            lByte = (lValue >>> (lCount * 8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
      }
      return WordToHexValue;
    }
    var x = Array();
    var k, AA, BB, CC, DD, a, b, c, d
    var S11 = 7,
      S12 = 12,
      S13 = 17,
      S14 = 22;
    var S21 = 5,
      S22 = 9,
      S23 = 14,
      S24 = 20;
    var S31 = 4,
      S32 = 11,
      S33 = 16,
      S34 = 23;
    var S41 = 6,
      S42 = 10,
      S43 = 15,
      S44 = 21;
    // Steps 1 and 2. Append padding bits and length and convert to words
    x = ConvertToWordArray(sMessage);
    // Step 3. Initialise
    a = 0x67452301;
    b = 0xEFCDAB89;
    c = 0x98BADCFE;
    d = 0x10325476;
    // Step 4. Process the message in 16-word blocks
    for (k = 0; k < x.length; k += 16) {
      AA = a;
      BB = b;
      CC = c;
      DD = d;
      a = FF(a, b, c, d, x, S11, 0xD76AA478);
      d = FF(d, a, b, c, x, S12, 0xE8C7B756);
      c = FF(c, d, a, b, x, S13, 0x242070DB);
      b = FF(b, c, d, a, x, S14, 0xC1BDCEEE);
      a = FF(a, b, c, d, x, S11, 0xF57C0FAF);
      d = FF(d, a, b, c, x, S12, 0x4787C62A);
      c = FF(c, d, a, b, x, S13, 0xA8304613);
      b = FF(b, c, d, a, x, S14, 0xFD469501);
      a = FF(a, b, c, d, x, S11, 0x698098D8);
      d = FF(d, a, b, c, x, S12, 0x8B44F7AF);
      c = FF(c, d, a, b, x, S13, 0xFFFF5BB1);
      b = FF(b, c, d, a, x, S14, 0x895CD7BE);
      a = FF(a, b, c, d, x, S11, 0x6B901122);
      d = FF(d, a, b, c, x, S12, 0xFD987193);
      c = FF(c, d, a, b, x, S13, 0xA679438E);
      b = FF(b, c, d, a, x, S14, 0x49B40821);
      a = GG(a, b, c, d, x, S21, 0xF61E2562);
      d = GG(d, a, b, c, x, S22, 0xC040B340);
      c = GG(c, d, a, b, x, S23, 0x265E5A51);
      b = GG(b, c, d, a, x, S24, 0xE9B6C7AA);
      a = GG(a, b, c, d, x, S21, 0xD62F105D);
      d = GG(d, a, b, c, x, S22, 0x2441453);
      c = GG(c, d, a, b, x, S23, 0xD8A1E681);
      b = GG(b, c, d, a, x, S24, 0xE7D3FBC8);
      a = GG(a, b, c, d, x, S21, 0x21E1CDE6);
      d = GG(d, a, b, c, x, S22, 0xC33707D6);
      c = GG(c, d, a, b, x, S23, 0xF4D50D87);
      b = GG(b, c, d, a, x, S24, 0x455A14ED);
      a = GG(a, b, c, d, x, S21, 0xA9E3E905);
      d = GG(d, a, b, c, x, S22, 0xFCEFA3F8);
      c = GG(c, d, a, b, x, S23, 0x676F02D9);
      b = GG(b, c, d, a, x, S24, 0x8D2A4C8A);
      a = HH(a, b, c, d, x, S31, 0xFFFA3942);
      d = HH(d, a, b, c, x, S32, 0x8771F681);
      c = HH(c, d, a, b, x, S33, 0x6D9D6122);
      b = HH(b, c, d, a, x, S34, 0xFDE5380C);
      a = HH(a, b, c, d, x, S31, 0xA4BEEA44);
      d = HH(d, a, b, c, x, S32, 0x4BDECFA9);
      c = HH(c, d, a, b, x, S33, 0xF6BB4B60);
      b = HH(b, c, d, a, x, S34, 0xBEBFBC70);
      a = HH(a, b, c, d, x, S31, 0x289B7EC6);
      d = HH(d, a, b, c, x, S32, 0xEAA127FA);
      c = HH(c, d, a, b, x, S33, 0xD4EF3085);
      b = HH(b, c, d, a, x, S34, 0x4881D05);
      a = HH(a, b, c, d, x, S31, 0xD9D4D039);
      d = HH(d, a, b, c, x, S32, 0xE6DB99E5);
      c = HH(c, d, a, b, x, S33, 0x1FA27CF8);
      b = HH(b, c, d, a, x, S34, 0xC4AC5665);
      a = II(a, b, c, d, x, S41, 0xF4292244);
      d = II(d, a, b, c, x, S42, 0x432AFF97);
      c = II(c, d, a, b, x, S43, 0xAB9423A7);
      b = II(b, c, d, a, x, S44, 0xFC93A039);
      a = II(a, b, c, d, x, S41, 0x655B59C3);
      d = II(d, a, b, c, x, S42, 0x8F0CCC92);
      c = II(c, d, a, b, x, S43, 0xFFEFF47D);
      b = II(b, c, d, a, x, S44, 0x85845DD1);
      a = II(a, b, c, d, x, S41, 0x6FA87E4F);
      d = II(d, a, b, c, x, S42, 0xFE2CE6E0);
      c = II(c, d, a, b, x, S43, 0xA3014314);
      b = II(b, c, d, a, x, S44, 0x4E0811A1);
      a = II(a, b, c, d, x, S41, 0xF7537E82);
      d = II(d, a, b, c, x, S42, 0xBD3AF235);
      c = II(c, d, a, b, x, S43, 0x2AD7D2BB);
      b = II(b, c, d, a, x, S44, 0xEB86D391);
      a = AddUnsigned(a, AA);
      b = AddUnsigned(b, BB);
      c = AddUnsigned(c, CC);
      d = AddUnsigned(d, DD);
    }
    if (bit == 32) {
      return WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
    } else {
      return WordToHex(b) + WordToHex(c);
    }
}

pwp 发表于 2023-1-13 01:42

本帖最后由 pwp 于 2023-1-13 01:44 编辑

```
123456£¬¡£fdjf,jkgfkl
```
加密后
80fba977d063a6f7262a8a9c95f61140

pwp 发表于 2023-1-13 01:50

# -*- codeding = uft-8 -*-

def int2bin(n, count=24):
    return "".join()

class MD5(object):
    # 初始化密文
    def __init__(self, message):
      self.message = message
      self.ciphertext = ""

      self.A = 0x67452301
      self.B = 0xEFCDAB89
      self.C = 0x98BADCFE
      self.D = 0x10325476
      self.init_A = 0x67452301
      self.init_B = 0xEFCDAB89
      self.init_C = 0x98BADCFE
      self.init_D = 0x10325476
      '''
      self.A = 0x01234567
      self.B = 0x89ABCDEF
      self.C = 0xFEDCBA98
      self.D = 0x76543210
         '''
      #设置常数表T
      self.T = [0xD76AA478,0xE8C7B756,0x242070DB,0xC1BDCEEE,0xF57C0FAF,0x4787C62A,0xA8304613,0xFD469501,
                  0x698098D8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,0x6B901122,0xFD987193,0xA679438E,0x49B40821,
                  0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,0xD62F105D,0x02441453,0xD8A1E681,0xE7D3FBC8,
                  0x21E1CDE6,0xC33707D6,0xF4D50D87,0x455A14ED,0xA9E3E905,0xFCEFA3F8,0x676F02D9,0x8D2A4C8A,
                  0xFFFA3942,0x8771F681,0x6D9D6122,0xFDE5380C,0xA4BEEA44,0x4BDECFA9,0xF6BB4B60,0xBEBFBC70,
                  0x289B7EC6,0xEAA127FA,0xD4EF3085,0x04881D05,0xD9D4D039,0xE6DB99E5,0x1FA27CF8,0xC4AC5665,
                  0xF4292244,0x432AFF97,0xAB9423A7,0xFC93A039,0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1,
                  0x6FA87E4F,0xFE2CE6E0,0xA3014314,0x4E0811A1,0xF7537E82,0xBD3AF235,0x2AD7D2BB,0xEB86D391]
      #循环左移位数
      self.s = [7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
                  5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
                  4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
                  6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21]
      self.m = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
                  1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
                  5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
                  0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9]



    # 附加填充位
    def fill_text(self):
      for i in range(len(self.message)):
            c = int2bin(ord(self.message), 8)
            self.ciphertext += c

      if (len(self.ciphertext)%512 != 448):
            if ((len(self.ciphertext)+1)%512 != 448):
                self.ciphertext += '1'
            while (len(self.ciphertext)%512 != 448):
                self.ciphertext += '0'

      length = len(self.message)*8
      if (length <= 255):
            length = int2bin(length, 8)
      else:
            length = int2bin(length, 16)
            temp = length+length+length+length
            length = temp

      self.ciphertext += length
      while (len(self.ciphertext)%512 != 0):
            self.ciphertext += '0'

    # 分组处理(迭代压缩)
    def circuit_shift(self, x, amount):
      x &= 0xFFFFFFFF
      return ((x << amount) | (x >> (32 - amount))) & 0xFFFFFFFF

    def change_pos(self):
      a = self.A
      b = self.B
      c = self.C
      d = self.D
      self.A = d
      self.B = a
      self.C = b
      self.D = c

    def FF(self, mj, s, ti):
      mj = int(mj, 2)
      temp = self.F(self.B, self.C, self.D) + self.A + mj + ti
      temp = self.circuit_shift(temp, s)
      self.A = (self.B + temp)%pow(2, 32)
      self.change_pos()

    def GG(self, mj, s, ti):
      mj = int(mj, 2)
      temp = self.G(self.B, self.C, self.D) + self.A + mj + ti
      temp = self.circuit_shift(temp, s)
      self.A = (self.B + temp)%pow(2, 32)
      self.change_pos()

    def HH(self, mj, s, ti):
      mj = int(mj, 2)
      temp = self.H(self.B, self.C, self.D) + self.A + mj + ti
      temp = self.circuit_shift(temp, s)
      self.A = (self.B + temp)%pow(2, 32)
      self.change_pos()

    def II(self, mj, s, ti):
      mj = int(mj, 2)
      temp = self.I(self.B, self.C, self.D) + self.A + mj + ti
      temp = self.circuit_shift(temp, s)
      self.A = (self.B + temp)%pow(2, 32)
      self.change_pos()


    def F(self, X, Y, Z):
      return (X & Y) | ((~X) & Z)
    def G(self, X, Y, Z):
      return (X & Z) | (Y & (~Z))
    def H(self, X, Y, Z):
      return X ^ Y ^ Z
    def I(self, X, Y, Z):
      return Y ^ (X | (~Z))

    def group_processing(self):
      M = []
      for i in range(0, 512, 32):
            num = ""
            # 获取每一段的标准十六进制形式
            for j in range(0, len(self.ciphertext), 4):
                temp = self.ciphertext
                temp = hex(int(temp, 2))
                num += temp
            # 对十六进制进行小端排序
            num_tmp = ""
            for j in range(8, 0, -2):
                temp = num
                num_tmp += temp

            num = ""
            for i in range(len(num_tmp)):
                num += int2bin(int(num_tmp, 16), 4)
            M.append(num)

      #print(M)



      for j in range(0, 16, 4):
            self.FF(M], self.s, self.T)
            self.FF(M], self.s, self.T)
            self.FF(M], self.s, self.T)
            self.FF(M], self.s, self.T)

      for j in range(0, 16, 4):
            self.GG(M], self.s, self.T)
            self.GG(M], self.s, self.T)
            self.GG(M], self.s, self.T)
            self.GG(M], self.s, self.T)


      for j in range(0, 16, 4):
            self.HH(M], self.s, self.T)
            self.HH(M], self.s, self.T)
            self.HH(M], self.s, self.T)
            self.HH(M], self.s, self.T)


      for j in range(0, 16, 4):
            self.II(M], self.s, self.T)
            self.II(M], self.s, self.T)
            self.II(M], self.s, self.T)
            self.II(M], self.s, self.T)

      self.A = (self.A+self.init_A)%pow(2, 32)
      self.B = (self.B+self.init_B)%pow(2, 32)
      self.C = (self.C+self.init_C)%pow(2, 32)
      self.D = (self.D+self.init_D)%pow(2, 32)

      """
      print("A:{}".format(hex(self.A)))
      print("B:{}".format(hex(self.B)))
      print("C:{}".format(hex(self.C)))
      print("D:{}".format(hex(self.D)))
      """


      answer = ""
      for register in :
            if len(hex(register))!=10:
                str1 = list(hex(register))
                str1.insert(2,'0')
                str2 = ''.join(str1)
                register = str2
            else:
                register = hex(register)
            for i in range(8, 0, -2):
                answer += str(register)

      return answer



message = "123456£¬¡£fdjf,jkgfkl"
MD5 = MD5(message)
MD5.fill_text()
result = MD5.group_processing()
print("32位小写MD5加密:{}".format(result))

laos 发表于 2023-1-13 02:07

hashlib模块不就可以了么~

pwp 发表于 2023-1-13 11:40

laos 发表于 2023-1-13 02:07
hashlib模块不就可以了么~

得出来的32位和这个不一样{:1_923:}

pojie2022 发表于 2023-1-18 17:12

如果是标准加密算法,就安装使用python的库,如果算法修改过的,不如在python中使用execjs,直接调用js中的代码。前些天看到 btv网站里面有个js就是这个类似的代码,和标准算法不一样,用python弄半天,还是和它计算出的值不一样,最后还是直接调用js中的代码。

pwp 发表于 2023-1-25 12:45

pojie2022 发表于 2023-1-18 17:12
如果是标准加密算法,就安装使用python的库,如果算法修改过的,不如在python中使用execjs,直接调用js中的 ...

一个js加密算法要用一个python模拟出来{:1_918:}

pojie2022 发表于 2023-1-26 15:10

pwp 发表于 2023-1-25 12:45
一个js加密算法要用一个python模拟出来

嗯,是,如果能模拟出来是最好的!
页: [1]
查看完整版本: 这个superMd5三十二位加密如何用python实现