Guest User

Untitled

a guest
Mar 16th, 2018
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.50 KB | None | 0 0
  1. #!/usr/bin/env python
  2. """
  3. Copyright 2010 kenkeiras <kenkeiras@gmail.com>
  4. Bajo la licencia WTFPL
  5.  
  6.             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
  7.                    Version 2, December 2004
  8.  
  9. Everyone is permitted to copy and distribute verbatim or modified
  10. copies of this license document, and changing it is allowed as long
  11. as the name is changed.
  12.  
  13.            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
  14.   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  15.  
  16.  0. You just DO WHAT THE FUCK YOU WANT TO.
  17. """
  18. import struct
  19.  
  20. #Pasa un entero de 4 bytes a un array de 4 bytes
  21. def uint4tochar(s):
  22.     i=0
  23.     t=[0,0,0,0]
  24.  
  25.     while i<4:
  26.         aux=(s>>(8*i))&0xFF
  27.  
  28.         t[3-i]=int(aux)
  29.         i+=1
  30.  
  31.     return t
  32.  
  33. #Devuelve un hexadecimal con 4 caracteres o mas
  34. def myhex(a):
  35.     r=hex(a)
  36.  
  37.     if (len(r)==3):
  38.         r="0x0"+r[2]
  39.  
  40.     return r
  41. #Funciones basicas
  42. def F(x,y,z): # XY o no(X)Z
  43.     return (x&y)|((~x&0xFFFFFFFF)&z)
  44.  
  45. def G(x,y,z): # XZ o no(Z)Y
  46.     return (x&z)|(y&(~z&0xFFFFFFFF))
  47.  
  48. def H(x,y,z): # X xor Y xor Z
  49.     return x^y^z
  50.  
  51. def I(x,y,z): # Y xor (X o no(Z))
  52.     return y^(x|(~z&0xFFFFFFFF))
  53.  
  54. # Rotacion
  55. def rotate_left(x,y):
  56.     return ((x<<y)|(x>>(32-y)))
  57.  
  58.  
  59. #Transformaciones
  60. def FF(a, b, c, d, x, s, ac):
  61.  
  62.     a = (a + (F(b, c, d) + x + ac)) & 0xFFFFFFFF
  63.  
  64.     a = rotate_left(a, s) & 0xFFFFFFFF
  65.     a = (a + b) & 0xFFFFFFFF
  66.  
  67.     return a
  68.  
  69. def GG(a, b, c, d, x, s, ac):
  70.  
  71.     a = (a + (G(b, c, d) + x + ac)) & 0xFFFFFFFF
  72.  
  73.     a = rotate_left(a, s) & 0xFFFFFFFF
  74.     a = (a + b) & 0xFFFFFFFF
  75.  
  76.     return a
  77.  
  78. def HH(a, b, c, d, x, s, ac):
  79.  
  80.     a = (a + (H(b, c, d) + x + ac)) & 0xFFFFFFFF
  81.  
  82.     a = rotate_left(a, s) & 0xFFFFFFFF
  83.     a = (a + b) & 0xFFFFFFFF
  84.  
  85.     return a
  86.  
  87. def II(a, b, c, d, x, s, ac):
  88.  
  89.     a = (a + (I(b, c, d) + x + ac)) & 0xFFFFFFFF
  90.  
  91.     a = rotate_left(a, s) & 0xFFFFFFFF
  92.     a = (a + b) & 0xFFFFFFFF
  93.  
  94.     return a
  95.  
  96. #Tabla de valores utilizados en la funcion
  97. S11 =  7
  98. S12 = 12
  99. S13 = 17
  100. S14 = 22
  101.  
  102. S21 =  5
  103. S22 =  9
  104. S23 = 14
  105. S24 = 20
  106.  
  107. S31 =  4
  108. S32 = 11
  109. S33 = 16
  110. S34 = 23
  111.  
  112. S41 =  6
  113. S42 = 10
  114. S43 = 15
  115. S44 = 21
  116.  
  117.  
  118. class md5:
  119.  
  120.     #Paso 1, se anhade un bit '1' al mensaje
  121.     # Y despues se hace que sea igual a 448, modulo 512 (ambos en bits)
  122.     # ,que se traducen en 56 y 64 bytes respectivamente
  123.     def padd(self,s):
  124.         self.stream=s+"\x80"
  125.         while ((len(self.stream)%64)!=56):
  126.             self.stream+="\x00"
  127.  
  128.  
  129.     #Paso 2, se anhade al mensaje el numero (de 64 bits-8 bytes)
  130.     # de bits antes de la primera adicion
  131.     def attach_len(self,ln):
  132.         ln%=1<<64
  133.         self.stream += struct.pack("q", ln)    
  134.  
  135.     #Paso 3, se inicializa un bufer
  136.     def buff_init(self):
  137.         self.a = 0x67452301
  138.         self.b = 0xefcdab89
  139.         self.c = 0x98badcfe
  140.         self.d = 0x10325476
  141.  
  142.  
  143.     # Paso 4, se procesa el objeto    
  144.     def transform(self,x):
  145.  
  146.         AA = self.a
  147.         BB = self.b
  148.         CC = self.c
  149.         DD = self.d
  150.  
  151.         #Ronda 1
  152.         AA = FF(AA, BB, CC, DD, x[ 0], S11, 0xd76aa478) # 1
  153.         DD = FF(DD, AA, BB, CC, x[ 1], S12, 0xe8c7b756) # 2
  154.         CC = FF(CC, DD, AA, BB, x[ 2], S13, 0x242070db) # 3
  155.         BB = FF(BB, CC, DD, AA, x[ 3], S14, 0xc1bdceee) # 4
  156.  
  157.         AA = FF(AA, BB, CC, DD, x[ 4], S11, 0xf57c0faf) # 5
  158.         DD = FF(DD, AA, BB, CC, x[ 5], S12, 0x4787c62a) # 6
  159.         CC = FF(CC, DD, AA, BB, x[ 6], S13, 0xa8304613) # 7
  160.         BB = FF(BB, CC, DD, AA, x[ 7], S14, 0xfd469501) # 8
  161.  
  162.         AA = FF(AA, BB, CC, DD, x[ 8], S11, 0x698098d8) # 9
  163.         DD = FF(DD, AA, BB, CC, x[ 9], S12, 0x8b44f7af) # 10
  164.         CC = FF(CC, DD, AA, BB, x[10], S13, 0xffff5bb1) # 11
  165.         BB = FF(BB, CC, DD, AA, x[11], S14, 0x895cd7be) # 12
  166.  
  167.  
  168.         AA = FF(AA, BB, CC, DD, x[12], S11, 0x6b901122) # 13
  169.         DD = FF(DD, AA, BB, CC, x[13], S12, 0xfd987193) # 14
  170.         CC = FF(CC, DD, AA, BB, x[14], S13, 0xa679438e) # 15
  171.         BB = FF(BB, CC, DD, AA, x[15], S14, 0x49b40821) # 16
  172.  
  173.         # Round 2
  174.         AA = GG(AA, BB, CC, DD, x[ 1], S21, 0xf61e2562) # 17
  175.         DD = GG(DD, AA, BB, CC, x[ 6], S22, 0xc040b340) # 18
  176.         CC = GG(CC, DD, AA, BB, x[11], S23, 0x265e5a51) # 19
  177.         BB = GG(BB, CC, DD, AA, x[ 0], S24, 0xe9b6c7aa) # 20
  178.  
  179.         AA = GG(AA, BB, CC, DD, x[ 5], S21, 0xd62f105d) # 21
  180.         DD = GG(DD, AA, BB, CC, x[10], S22, 0x2441453 ) # 22
  181.         CC = GG(CC, DD, AA, BB, x[15], S23, 0xd8a1e681) # 23
  182.         BB = GG(BB, CC, DD, AA, x[ 4], S24, 0xe7d3fbc8) # 24
  183.  
  184.         AA = GG(AA, BB, CC, DD, x[ 9], S21, 0x21e1cde6) # 25
  185.         DD = GG(DD, AA, BB, CC, x[14], S22, 0xc33707d6) # 26
  186.         CC = GG(CC, DD, AA, BB, x[ 3], S23, 0xf4d50d87) # 27
  187.         BB = GG(BB, CC, DD, AA, x[ 8], S24, 0x455a14ed) # 28
  188.  
  189.         AA = GG(AA, BB, CC, DD, x[13], S21, 0xa9e3e905) # 29
  190.         DD = GG(DD, AA, BB, CC, x[ 2], S22, 0xfcefa3f8) # 30
  191.         CC = GG(CC, DD, AA, BB, x[ 7], S23, 0x676f02d9) # 31
  192.         BB = GG(BB, CC, DD, AA, x[12], S24, 0x8d2a4c8a) # 32
  193.  
  194.  
  195.         # Round 3
  196.         AA = HH(AA, BB, CC, DD, x[ 5], S31, 0xfffa3942) # 33
  197.         DD = HH(DD, AA, BB, CC, x[ 8], S32, 0x8771f681) # 34
  198.         CC = HH(CC, DD, AA, BB, x[11], S33, 0x6d9d6122) # 35
  199.         BB = HH(BB, CC, DD, AA, x[14], S34, 0xfde5380c) # 36
  200.  
  201.        
  202.         AA = HH(AA, BB, CC, DD, x[ 1], S31, 0xa4beea44) # 37
  203.         DD = HH(DD, AA, BB, CC, x[ 4], S32, 0x4bdecfa9) # 38
  204.         CC = HH(CC, DD, AA, BB, x[ 7], S33, 0xf6bb4b60) # 39
  205.         BB = HH(BB, CC, DD, AA, x[10], S34, 0xbebfbc70) # 40
  206.  
  207.         AA = HH(AA, BB, CC, DD, x[13], S31, 0x289b7ec6) # 41
  208.         DD = HH(DD, AA, BB, CC, x[ 0], S32, 0xeaa127fa) # 42
  209.         CC = HH(CC, DD, AA, BB, x[ 3], S33, 0xd4ef3085) # 43
  210.         BB = HH(BB, CC, DD, AA, x[ 6], S34, 0x4881d05 ) # 44
  211.  
  212.         AA = HH(AA, BB, CC, DD, x[ 9], S31, 0xd9d4d039) # 45
  213.         DD = HH(DD, AA, BB, CC, x[12], S32, 0xe6db99e5) # 46
  214.         CC = HH(CC, DD, AA, BB, x[15], S33, 0x1fa27cf8) # 47
  215.         BB = HH(BB, CC, DD, AA, x[ 2], S34, 0xc4ac5665) # 48
  216.  
  217.  
  218.         # Round 4
  219.         AA = II(AA, BB, CC, DD, x[ 0], S41, 0xf4292244) # 49
  220.         DD = II(DD, AA, BB, CC, x[ 7], S42, 0x432aff97) # 50
  221.         CC = II(CC, DD, AA, BB, x[14], S43, 0xab9423a7) # 51
  222.         BB = II(BB, CC, DD, AA, x[ 5], S44, 0xfc93a039) # 52
  223.  
  224.         AA = II(AA, BB, CC, DD, x[12], S41, 0x655b59c3) # 53
  225.         DD = II(DD, AA, BB, CC, x[ 3], S42, 0x8f0ccc92) # 54
  226.         CC = II(CC, DD, AA, BB, x[10], S43, 0xffeff47d) # 55
  227.         BB = II(BB, CC, DD, AA, x[ 1], S44, 0x85845dd1) # 56
  228.  
  229.         AA = II(AA, BB, CC, DD, x[ 8], S41, 0x6fa87e4f) # 57
  230.         DD = II(DD, AA, BB, CC, x[15], S42, 0xfe2ce6e0) # 58
  231.         CC = II(CC, DD, AA, BB, x[ 6], S43, 0xa3014314) # 59
  232.         BB = II(BB, CC, DD, AA, x[13], S44, 0x4e0811a1) # 60
  233.  
  234.         AA = II(AA, BB, CC, DD, x[ 4], S41, 0xf7537e82) # 61
  235.         DD = II(DD, AA, BB, CC, x[11], S42, 0xbd3af235) # 62
  236.         CC = II(CC, DD, AA, BB, x[ 2], S43, 0x2ad7d2bb) # 63
  237.         BB = II(BB, CC, DD, AA, x[ 9], S44, 0xeb86d391) # 64
  238.  
  239.         self.a = (self.a + AA) & 0xFFFFFFFF
  240.         self.b = (self.b + BB) & 0xFFFFFFFF
  241.         self.c = (self.c + CC) & 0xFFFFFFFF
  242.         self.d = (self.d + DD) & 0xFFFFFFFF
  243.  
  244.     def update(self):
  245.         for i in xrange (len(self.stream) / 64):
  246.  
  247.             x=[]
  248.  
  249.             for j in xrange(16):
  250.  
  251.                 t = ((ord(self.stream[(i*64)+(j*4)+0]))|
  252.                   (ord(self.stream[(i*64)+(j*4)+1])<< 8)|
  253.                   (ord(self.stream[(i*64)+(j*4)+2])<< 16)|
  254.                   (ord(self.stream[(i*64)+(j*4)+3])<< 24))
  255.  
  256.                 x.append(t)
  257.  
  258.             self.transform(x)
  259.  
  260.  
  261.     # Paso 5, finalizacion y salida
  262.     def final(self):
  263.  
  264.         self.digest=[]
  265.         for buff in [self.a,self.b,self.c,self.d]:
  266.  
  267.             t = uint4tochar(buff)
  268.             while len(t)>0:
  269.  
  270.                 byte = t.pop()
  271.                 self.digest.append(myhex(byte)[2:4])
  272.  
  273.     def hexdigest(self):
  274.         return ''.join(self.digest)
  275.        
  276.     # Punto de inicio
  277.     def __init__(self,s):
  278.         ln=len(s)*8
  279.         self.padd(s)
  280.         self.attach_len(ln)
  281.         self.buff_init()
  282.         self.update()
  283.         self.final()
  284.  
  285. if __name__=="__main__":
  286.     import hashlib
  287.     tests=["","1234","The quick brown fox jumps over the lazy dog","The quick brown fox jumps over the lazy dog.","qwertyuiopasdfghjklzxcvbnm,.+'-.,!\"$%&/()=?!~|@#{[]}"]
  288.     for s in tests:
  289.         chksum=md5(s)
  290.         a=chksum.hexdigest()
  291.         print a,'=',
  292.         b=hashlib.md5(s).hexdigest()
  293.         print b,a==b
Add Comment
Please, Sign In to add comment