Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Algoritmo SHA256

  • 1 Respuestas
  • 3672 Vistas

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Yuki

  • *
  • Underc0der
  • Mensajes: 67
  • Actividad:
    0%
  • Reputación 5
    • Ver Perfil
« en: Febrero 25, 2017, 06:56:08 am »
Hace un par de días me interesó traducir el algoritmo SHA256 (Secure Hash Algorithm) a Cramel para demostrar su potencia, así que acá les dejo el algoritmo.

Código: Text
  1. Importar "Cramel.cml"
  2.  
  3. Var m_lOnBits[31]:Entero
  4. Var SHA_K[64]:Entero
  5.  
  6. Const BITS_TO_A_BYTE  = 8
  7. Const BYTES_TO_A_WORD = 4
  8. Const BITS_TO_A_WORD  = 32
  9.  
  10. Proc InicializarSHA256
  11.     m_lOnBits[0] = 1            ' 00000000000000000000000000000001
  12.     m_lOnBits[1] = 3            ' 00000000000000000000000000000011
  13.     m_lOnBits[2] = 7            ' 00000000000000000000000000000111
  14.     m_lOnBits[3] = 15           ' 00000000000000000000000000001111
  15.     m_lOnBits[4] = 31           ' 00000000000000000000000000011111
  16.     m_lOnBits[5] = 63           ' 00000000000000000000000000111111
  17.     m_lOnBits[6] = 127          ' 00000000000000000000000001111111
  18.     m_lOnBits[7] = 255          ' 00000000000000000000000011111111
  19.     m_lOnBits[8] = 511          ' 00000000000000000000000111111111
  20.     m_lOnBits[9] = 1023         ' 00000000000000000000001111111111
  21.     m_lOnBits[10] = 2047        ' 00000000000000000000011111111111
  22.     m_lOnBits[11] = 4095        ' 00000000000000000000111111111111
  23.     m_lOnBits[12] = 8191        ' 00000000000000000001111111111111
  24.     m_lOnBits[13] = 16383       ' 00000000000000000011111111111111
  25.     m_lOnBits[14] = 32767       ' 00000000000000000111111111111111
  26.     m_lOnBits[15] = 65535       ' 00000000000000001111111111111111
  27.     m_lOnBits[16] = 131071      ' 00000000000000011111111111111111
  28.     m_lOnBits[17] = 262143      ' 00000000000000111111111111111111
  29.     m_lOnBits[18] = 524287      ' 00000000000001111111111111111111
  30.     m_lOnBits[19] = 1048575     ' 00000000000011111111111111111111
  31.     m_lOnBits[20] = 2097151     ' 00000000000111111111111111111111
  32.     m_lOnBits[21] = 4194303     ' 00000000001111111111111111111111
  33.     m_lOnBits[22] = 8388607     ' 00000000011111111111111111111111
  34.     m_lOnBits[23] = 16777215    ' 00000000111111111111111111111111
  35.     m_lOnBits[24] = 33554431    ' 00000001111111111111111111111111
  36.     m_lOnBits[25] = 67108863    ' 00000011111111111111111111111111
  37.     m_lOnBits[26] = 134217727   ' 00000111111111111111111111111111
  38.     m_lOnBits[27] = 268435455   ' 00001111111111111111111111111111
  39.     m_lOnBits[28] = 536870911   ' 00011111111111111111111111111111
  40.     m_lOnBits[29] = 1073741823  ' 00111111111111111111111111111111
  41.     m_lOnBits[30] = 2147483647  ' 01111111111111111111111111111111
  42.     SHA_K[0] = &428A2F98
  43.     SHA_K[1] = &71374491
  44.     SHA_K[2] = &B5C0FBCF
  45.     SHA_K[3] = &E9B5DBA5
  46.     SHA_K[4] = &3956C25B
  47.     SHA_K[5] = &59F111F1
  48.     SHA_K[6] = &923F82A4
  49.     SHA_K[7] = &AB1C5ED5
  50.     SHA_K[8] = &D807AA98
  51.     SHA_K[9] = &12835B01
  52.     SHA_K[10] = &243185BE
  53.     SHA_K[11] = &550C7DC3
  54.     SHA_K[12] = &72BE5D74
  55.     SHA_K[13] = &80DEB1FE
  56.     SHA_K[14] = &9BDC06A7
  57.     SHA_K[15] = &C19BF174
  58.     SHA_K[16] = &E49B69C1
  59.     SHA_K[17] = &EFBE4786
  60.     SHA_K[18] = &FC19DC6
  61.     SHA_K[19] = &240CA1CC
  62.     SHA_K[20] = &2DE92C6F
  63.     SHA_K[21] = &4A7484AA
  64.     SHA_K[22] = &5CB0A9DC
  65.     SHA_K[23] = &76F988DA
  66.     SHA_K[24] = &983E5152
  67.     SHA_K[25] = &A831C66D
  68.     SHA_K[26] = &B00327C8
  69.     SHA_K[27] = &BF597FC7
  70.     SHA_K[28] = &C6E00BF3
  71.     SHA_K[29] = &D5A79147
  72.     SHA_K[30] = &6CA6351
  73.     SHA_K[31] = &14292967
  74.     SHA_K[32] = &27B70A85
  75.     SHA_K[33] = &2E1B2138
  76.     SHA_K[34] = &4D2C6DFC
  77.     SHA_K[35] = &53380D13
  78.     SHA_K[36] = &650A7354
  79.     SHA_K[37] = &766A0ABB
  80.     SHA_K[38] = &81C2C92E
  81.     SHA_K[39] = &92722C85
  82.     SHA_K[40] = &A2BFE8A1
  83.     SHA_K[41] = &A81A664B
  84.     SHA_K[42] = &C24B8B70
  85.     SHA_K[43] = &C76C51A3
  86.     SHA_K[44] = &D192E819
  87.     SHA_K[45] = &D6990624
  88.     SHA_K[46] = &F40E3585
  89.     SHA_K[47] = &106AA070
  90.     SHA_K[48] = &19A4C116
  91.     SHA_K[49] = &1E376C08
  92.     SHA_K[50] = &2748774C
  93.     SHA_K[51] = &34B0BCB5
  94.     SHA_K[52] = &391C0CB3
  95.     SHA_K[53] = &4ED8AA4A
  96.     SHA_K[54] = &5B9CCA4F
  97.     SHA_K[55] = &682E6FF3
  98.     SHA_K[56] = &748F82EE
  99.     SHA_K[57] = &78A5636F
  100.     SHA_K[58] = &84C87814
  101.     SHA_K[59] = &8CC70208
  102.     SHA_K[60] = &90BEFFFA
  103.     SHA_K[61] = &A4506CEB
  104.     SHA_K[62] = &BEF9A3F7
  105.     SHA_K[63] = &C67178F2
  106. FinProc
  107.  
  108. Proc AddUnsigned(lX,lY:Entero):Entero
  109.     Var lX8,lY8,lX4,lY4:Entero
  110.     lX8 = lX And &80000000
  111.     lY8 = lY And &80000000
  112.     lX4 = lX And &40000000
  113.     lY4 = lY And &40000000
  114.     Resultado = (lX And &3FFFFFFF) + (lY And &3FFFFFFF)
  115.     Si lX4 And lY4 Entonces
  116.         Resultado = Resultado Xor &80000000 Xor lX8 Xor lY8
  117.     OSi lX4 Or lY4 Entonces
  118.         Si Resultado And &40000000 Entonces
  119.             Resultado = Resultado Xor &C0000000 Xor lX8 Xor lY8
  120.         SiNo
  121.             Resultado = Resultado Xor &40000000 Xor lX8 Xor lY8
  122.         FinSi
  123.     SiNo
  124.         Resultado = Resultado Xor lX8 Xor lY8
  125.     FinSi
  126. FinProc
  127.        
  128. Proc Ch(X,Y,Z:Entero):Entero
  129.     Resultado = (X And Y) Xor ((Not X) And Z)
  130.  
  131. FinProc
  132.  
  133. Proc Maj(X,Y,Z:Entero):Entero
  134.     Resultado = (X And Y) Xor (X And Z) Xor (Y And Z)
  135. FinProc
  136.  
  137. Proc S(X,N:Entero):Entero
  138.     Resultado = (X Shr (N And m_lOnBits[4])) Or (X Shl (32 - (N And m_lOnBits[4])))
  139. FinProc
  140.  
  141. Proc R(X,N:Entero):Entero
  142.     Resultado = X Shr (N And m_lOnBits[4])
  143. FinProc
  144.  
  145. Proc Sigma0(X:Entero):Entero
  146.     Resultado = S(X,2) Xor S(X,13) Xor S(X,22)
  147. FinProc
  148.  
  149. Proc Sigma1(X:Entero):Entero
  150.     Resultado = S(X,6) Xor S(X,11) Xor S(X,25)
  151. FinProc
  152.  
  153. Proc Gamma0(X:Entero):Entero
  154.     Resultado = S(X,7) Xor S(X,18) Xor R(X,3)
  155. FinProc
  156.  
  157. Proc Gamma1(X:Entero):Entero
  158.     Resultado = S(X,17) Xor S(X,19) Xor R(X,10)
  159. FinProc
  160.  
  161. Proc ConvertToWordArray(Referencia sMessage:Cadena):Entero[]
  162.     Var lMessageLength:Entero
  163.     Var lNumberOfWords:Entero
  164.     Var lBytePosition:Entero
  165.     Var lByteCount:Entero
  166.     Var lWordCount:Entero
  167.     Var lByte:Entero
  168.     Var @p:Byte
  169.     Const MODULUS_BITS   = 512
  170.     Const CONGRUENT_BITS = 448
  171.     lMessageLength = CadLong(sMessage)
  172.     lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
  173.     ReDim Resultado,lNumberOfWords-1
  174.     Mientras lByteCount < lMessageLength
  175.         lWordCount = lByteCount \ BYTES_TO_A_WORD
  176.         lBytePosition = (3 - (lByteCount Mod BYTES_TO_A_WORD)) * BITS_TO_A_BYTE
  177.         p@ = sMessage@@+lByteCount
  178.         lByte = p
  179.         Resultado[lWordCount] = Resultado[lWordCount] Or (lByte Shl lBytePosition)
  180.         lByteCount = lByteCount + 1
  181.     FinMientras
  182.     lWordCount = lByteCount \ BYTES_TO_A_WORD
  183.     lBytePosition = (3 - (lByteCount Mod BYTES_TO_A_WORD)) * BITS_TO_A_BYTE
  184.     Resultado[lWordCount] = Resultado[lWordCount] Or (&80 Shl lBytePosition)
  185.     Resultado[lNumberOfWords-1] = lMessageLength Shl 3
  186.     Resultado[lNumberOfWords-2] = lMessageLength Shr 29
  187. FinProc
  188.  
  189. Proc AnsiASHA256(Referencia cMessage:Cadena):Cadena
  190.     Var HASH[8]:Entero
  191.     Var M[]:Entero
  192.     Var W[64]:Entero
  193.     Var a,b,c,d,e,f,g,h,i,j,T1,T2:Entero
  194.     HASH[0] = &6A09E667
  195.     HASH[1] = &BB67AE85
  196.     HASH[2] = &3C6EF372
  197.     HASH[3] = &A54FF53A
  198.     HASH[4] = &510E527F
  199.     HASH[5] = &9B05688C
  200.     HASH[6] = &1F83D9AB
  201.     HASH[7] = &5BE0CD19
  202.     M = ConvertToWordArray(cMessage)
  203.     Contar i a (&M) Paso 16
  204.             Si i > &M Entonces Salir Contar
  205.             a = HASH[0]
  206.             b = HASH[1]
  207.             c = HASH[2]
  208.             d = HASH[3]
  209.             e = HASH[4]
  210.             f = HASH[5]
  211.             g = HASH[6]
  212.             h = HASH[7]
  213.             j = 0
  214.             Contar j a 63
  215.                 Si j < 16 Entonces
  216.                     W[j] = M[j+i]
  217.                 SiNo
  218.                     W[j] = AddUnsigned(AddUnsigned(AddUnsigned(Gamma1(W[j-2]),W[j-7]),Gamma0(W[j-15])),W[j - 16])
  219.                 FinSi
  220.                 T1 = AddUnsigned(AddUnsigned(AddUnsigned(AddUnsigned(h, Sigma1(e)),Ch(e, f, g)), SHA_K[j]), W[j])
  221.                 T2 = AddUnsigned(Sigma0(a),Maj(a,b,c))
  222.                 h = g
  223.                 g = f
  224.                 f = e
  225.                 e = AddUnsigned(d, T1)
  226.                 d = c
  227.                 c = b
  228.                 b = a
  229.                 a = AddUnsigned(T1, T2)
  230.             Seguir
  231.             HASH[0] = AddUnsigned(a, HASH[0])
  232.             HASH[1] = AddUnsigned(b, HASH[1])
  233.             HASH[2] = AddUnsigned(c, HASH[2])
  234.             HASH[3] = AddUnsigned(d, HASH[3])
  235.             HASH[4] = AddUnsigned(e, HASH[4])
  236.             HASH[5] = AddUnsigned(f, HASH[5])
  237.             HASH[6] = AddUnsigned(g, HASH[6])
  238.             HASH[7] = AddUnsigned(h, HASH[7])
  239.     Seguir
  240.     Resultado = EntCad(HASH[0],16) + EntCad(HASH[1],16) + EntCad(HASH[2],16) + _
  241.                 EntCad(HASH[3],16) + EntCad(HASH[4],16) + EntCad(HASH[5],16) + _
  242.                 EntCad(HASH[6],16) + EntCad(HASH[7],16)
  243. FinProc
  244.  
  245. InicializarSHA256
  246.  
  247. MessageBox(0,AnsiASHA256("abc"),"Cramel",48)

También lo pueden ver desde aquí.

¡Saludos!
« Última modificación: Febrero 25, 2017, 02:56:17 pm por ANTRAX »

Desconectado Markovnikov

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Abril 20, 2018, 06:01:51 pm »
Hola, no tendrás el algoritmo en el lenguaje original?

 

¿Te gustó el post? COMPARTILO!



[Cramel] Algoritmo CRC32

Iniciado por Yuki

Respuestas: 0
Vistas: 2703
Último mensaje Junio 10, 2017, 10:28:18 pm
por Yuki