这个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:44 编辑
```
123456£¬¡£fdjf,jkgfkl
```
加密后
80fba977d063a6f7262a8a9c95f61140 # -*- 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))
hashlib模块不就可以了么~ laos 发表于 2023-1-13 02:07
hashlib模块不就可以了么~
得出来的32位和这个不一样{:1_923:} 如果是标准加密算法,就安装使用python的库,如果算法修改过的,不如在python中使用execjs,直接调用js中的代码。前些天看到 btv网站里面有个js就是这个类似的代码,和标准算法不一样,用python弄半天,还是和它计算出的值不一样,最后还是直接调用js中的代码。 pojie2022 发表于 2023-1-18 17:12
如果是标准加密算法,就安装使用python的库,如果算法修改过的,不如在python中使用execjs,直接调用js中的 ...
一个js加密算法要用一个python模拟出来{:1_918:} pwp 发表于 2023-1-25 12:45
一个js加密算法要用一个python模拟出来
嗯,是,如果能模拟出来是最好的!
页:
[1]