See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Algoritmo LSA - Wikipedia, la enciclopedia libre

Algoritmo LSA

De Wikipedia, la enciclopedia libre

En criptografía, LSA (acrónimo de Liz's Summary Algorithm , Algoritmo de Resumen de Liz) es un algoritmo de reducción criptográfico de 64 bits.

[editar] Codificación

La codificación del LSA de 64 bits es representada tí­picamente como un número de 16 dí­gitos hexadecimal. El siguiente código de 28 bytes ASCII será tratado con LSA y veremos su correspondiente hash de salida:

   LSA("Esto si es una prueba de LSA") = cfa26da3a8c76ca3

Un simple cambio en el mensaje nos da un cambio total en la codificación hash, en este caso cambiamos dos letras, el «si» por un «no».

   LSA("Esto no es una prueba de LSA") = d607d93d2556c3b5

Otro ejemplo serí­a la codificación de un campo vací­o:

   LSA("") = bb52e9b27ef418a3

[editar] Algoritmo

El algoritmo LSA se basa en el reordenamiento de una tabla de valores, en base al mensaje a codificar. A partir de este punto, se hacen uso de funciones lógicas para determinar el valor de salida.

Implementación en C#

   /// <summary>
   /// LSA(Liz's Summary Algorithm) Algoritmo de reducción criptográfico de 64 bits.
   /// Copyright(C) Ronald Anderson 2007-2008
   /// </summary>
   public class LSA
   {
       private static byte[] keyStream = new byte[512];
 
       public static byte[] ComputeHash(byte[] buffer)
       {
           for (int i = 0; i < 512; i++)
           {
               keyStream[i] = (byte)i;
           }
 
           if (buffer.Length == 0) buffer = new byte[1]; buffer[0] = 0;
 
           while ((buffer.Length % 512) != 0)
           {
               Array.Resize<byte>(ref buffer, buffer.Length + 1);
               buffer[buffer.Length - 1] = 0;
           }
 
           int index1 = 0;
           int index2 = 0;
           byte swap = 0;
 
           for (int i = 0; i < (buffer.Length / 512); i++ )
           {
               for (int n = 0; n < keyStream.Length; n++)
               {
                   index2 = (buffer[index1] + keyStream[n] + index2) % 512;
                   swap = keyStream[n];
                   keyStream[n] = keyStream[index2];
                   keyStream[index2] = swap;
                   index1 = (index1 + 1) % buffer.Length;
               }
           }
 
           return Cipher(keyStream);
       }
 
       private static byte[] Cipher(byte[] keyStream)
       {
           byte[] result = new byte[8];
           string[] keyParts = new string[128];
 
           for (int m = 0; m < keyParts.Length; m++)
           {
               int index = m * 4;
               keyParts[m] = string.Concat(string.Format("{0:x2}", keyStream[index]),
                                           string.Format("{0:x2}", keyStream[index + 1]),
                                           string.Format("{0:x2}", keyStream[index + 2]),
                                           string.Format("{0:x2}", keyStream[index + 3]));
           }
 
           ulong xa = 0xFC, ya = 0xEF, za = 0xBA, na = 0xDC;
           ulong xb = 0xCD, yb = 0xAE, zb = 0xFE, nb = 0xAD;
           for (int j = 0; j < keyParts.Length; j++)
           {
               ulong lX = ulong.Parse(string.Concat(keyParts[j][0], keyParts[j][1]), NumberStyles.HexNumber);
               ulong lY = ulong.Parse(string.Concat(keyParts[j][2], keyParts[j][3]), NumberStyles.HexNumber);
               ulong lZ = ulong.Parse(string.Concat(keyParts[j][4], keyParts[j][5]), NumberStyles.HexNumber);
               ulong lN = ulong.Parse(string.Concat(keyParts[j][6], keyParts[j][7]), NumberStyles.HexNumber);
 
               xa = AA(lX, ya, za, na);
               ya = AA(xa, lY, za, na);
               za = AA(xa, ya, lZ, na);
               na = AA(xa, ya, za, lN);
 
               xb = BB(lX, yb, zb, nb);
               yb = BB(xb, lY, zb, nb);
               zb = BB(xb, yb, lZ, nb);
               nb = BB(xb, yb, zb, lN);
 
               xa = CC(lX, yb, zb, nb);
               ya = CC(xb, lY, zb, nb);
               za = CC(xb, yb, lZ, nb);
               na = CC(xb, yb, zb, lN);
 
               xb = AA(lX, ya, za, na);
               yb = AA(xa, lY, za, na);
               zb = AA(xa, ya, lZ, na);
               nb = AA(xa, ya, za, lN);
 
               xa = BB(lX, ya, za, na);
               ya = BB(xb, lY, zb, nb);
               za = BB(xa, ya, lZ, na);
               na = BB(xb, yb, zb, lN);
 
               xb = CC(lX, yb, zb, nb);
               yb = CC(xa, lY, za, na);
               zb = CC(xb, yb, lZ, nb);
               nb = CC(xa, ya, za, lN);
           }
 
           result[0] = (byte)xa;
           result[1] = (byte)ya;
           result[2] = (byte)za;
           result[3] = (byte)na;
           result[4] = (byte)xb;
           result[5] = (byte)yb;
           result[6] = (byte)zb;
           result[7] = (byte)nb;
 
           return result;
       }
 
       private static ulong AA(ulong x, ulong y, ulong z, ulong n)
       {
           return (x & y) | ((~n) & z);
       }
 
       private static ulong BB(ulong x, ulong y, ulong z, ulong n)
       {
           return (x ^ y) | (n & (~z));
       }
 
       private static ulong CC(ulong x, ulong y, ulong z, ulong n)
       {
           return (x ^ y ^ z ^ n);
       }
   }


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -