python不引入任何庫實現md5加密

2021-09-29 09:02:17 字數 4803 閱讀 1780

不足50行**,不引入任何庫,和cmd5**查詢結果一致,支援中文。

# 程式中:大端位元組序

a =0x67452301

b =0xefcdab89

c =0x98badcfe

d =0x10325476

k =[

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,]

maxint=

0x100000000

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,]def

fill

(sequence)

:'將位元組序列按小端序填充成512位【16整數*4位元組】的倍數'

count=

len(sequence)

multi_16s=

((count+8)

//64+1

)*16# 共需要整數的個數,每個整數儲存4個位元組的資料

sequence+=[0

]*(multi_16s*

4-count)

# 用 0 填充

sequence[count]|=

128# 用乙個 1 補在後面

multi_4bytes=

for i in

range

(len

(sequence)//4

):sequence[i*4+

3],sequence[i*4+

2],sequence[i*4+

1],sequence[i*4]

=tuple

(sequence[i*4:

(i+1)*

4])# 大端序儲存

int(

"".join([""

.format

(ii)

for ii in sequence[i*4:

(i+1)*

4]])

,2))

# 每四個ascii合併成乙個4位元組整數

multi_4bytes[-2

],multi_4bytes[-1

]=int("".

format

(count*8)

[32:]

,2),

int("".

format

(count*8)

[:32]

,2)return multi_4bytes

defshift

(x,n)

:'迴圈左移'

return

(( x << n )

|(x >>(32

-n))

)def

f(x,y,z)

:return

(x&y)|(

(~x)

&z)def

g(x,y,z)

:return

(x&z)

|(y&

(~z)

)def

h(x,y,z)

:return x^y^z

defi

(x,y,z)

:return y^

(x|(

~z))

defgo

(a,b,c,d,fun,m,s,k)

: thesum=

(a + fun(b, c, d)

+int

(m)+ k)

%maxint

return

(b+shift(thesum,s)

)%maxint

defint32tohex

(a):

'32位整型集合轉16進製制'

md5=

''for i in a:

x="".

format

(i)# 整型【32位2】->8位16

md5+=x[6:

]+x[4:

6]+x[2:4

]+x[:2

]# 每兩位切割, 切割4刀->逆序【大端變小端】

return md5

if __name__ ==

"__main__"

: text=

input

("請輸入要摘要的字串:"

) sequence=

list

(bytes

(text,

'utf-8'))

# 將unicode轉換為位元組序列

text_int4=fill(sequence)

# 將位元組序列按小端序填充成4位元組整數

for i in

range

(len

(text_int4)

//16):

# 主迴圈

a,b,c,d=a,b,c,d

m =[text_int4[i*

16+ii]

for ii in

range(16

)]# 取出16個整數

for ii in

range(64

):if ii<

16: a,b,c,d=d,go(a,b,c,d,f,m[ii]

,s[ii]

,k[ii]

),b,c

elif ii<

32: a,b,c,d=d,go(a,b,c,d,g,m[

(ii*5+

1)%16

],s[ii]

,k[ii]

),b,c

elif ii<

48: a,b,c,d=d,go(a,b,c,d,h,m[

((ii*3)

+5)%

16],s[ii]

,k[ii]

),b,c

else

: a,b,c,d=d,go(a,b,c,d,i,m[ii*7%

16],s[ii]

,k[ii]

),b,c

a,b,c,d=

(a+a)

%maxint,

(b+b)

%maxint,

(c+c)

%maxint,

(d+d)

%maxint # 此處還是大端位元組

md5 = int32tohex(

[a,b,c,d]

)print

("32位小寫:"

,md5)

不引入新的陣列,實現陣列元素交換位置函式

最近遇到一道c 的面試題,要求不引入新的陣列,實現陣列元素交換位置函式,看似挺簡單的,卻還是花費了我不少時間,這裡記錄下來,給大家乙個簡單的思路。題目的詳細要求是 不引入新的陣列,實現陣列元素交換位置函式 void swap int a,int m,int n 比如,設m為3,n為4,a中的資料為 ...

不引入新的陣列,實現陣列元素交換位置函式

最近遇到一道c 的面試題,要求不引入新的陣列,實現陣列元素交換位置函式,看似挺簡單的,卻還是花費了我不少時間,這裡記錄下來,給大家乙個簡單的思路。題目的詳細要求是 不引入新的陣列,實現陣列元素交換位置函式 void swap int a,int m,int n 比如,設m為3,n為4,a中的資料為 ...

python3 模板庫 Python模板庫Mako

中文語法文件 快速總結 特點 簡單快速,對模組化程式設計支援到位,能直接呼叫python 關於速度的對比 mako 1.10 ms myghty 4.52 ms cheetah 1.10 msgenshi 11.46 ms django 2.74 mskid 14.54 ms 本質及哲學 mako的...