De 256 bits de las claves para el cifrado fuerte
las Técnicas para la identificación de las claves que resistir los ataques de fuerza bruta y ataques de diccionario. Incluye Delphi fuente para el análisis de las teclas, la conversión de las frases de paso a las teclas y permuting teclas.
[256 bits de las Claves Para el Cifrado Fuerte]
// código fuente en la parte inferior
La seguridad de cualquier buen sistema de criptografía se basa en la clave. No importa cuán grande sea la clave, habrá un imponente disminución en la seguridad si es mal utilizado por el software. Las claves deben ser medidos de acuerdo a los bits de entropía contenida dentro de ellos, y una simple llave debe ser desestimado. Que debe contener muchos personajes diferentes, y no tienen patrones discernibles. Sólo cuando se cumplen estas condiciones será una clave soportar diccionario y ataques de fuerza bruta.
Una clave de la entropía mide la cantidad de impredecible bits.
teniendo en cuenta los usuarios suelen utilizar sólo caracteres alfanuméricos, sólo se debe utilizar el mínimo número de bits posible representar la clave. Utilizando 8 bits por carácter, significa que hay 256 caracteres diferentes disponibles. Un atacante sabe que el usuario va a utilizar sólo caracteres alfanuméricos (62 caracteres, 6 bits), y no se molestan en realizar pruebas para la 194 otros personajes. Una práctica técnica es convertir cada carácter (1 byte) en un 6bit número, y la concatenación, a continuación, uno al lado del otro. Usted podría permitir que sólo letras minúsculas y un par de números y reducir cada personaje 5bits (32 caracteres). Es importante exigir al usuario el uso de las contraseñas que son mayores para lograr el mismo tamaño de la clave. Con esto, dijo, un 8 tecla de carácter no debe ser considerada como de 64bits, pero en realidad 48bits (6bits x 8 caracteres). Teclas con baja entropía suponen una amenaza para la seguridad que no importa lo bien diseñado que el resto del sistema está diseñado.
Corto, de una sola palabra claves no deben ser tolerados dentro de un criptosistema. Incluso si usted optimizar la entropía, no hay datos clave en un 5 tecla de carácter para resistir un ataque de fuerza bruta. Un 30bit clave (6bits x 5 caracteres) sólo permite la posibilidad de unos mil millones de claves, que sólo toma un par de horas de escape en un ordenador potente. Una clave de al menos 128bits debe ser un requisito para sesitive de datos de esta manera se garantiza un lapso de un par de años antes de que surge la necesidad de una nueva y más clave. En 6bits por carácter esto significa que la clave debe ser de 22 o más caracteres de longitud. Esto puede parecer grande, pero nada le impide el uso de frases. Como ejemplo veamos la frase 'El Ascensor que Estaba Pasando', es de 25 caracteres. La clave es de 150 bits de largo, pero aún así fácil de recordar. Todas las claves deben ser tratados de esta manera. No hay excusa para permitir a un usuario el uso de 8 caracteres de la clave y poner en peligro todo el sistema de criptografía.
Una clave que proporciona una mejor resistencia en contra de las búsquedas algorítmicas cuando contiene muchos personajes diferentes. Si la clave es de 22 caracteres de largo, pero sólo contiene 4 personajes diferentes, entonces es muy débil. Para mantener las cosas simples, al menos la mitad de los personajes en una clave debe ser diferente (22 de caracteres de la clave debe tener al menos 11 personajes diferentes). Más personajes diferentes en una clave que hacen que sea más difícil de predecir estadísticamente el siguiente carácter. Aunque este tipo de ataque es raro, no hay margen para el error. La prevención de todos los tipos conocidos de ataques y previsión de las infracciones antes de-la-mano es de absoluta-que es más importante, no importa lo insignificante que un riesgo pueda parecer. Un riesgo es siempre un riesgo. Es importante animar a los usuarios a tener la mayoría de personajes diferentes que pueden recordar en cada una de las claves para hacer búsquedas algorítmicas rendimiento sin resultados.
los Atacantes amor patrones, para facilitar las búsquedas y su vida mucho más fácil. Parece ser que los usuarios piensan que las claves como: 'bingobingo' son más seguros que aquellos como: 'bingo', pero el hecho es que son sólo un poco mejor. Smart atacantes saben todos los trucos de los usuarios diseñar para hacer sus claves más difícil de adivinar. El uso de una palabra dos veces debe ser fuertemente desaconsejado. A menudo los usuarios agregar números al final de la clave, para que sea menos predecible. Lamentablemente el 80% del tiempo el número 123, y el otro 20% es de 321. Por un atacante para probar estas teclas adicionales, también debe probar con 123 añadido a cada clave, así como 321. Esto significa que él tiene que buscar 3 veces la cantidad de teclas, esto sólo representa un 1.5 bits aumentar en lugar de la 18bits 3 caracteres que deben ofrecer. Probando las llaves de patrones puede ser muy complejo obstáculo, y no serán discutidos en este documento. Después de patrones obvios han sido desautorizada es aconsejable pasar la clave a través de una sola manera, la función de hash como el SHA o HAVAL. Estas funciones se llevan una entrada de datos y crear una que no tiene solucionable relación a la entrada de cada posible entrada sólo hay una salida. La salida de estas funciones de hash es aparentemente al azar y efectivamente disfraz cualquiera de los modelos discretos.
la Eliminación de patrones hace que sea muy difícil para un atacante
la búsqueda de las llaves débiles.
/ / ***** NOTAS:
La fuente de abajo es parte de una biblioteca en el progreso cummulating 3 años de investigación. Esto pretende ser un ejemplo, pero si quieres usarlo en un programa, un poco de crédito sería bueno.
Estas rutinas clave que han sido optimizados y re-escrito una docena de veces, he tratado de comentar lo mejor que pude. El procedimiento de estructuras puede parecer extraño, porque yo originalmente escrito en C . El pseudo random number generator proviene de una fuente desconocida, y esta aplicación de haval es un [grave] modificación de David Barton haval.pas se encuentra en la DCPcrypt 1.3 componente de la suite. He utilizado el contexto de la encapsulación de modo que los procedimientos no tienen que ser instanciado en un entorno multiproceso (servidor tal vez?).
Descripción:
[MutateKey]
se Transforma de una clave a otra mediante la expansión y la compresión. No hay claves anteriores puede ser determinado por la clave actual, sino de todas las claves de éxito puede ser. Esto es útil para agregar la entropía a una tecla (por lo que no hay atajos bruta búsquedas) o por las sesiones a las que puede necesitar el uso de múltiples sesiones teclas.
[PasswordToKey]
Convierte una cadena con 64 caracteres posibles: 'a'-'z', 'A'-'Z', '0'-'9', '_' y '.' en una de 256 bits dejando los 2 bits de cada carácter (64 caracteres sólo se necesita 6bits para representar a cada uno, en lugar de 8bits para 256 caracteres) y, a continuación, utiliza MutateKey para aumentar la entropía.
[AnanlyzeKey]
Examina una clave de la entropía mediante la búsqueda de patrones, contar los bits por carácter, evaluación 0/1 (binario) de distribución, y se deriva un examen de calificación de la clave se mide en bits de longitud.
(un completo ejemplo de esto se puede encontrar en http://www.geocities.com/drmungkee/software/codebase.html)
//******************* la UNIDAD COMIENZA AQUÍ ****************************************
unidad de keyfunc
interfaz
tipo
& nbsp & nbsp & nbsp key256=array[0..7]de larga
& nbsp & nbsp & nbsp Prng_CTX=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp r:array[1..97]de real
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x1,x2,x3:longword
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp TPrng_CTX=^Prng_CTX
& nbsp & nbsp & nbsp Haval_CTX=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lenhi,lenlo:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Índice:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hash:array[0..7]de larga
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hashbuffer:array[0..127]de bytes
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp THaval_CTX=^Haval_CTX
& nbsp & nbsp & nbsp KeyStatistics=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KeyLength:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KeySize:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CharCount:bytes
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CharBits:byte
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Patrones:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Diferencial:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BruteLength:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Rating:longword
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp TKeyStatistics=^KeyStatistics
procedimiento MutateKey(var key:key256)
función PasswordToKey(pass:string):key256
función AnalyzePassword(pass:string):KeyStatistics
aplicación
const BIT_MASK:array[0..7]of byte = (1,2,4,8,16,32,64,128)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HASH_SIZE=256
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM1:longword=259200
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI1:longword=7141
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC1:longword=54773
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM2:longword=134456
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI2:longword=8121
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC2:longword=28411
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM3:longword=243000
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI3:longword=4561
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC3:longword=51349
//*******************************************************************
// Haval
//
// Derivados de David Barton haval.pas (DCPcrypt 1.3 componente suite)
//
//*******************************************************************
procedimiento HavalCompress(ctx:THaval_CTX)
& nbsp & nbsp & nbsp función rr32(x:longword c:longint):longword registro ensamblador
& nbsp & nbsp & nbsp asm
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mov ecx,edx
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ror eax,cl
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r1(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=((x2)y((x6)xor(x1))xor(x5)y(x4)xor(x0)y(x3)xor(x6))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r2(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x3 y(x4, y(no se x0)xor x1 y x2 xor x6 xor x5)xor x1 y(x4 xor x2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor x0 y x2 xor x5)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r3(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=((x4)y((x1)y(x3)xor(x2)xor(x5))xor(x1)y(x0)xor(x3)y(x6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor(x5))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r4(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x3 y(x5 y(no se x0)xor x2 y(no x1)xor x4 xor x1 xor x6)xor x2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y(x4 y x0 xor x5 xor x1)xor x0 y x1 xor x6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r5(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x1, y(x3 y x4 y x6 xor(no x5))xor x3 y x0 xor x4 y x5
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor x6 y x2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
var t7,t6,t5,t4,t3,t2,t1,t0:longword
& nbsp & nbsp & nbsp & nbsp w:array[0..31] de larga
begin
& nbsp & nbsp & nbsp t0:=ctx.hash[0]
& nbsp & nbsp & nbsp t1:=ctx.hash[1]
& nbsp & nbsp & nbsp t2:=ctx.hash[2]
& nbsp & nbsp & nbsp t3:=ctx.hash[3]
& nbsp & nbsp & nbsp t4:=ctx.hash[4]
& nbsp & nbsp & nbsp t5:=ctx.hash[5]
& nbsp & nbsp & nbsp t6:=ctx.hash[6]
& nbsp & nbsp & nbsp t7:=ctx.hash[7]
& nbsp & nbsp & nbsp mover(ctx.hashbuffer,w,sizeof(w))
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[ 0])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[ 1])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[ 2])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[ 3])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[ 4])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[ 5])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[ 6])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[ 7])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[ 8])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[10])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[11])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[12])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[13])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[14])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[15])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[16])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[17])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[18])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[19])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[20])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[21])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[22])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[23])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[24])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[25])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[26])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[27])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[28])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[29])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[30])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[31])
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[ 5],$452821E6)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[14],$38D01377)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[26],$BE5466CF)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[18],$34E90C6C)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[11],$C0AC29B7)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[28],$C97C50DD)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[ 7],$3F84D5B5)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[16],$B5470917)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[ 0],$9216D5D9)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[23],$8979FB1B)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[20],$D1310BA6)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[22],$98DFB5AC)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[ 1],$2FFD72DB)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[10],$D01ADFB7)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[ 4],$B8E1AFED)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[ 8],$6A267E96)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[30],$BA7C9045)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[ 3],$F12C7F99)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$24A19947)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[ 9],$B3916CF7)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$0801F2E2)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[24],$858EFC16)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[29],$636920D8)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[ 6],$71574E69)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$A458FEA3)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[12],$F4933D7E)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[15],$0D95748F)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[13],$728EB658)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[ 2],$718BCD58)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[25],$82154AEE)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[31],$7B54A41D)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[27],$C25A59B5)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$9C30D539)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9],$2AF26013)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[ 4],$C5D1B023)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[20],$286085F0)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[28],$CA417918)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[17],$B8DB38EF)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[ 8],$8E79DCB0)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[22],$603A180E)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[29],$6C9E0E8B)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[14],$B01E8A3E)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[25],$D71577C1)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[12],$BD314B27)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[24],$78AF2FDA)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[30],$55605C60)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[16],$E65525F3)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[26],$AA55AB94)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[31],$57489862)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[15],$63E81440)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[ 7],$55CA396A)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[ 3],$2AAB10B6)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[ 1],$B4CC5C34)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[ 0],$1141E8CE)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[18],$A15486AF)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[27],$7C72E993)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[13],$B3EE1411)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[ 6],$636FBC2A)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$2BA9C55D)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[10],$741831F6)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[23],$CE5C3E16)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[11],$9B87931E)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[ 5],$AFD6BA33)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[ 2],$6C24CF5C)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[24],$7A325381)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[ 4],$28958677)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[ 0],$3B8F4898)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[14],$6B4BB9AF)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[ 2],$C4BFE81B)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[ 7],$66282193)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[28],$61D809CC)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[23],$FB21A991)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[26],$487CAC60)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[ 6],$5DEC8032)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[30],$EF845D5D)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[20],$E98575B1)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[18],$DC262302)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[25],$EB651B88)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[19],$23893E81)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[ 3],$D396ACC5)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[22],$0F6D6FF3)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[11],$83F44239)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[31],$2E0B4482)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[21],$A4842004)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[ 8],$69C8F04A)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[27],$9E1F9B5E)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[12],$21C66842)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[ 9],$F6E96C9A)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[ 1],$670C9C61)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[29],$ABD388F0)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[ 5],$6A51A0D2)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[15],$D8542F68)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$960FA728)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[10],$AB5133A3)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[16],$6EEF0B6C)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[13],$137A3BE4)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[27],$BA3BF050)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 3],$7EFB2A98)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$A1F1651D)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[26],$39AF0176)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$66CA593E)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[11],$82430E88)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[20],$8CEE8619)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[29],$456F9FB4)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$7D84A5C3)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 0],$3B8B5EBE)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[12],$E06F75D8)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[ 7],$85C12073)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[ 3],$401A449F)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 8],$56C16AA6)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[31],$4ED3AA62)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[10],$363F7706)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[ 5],$1BFEDF72)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9],$429B023D)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[14],$37D0D724)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[30],$D00A1248)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[18],$DB0FEAD3)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 6],$49F1C09B)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[28],$075372C9)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[24],$80991B7B)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,t[ 2],$25D479D8)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[23],$F6E8DEF7)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[16],$E3FE501A)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[22],$B6794C3B)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[ 4],$976CE0BD)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 1],$04C006BA)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[25],$C1A94FB6)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[15],$409F60C4)
& nbsp & nbsp & nbsp inc(ctx.hash[0],t0)
& nbsp & nbsp & nbsp inc(ctx.hash[1],t1)
& nbsp & nbsp & nbsp inc(ctx.hash[2],t2)
& nbsp & nbsp & nbsp inc(ctx.hash[3],t3)
& nbsp & nbsp & nbsp inc(ctx.hash[4],t4)
& nbsp & nbsp & nbsp inc(ctx.hash[5],t5)
& nbsp & nbsp & nbsp inc(ctx.hash[6],t6)
& nbsp & nbsp & nbsp inc(ctx.hash[7],t7)
& nbsp & nbsp & nbsp fillchar(w,sizeof(w),0)
& nbsp & nbsp & nbsp ctx.índice:=0
& nbsp & nbsp & nbsp fillchar(ctx.hashbuffer,sizeof(ctx.hashbuffer),0)
fin
procedimiento HavalUpdateLen(ctx:THaval_CTX len:longword)
begin
& nbsp & nbsp & nbsp inc(ctx.lenlo,(len shl 3))
& nbsp & nbsp & nbsp si ctx.lenlo<(len shl 3), a continuación, inc(ctx.lenhi)
& nbsp & nbsp & nbsp inc(ctx.lenhi,len shr 29)
fin
procedimiento HavalFlush(ctx:THaval_CTX)
begin
& nbsp & nbsp & nbsp ctx.lenhi:=0
& nbsp & nbsp & nbsp ctx.lenlo:=0
& nbsp & nbsp & nbsp ctx.índice:=0
& nbsp & nbsp & nbsp fillchar(ctx.hashbuffer,sizeof(ctx.hashbuffer),0)
& nbsp & nbsp & nbsp fillchar(ctx.hash,sizeof(ctx.hash),0)
fin
procedimiento HavalInit(ctx:THaval_CTX)
begin
& nbsp & nbsp & nbsp HavalFlush(ctx)
& nbsp & nbsp & nbsp ctx.hash[0]:=$243F6A88
& nbsp & nbsp & nbsp ctx.hash[1]:=$85A308D3
& nbsp & nbsp & nbsp ctx.hash[2]:=$13198A2E
& nbsp & nbsp & nbsp ctx.hash[3]:=$03707344
& nbsp & nbsp & nbsp ctx.hash[4]:=$A4093822
& nbsp & nbsp & nbsp ctx.hash[5]:=$299F31D0
& nbsp & nbsp & nbsp ctx.hash[6]:=$082EFA98
& nbsp & nbsp & nbsp ctx.hash[7]:=$EC4E6C89
fin
procedimiento HavalUpdate(ctx:THaval_CTX const Tamaño de Búfer: longint)
var p:^byte
begin
& nbsp & nbsp & nbsp HavalUpdateLen(ctx,tamaño)
& nbsp & nbsp & nbsp p:=@buffer
& nbsp & nbsp & nbsp mientras que el tamaño>0
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si(sizeof(ctx.hashbuffer)-ctx.índice)<=palabra larga(tamaño), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mover(p^,ctx.hashbuffer[ctx.índice],sizeof(ctx.hashbuffer)-ctx.índice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp dic(tamaño,sizeof(ctx.hashbuffer)-ctx.índice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(p,sizeof(ctx.hashbuffer)-ctx.índice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HavalCompress(ctx)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mover(p^,ctx.hashbuffer[ctx.índice],tamaño)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(ctx.índice,tamaño)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp tamaño:=0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp final
fin
procedimiento HavalFinal(ctx:THaval_CTX var digerir)
begin
& nbsp & nbsp & nbsp ctx.hashbuffer[ctx.índice]:=$80
& nbsp & nbsp & nbsp si ctx.índice>118, a continuación, HavalCompress(ctx)
& nbsp & nbsp & nbsp ctx.hashbuffer[118]:=((HASH_SIZE y 3)shl 6)o(5 shl 3)o 1
& nbsp & nbsp & nbsp ctx.hashbuffer[119]:=(HASH_SIZE shr 2)y $FF
& nbsp & nbsp & nbsp mover(ctx.lenlo,ctx.hashbuffer[120],sizeof(ctx.lenlo))
& nbsp & nbsp & nbsp mover(ctx.lenhi,ctx.hashbuffer[124],sizeof(ctx.lenhi))
& nbsp & nbsp & nbsp HavalCompress(ctx)
& nbsp & nbsp & nbsp mover(ctx.hash,digerir,HASH_SIZE div 8)
& nbsp & nbsp & nbsp HavalFlush(ctx)
fin
//******************************************************************************
// PRNG
//******************************************************************************
procedimiento PrngInit(ctx:TPrng_CTX semilla:longword)
var i:byte
begin
& nbsp & nbsp & nbsp ctx.x1:=(semilla PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x2:=ctx.x1 mod PrngM2
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x3:=ctx.x1 mod PrngM3
& nbsp & nbsp & nbsp for i:=1 a 97
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.x2:=(ctx.x2*PrngI2 PrngC2)mod PrngM2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.r[i]:=(ctx.x1 ctx.x2/PrngM2)/PrngM1
& nbsp & nbsp & nbsp final
fin
función Prng(ctx:TPrng_CTX):longword
var i:longword
begin
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x2:=(ctx.x2*PrngI2 PrngC2)mod PrngM2
& nbsp & nbsp & nbsp ctx.x3:=(ctx.x3*PrngI3 PrngC3)mod PrngM3
& nbsp & nbsp & nbsp i:=1 (97*ctx.x3)div PrngM3
& nbsp & nbsp & nbsp Prng:=trunc($FFFFFFFF*ctx.r[i])
& nbsp & nbsp & nbsp ctx.r[i]:=(ctx.x1 ctx.x2/PrngM2)/PrngM1
fin
procedimiento PrngFlush(ctx:TPrng_CTX)
var i:byte
begin
& nbsp & nbsp & nbsp ctx.x1:=0
& nbsp & nbsp & nbsp ctx.x2:=0
& nbsp & nbsp & nbsp ctx.x3:=0
& nbsp & nbsp & nbsp for i:=1 a 97 ctx.r[i]:=0
fin
//******************************************************************************
// Rutinas Clave
//******************************************************************************
procedimiento MutateKey(var key:key256)
var i:byte
& nbsp & nbsp & nbsp & nbsp exp_key:array[0..1,0..7]de larga
& nbsp & nbsp & nbsp & nbsp ran_ctx:Prng_CTX
& nbsp & nbsp & nbsp & nbsp hash_ctx:Haval_CTX
& nbsp & nbsp & nbsp & nbsp temp_key:key256
begin
// *** [1]tecla de alimentación de 8 semillas en PRNG para generar 16 anhela
& nbsp & nbsp & nbsp for i:=0 to 7
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngInit(@ran_ctx,clave[i]) //el uso de la clave de semillas de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp exp_key[0,i]:=Prng(@ran_ctx) //expandir clave
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp exp_key[1,i]:=no Prng(@ran_ctx) //niega a reducir PRNG relación
& nbsp & nbsp & nbsp final
// *** [2]de alimentación [1] como de 64 bytes en SHA256
& nbsp & nbsp & nbsp for i:=0 a 7 ¿temp_key[i]:=a[i]
& nbsp & nbsp & nbsp HavalInit(@hash_ctx)
& nbsp & nbsp & nbsp HavalUpdate(@hash_ctx,exp_key[0][0],64) //alimentación ampliado clave como los datos
& nbsp & nbsp & nbsp HavalFinal(@hash_ctx,clave)
// *** [3]xor(^) [2] y [1] para producir la clave final
& nbsp & nbsp & nbsp for i:=0 to 7 ¿la tecla[i]:=tecla[i]xor temp_key[i] //reducir HASH r lationship
fin
función PasswordToKey(pass:string):key256
var i,j:integer
& nbsp & nbsp & nbsp & nbsp temp_chars:array[0..42]de bytes
& nbsp & nbsp & nbsp & nbsp key_size:byte
& nbsp & nbsp & nbsp & nbsp temp_key:array[0..31]de bytes
& nbsp & nbsp & nbsp & nbsp temp_pos:byte
& nbsp & nbsp & nbsp & nbsp bit_pos:byte
begin
// *** [1]convertir Caracteres de 8 bits para 6bit bytes
& nbsp & nbsp & nbsp for i:=1 to length(pass)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso de bytes(pass[i]) de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 97..122:temp_chars[i]:=byte(pass[i])-97 //si..z asignar 0-25
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 65..90 :temp_chars[i]:=byte(pass[i])-39 //si..Z asignar 26-51
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 48..57 :temp_chars[i]:=byte(pass[i]) 4 //si es 0..9 asignar 52-61
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp byte('.'):temp_chars[i]:=62 //si . asignar 62
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp byte('_'):temp_chars[i]:=63 //si _ asignar 63
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp key_size:=(longitud(pass
De 256 bits de las claves para el cifrado fuerte
De 256 bits de las claves para el cifrado fuerte : Multi-millones de consejos para hacer su vida mas facil.
las Tecnicas para la identificacion de las claves que resistir los ataques de fuerza bruta y ataques de diccionario. Incluye Delphi fuente para el analisis de las teclas, la conversion de las frases de paso a las teclas y permuting teclas.
[256 bits de las Claves Para el Cifrado Fuerte]
// codigo fuente en la parte inferior
La seguridad de cualquier buen sistema de criptografia se basa en la clave. No importa cuan grande sea la clave, habra un imponente disminucion en la seguridad si es mal utilizado por el software. Las claves deben ser medidos de acuerdo a los bits de entropia contenida dentro de ellos, y una simple llave debe ser desestimado. Que debe contener muchos personajes diferentes, y no tienen patrones discernibles. Solo cuando se cumplen estas condiciones sera una clave soportar diccionario y ataques de fuerza bruta.
Una clave de la entropia mide la cantidad de impredecible bits.
teniendo en cuenta los usuarios suelen utilizar solo caracteres alfanumericos, solo se debe utilizar el minimo numero de bits posible representar la clave. Utilizando 8 bits por caracter, significa que hay 256 caracteres diferentes disponibles. Un atacante sabe que el usuario va a utilizar solo caracteres alfanumericos (62 caracteres, 6 bits), y no se molestan en realizar pruebas para la 194 otros personajes. Una practica tecnica es convertir cada caracter (1 byte) en un 6bit numero, y la concatenacion, a continuacion, uno al lado del otro. Usted podria permitir que solo letras minusculas y un par de numeros y reducir cada personaje 5bits (32 caracteres). Es importante exigir al usuario el uso de las contraseñas que son mayores para lograr el mismo tamaño de la clave. Con esto, dijo, un 8 tecla de caracter no debe ser considerada como de 64bits, pero en realidad 48bits (6bits x 8 caracteres). Teclas con baja entropia suponen una amenaza para la seguridad que no importa lo bien diseñado que el resto del sistema esta diseñado.
Corto, de una sola palabra claves no deben ser tolerados dentro de un criptosistema. Incluso si usted optimizar la entropia, no hay datos clave en un 5 tecla de caracter para resistir un ataque de fuerza bruta. Un 30bit clave (6bits x 5 caracteres) solo permite la posibilidad de unos mil millones de claves, que solo toma un par de horas de escape en un ordenador potente. Una clave de al menos 128bits debe ser un requisito para sesitive de datos de esta manera se garantiza un lapso de un par de años antes de que surge la necesidad de una nueva y mas clave. En 6bits por caracter esto significa que la clave debe ser de 22 o mas caracteres de longitud. Esto puede parecer grande, pero nada le impide el uso de frases. Como ejemplo veamos la frase 'El Ascensor que Estaba Pasando', es de 25 caracteres. La clave es de 150 bits de largo, pero aun asi facil de recordar. Todas las claves deben ser tratados de esta manera. No hay excusa para permitir a un usuario el uso de 8 caracteres de la clave y poner en peligro todo el sistema de criptografia.
Una clave que proporciona una mejor resistencia en contra de las busquedas algoritmicas cuando contiene muchos personajes diferentes. Si la clave es de 22 caracteres de largo, pero solo contiene 4 personajes diferentes, entonces es muy debil. Para mantener las cosas simples, al menos la mitad de los personajes en una clave debe ser diferente (22 de caracteres de la clave debe tener al menos 11 personajes diferentes). Mas personajes diferentes en una clave que hacen que sea mas dificil de predecir estadisticamente el siguiente caracter. Aunque este tipo de ataque es raro, no hay margen para el error. La prevencion de todos los tipos conocidos de ataques y prevision de las infracciones antes de-la-mano es de absoluta-que es mas importante, no importa lo insignificante que un riesgo pueda parecer. Un riesgo es siempre un riesgo. Es importante animar a los usuarios a tener la mayoria de personajes diferentes que pueden recordar en cada una de las claves para hacer busquedas algoritmicas rendimiento sin resultados.
los Atacantes amor patrones, para facilitar las busquedas y su vida mucho mas facil. Parece ser que los usuarios piensan que las claves como: 'bingobingo' son mas seguros que aquellos como: 'bingo', pero el hecho es que son solo un poco mejor. Smart atacantes saben todos los trucos de los usuarios diseñar para hacer sus claves mas dificil de adivinar. El uso de una palabra dos veces debe ser fuertemente desaconsejado. A menudo los usuarios agregar numeros al final de la clave, para que sea menos predecible. Lamentablemente el 80% del tiempo el numero 123, y el otro 20% es de 321. Por un atacante para probar estas teclas adicionales, tambien debe probar con 123 añadido a cada clave, asi como 321. Esto significa que el tiene que buscar 3 veces la cantidad de teclas, esto solo representa un 1.5 bits aumentar en lugar de la 18bits 3 caracteres que deben ofrecer. Probando las llaves de patrones puede ser muy complejo obstaculo, y no seran discutidos en este documento. Despues de patrones obvios han sido desautorizada es aconsejable pasar la clave a traves de una sola manera, la funcion de hash como el SHA o HAVAL. Estas funciones se llevan una entrada de datos y crear una que no tiene solucionable relacion a la entrada de cada posible entrada solo hay una salida. La salida de estas funciones de hash es aparentemente al azar y efectivamente disfraz cualquiera de los modelos discretos.
la Eliminacion de patrones hace que sea muy dificil para un atacante
la busqueda de las llaves debiles.
/ / ***** NOTAS:
La fuente de abajo es parte de una biblioteca en el progreso cummulating 3 años de investigacion. Esto pretende ser un ejemplo, pero si quieres usarlo en un programa, un poco de credito seria bueno.
Estas rutinas clave que han sido optimizados y re-escrito una docena de veces, he tratado de comentar lo mejor que pude. El procedimiento de estructuras puede parecer extraño, porque yo originalmente escrito en C . El pseudo random number generator proviene de una fuente desconocida, y esta aplicacion de haval es un [grave] modificacion de David Barton haval.pas se encuentra en la DCPcrypt 1.3 componente de la suite. He utilizado el contexto de la encapsulacion de modo que los procedimientos no tienen que ser instanciado en un entorno multiproceso (servidor tal vez?).
Descripcion:
[MutateKey]
se Transforma de una clave a otra mediante la expansion y la compresion. No hay claves anteriores puede ser determinado por la clave actual, sino de todas las claves de exito puede ser. Esto es util para agregar la entropia a una tecla (por lo que no hay atajos bruta busquedas) o por las sesiones a las que puede necesitar el uso de multiples sesiones teclas.
[PasswordToKey]
Convierte una cadena con 64 caracteres posibles: 'a'-'z', 'A'-'Z', '0'-'9', '_' y '.' en una de 256 bits dejando los 2 bits de cada caracter (64 caracteres solo se necesita 6bits para representar a cada uno, en lugar de 8bits para 256 caracteres) y, a continuacion, utiliza MutateKey para aumentar la entropia.
[AnanlyzeKey]
Examina una clave de la entropia mediante la busqueda de patrones, contar los bits por caracter, evaluacion 0/1 (binario) de distribucion, y se deriva un examen de calificacion de la clave se mide en bits de longitud.
(un completo ejemplo de esto se puede encontrar en http://www.geocities.com/drmungkee/software/codebase.html)
//******************* la UNIDAD COMIENZA AQUI ****************************************
unidad de keyfunc
interfaz
tipo
& nbsp & nbsp & nbsp key256=array[0..7]de larga
& nbsp & nbsp & nbsp Prng_CTX=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp r:array[1..97]de real
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x1,x2,x3:longword
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp TPrng_CTX=^Prng_CTX
& nbsp & nbsp & nbsp Haval_CTX=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lenhi,lenlo:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Indice:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hash:array[0..7]de larga
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp hashbuffer:array[0..127]de bytes
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp THaval_CTX=^Haval_CTX
& nbsp & nbsp & nbsp KeyStatistics=record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KeyLength:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KeySize:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CharCount:bytes
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CharBits:byte
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Patrones:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Diferencial:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BruteLength:longword
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Rating:longword
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp TKeyStatistics=^KeyStatistics
procedimiento MutateKey(var key:key256)
funcion PasswordToKey(pass:string):key256
funcion AnalyzePassword(pass:string):KeyStatistics
aplicacion
const BIT_MASK:array[0..7]of byte = (1,2,4,8,16,32,64,128)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HASH_SIZE=256
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM1:longword=259200
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI1:longword=7141
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC1:longword=54773
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM2:longword=134456
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI2:longword=8121
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC2:longword=28411
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngM3:longword=243000
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngI3:longword=4561
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngC3:longword=51349
//*******************************************************************
// Haval
//
// Derivados de David Barton haval.pas (DCPcrypt 1.3 componente suite)
//
//*******************************************************************
procedimiento HavalCompress(ctx:THaval_CTX)
& nbsp & nbsp & nbsp funcion rr32(x:longword c:longint):longword registro ensamblador
& nbsp & nbsp & nbsp asm
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mov ecx,edx
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ror eax,cl
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r1(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=((x2)y((x6)xor(x1))xor(x5)y(x4)xor(x0)y(x3)xor(x6))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r2(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x3 y(x4, y(no se x0)xor x1 y x2 xor x6 xor x5)xor x1 y(x4 xor x2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor x0 y x2 xor x5)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r3(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=((x4)y((x1)y(x3)xor(x2)xor(x5))xor(x1)y(x0)xor(x3)y(x6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor(x5))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r4(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x3 y(x5 y(no se x0)xor x2 y(no x1)xor x4 xor x1 xor x6)xor x2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y(x4 y x0 xor x5 xor x1)xor x0 y x1 xor x6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp procedimiento r5(var x7,x6,x5,x4,x3,x2,x1,x0:longword const w,c:longword)
& nbsp & nbsp & nbsp var t:longword
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp t:=(x1, y(x3 y x4 y x6 xor(no x5))xor x3 y x0 xor x4 y x5
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xor x6 y x2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp x7:=rr32(t,7) rr32(x7,11) w c
& nbsp & nbsp & nbsp final
var t7,t6,t5,t4,t3,t2,t1,t0:longword
& nbsp & nbsp & nbsp & nbsp w:array[0..31] de larga
begin
& nbsp & nbsp & nbsp t0:=ctx.hash[0]
& nbsp & nbsp & nbsp t1:=ctx.hash[1]
& nbsp & nbsp & nbsp t2:=ctx.hash[2]
& nbsp & nbsp & nbsp t3:=ctx.hash[3]
& nbsp & nbsp & nbsp t4:=ctx.hash[4]
& nbsp & nbsp & nbsp t5:=ctx.hash[5]
& nbsp & nbsp & nbsp t6:=ctx.hash[6]
& nbsp & nbsp & nbsp t7:=ctx.hash[7]
& nbsp & nbsp & nbsp mover(ctx.hashbuffer,w,sizeof(w))
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[ 0])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[ 1])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[ 2])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[ 3])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[ 4])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[ 5])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[ 6])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[ 7])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[ 8])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[10])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[11])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[12])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[13])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[14])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[15])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[16])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[17])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[18])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[19])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[20])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[21])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[22])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[23])
& nbsp & nbsp & nbsp r1(t7,t6,t5,t4,t3,t2,t1,t0,w[24])
& nbsp & nbsp & nbsp r1(t6,t5,t4,t3,t2,t1,t0,t7,w[25])
& nbsp & nbsp & nbsp r1(t5,t4,t3,t2,t1,t0,t7,t6,w[26])
& nbsp & nbsp & nbsp r1(t4,t3,t2,t1,t0,t7,t6,t5,w[27])
& nbsp & nbsp & nbsp r1(t3,t2,t1,t0,t7,t6,t5,t4,w[28])
& nbsp & nbsp & nbsp r1(t2,t1,t0,t7,t6,t5,t4,t3,w[29])
& nbsp & nbsp & nbsp r1(t1,t0,t7,t6,t5,t4,t3,t2,w[30])
& nbsp & nbsp & nbsp r1(t0,t7,t6,t5,t4,t3,t2,t1,w[31])
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[ 5],$452821E6)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[14],$38D01377)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[26],$BE5466CF)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[18],$34E90C6C)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[11],$C0AC29B7)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[28],$C97C50DD)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[ 7],$3F84D5B5)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[16],$B5470917)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[ 0],$9216D5D9)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[23],$8979FB1B)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[20],$D1310BA6)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[22],$98DFB5AC)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[ 1],$2FFD72DB)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[10],$D01ADFB7)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[ 4],$B8E1AFED)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[ 8],$6A267E96)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[30],$BA7C9045)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[ 3],$F12C7F99)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$24A19947)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[ 9],$B3916CF7)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$0801F2E2)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[24],$858EFC16)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[29],$636920D8)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[ 6],$71574E69)
& nbsp & nbsp & nbsp r2(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$A458FEA3)
& nbsp & nbsp & nbsp r2(t6,t5,t4,t3,t2,t1,t0,t7,w[12],$F4933D7E)
& nbsp & nbsp & nbsp r2(t5,t4,t3,t2,t1,t0,t7,t6,w[15],$0D95748F)
& nbsp & nbsp & nbsp r2(t4,t3,t2,t1,t0,t7,t6,t5,w[13],$728EB658)
& nbsp & nbsp & nbsp r2(t3,t2,t1,t0,t7,t6,t5,t4,w[ 2],$718BCD58)
& nbsp & nbsp & nbsp r2(t2,t1,t0,t7,t6,t5,t4,t3,w[25],$82154AEE)
& nbsp & nbsp & nbsp r2(t1,t0,t7,t6,t5,t4,t3,t2,w[31],$7B54A41D)
& nbsp & nbsp & nbsp r2(t0,t7,t6,t5,t4,t3,t2,t1,w[27],$C25A59B5)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$9C30D539)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9],$2AF26013)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[ 4],$C5D1B023)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[20],$286085F0)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[28],$CA417918)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[17],$B8DB38EF)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[ 8],$8E79DCB0)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[22],$603A180E)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[29],$6C9E0E8B)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[14],$B01E8A3E)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[25],$D71577C1)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[12],$BD314B27)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[24],$78AF2FDA)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[30],$55605C60)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[16],$E65525F3)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[26],$AA55AB94)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[31],$57489862)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[15],$63E81440)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[ 7],$55CA396A)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[ 3],$2AAB10B6)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[ 1],$B4CC5C34)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[ 0],$1141E8CE)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[18],$A15486AF)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[27],$7C72E993)
& nbsp & nbsp & nbsp r3(t7,t6,t5,t4,t3,t2,t1,t0,w[13],$B3EE1411)
& nbsp & nbsp & nbsp r3(t6,t5,t4,t3,t2,t1,t0,t7,w[ 6],$636FBC2A)
& nbsp & nbsp & nbsp r3(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$2BA9C55D)
& nbsp & nbsp & nbsp r3(t4,t3,t2,t1,t0,t7,t6,t5,w[10],$741831F6)
& nbsp & nbsp & nbsp r3(t3,t2,t1,t0,t7,t6,t5,t4,w[23],$CE5C3E16)
& nbsp & nbsp & nbsp r3(t2,t1,t0,t7,t6,t5,t4,t3,w[11],$9B87931E)
& nbsp & nbsp & nbsp r3(t1,t0,t7,t6,t5,t4,t3,t2,w[ 5],$AFD6BA33)
& nbsp & nbsp & nbsp r3(t0,t7,t6,t5,t4,t3,t2,t1,w[ 2],$6C24CF5C)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[24],$7A325381)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[ 4],$28958677)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[ 0],$3B8F4898)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[14],$6B4BB9AF)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[ 2],$C4BFE81B)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[ 7],$66282193)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[28],$61D809CC)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[23],$FB21A991)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[26],$487CAC60)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[ 6],$5DEC8032)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[30],$EF845D5D)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[20],$E98575B1)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[18],$DC262302)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[25],$EB651B88)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[19],$23893E81)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[ 3],$D396ACC5)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[22],$0F6D6FF3)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[11],$83F44239)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[31],$2E0B4482)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[21],$A4842004)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[ 8],$69C8F04A)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[27],$9E1F9B5E)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[12],$21C66842)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[ 9],$F6E96C9A)
& nbsp & nbsp & nbsp r4(t7,t6,t5,t4,t3,t2,t1,t0,w[ 1],$670C9C61)
& nbsp & nbsp & nbsp r4(t6,t5,t4,t3,t2,t1,t0,t7,w[29],$ABD388F0)
& nbsp & nbsp & nbsp r4(t5,t4,t3,t2,t1,t0,t7,t6,w[ 5],$6A51A0D2)
& nbsp & nbsp & nbsp r4(t4,t3,t2,t1,t0,t7,t6,t5,w[15],$D8542F68)
& nbsp & nbsp & nbsp r4(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$960FA728)
& nbsp & nbsp & nbsp r4(t2,t1,t0,t7,t6,t5,t4,t3,w[10],$AB5133A3)
& nbsp & nbsp & nbsp r4(t1,t0,t7,t6,t5,t4,t3,t2,w[16],$6EEF0B6C)
& nbsp & nbsp & nbsp r4(t0,t7,t6,t5,t4,t3,t2,t1,w[13],$137A3BE4)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[27],$BA3BF050)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 3],$7EFB2A98)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[21],$A1F1651D)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[26],$39AF0176)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[17],$66CA593E)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[11],$82430E88)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[20],$8CEE8619)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[29],$456F9FB4)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[19],$7D84A5C3)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 0],$3B8B5EBE)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[12],$E06F75D8)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[ 7],$85C12073)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[ 3],$401A449F)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 8],$56C16AA6)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[31],$4ED3AA62)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[10],$363F7706)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,w[ 5],$1BFEDF72)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[ 9],$429B023D)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[14],$37D0D724)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[30],$D00A1248)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[18],$DB0FEAD3)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 6],$49F1C09B)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[28],$075372C9)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[24],$80991B7B)
& nbsp & nbsp & nbsp r5(t7,t6,t5,t4,t3,t2,t1,t0,t[ 2],$25D479D8)
& nbsp & nbsp & nbsp r5(t6,t5,t4,t3,t2,t1,t0,t7,w[23],$F6E8DEF7)
& nbsp & nbsp & nbsp r5(t5,t4,t3,t2,t1,t0,t7,t6,w[16],$E3FE501A)
& nbsp & nbsp & nbsp r5(t4,t3,t2,t1,t0,t7,t6,t5,w[22],$B6794C3B)
& nbsp & nbsp & nbsp r5(t3,t2,t1,t0,t7,t6,t5,t4,w[ 4],$976CE0BD)
& nbsp & nbsp & nbsp r5(t2,t1,t0,t7,t6,t5,t4,t3,w[ 1],$04C006BA)
& nbsp & nbsp & nbsp r5(t1,t0,t7,t6,t5,t4,t3,t2,w[25],$C1A94FB6)
& nbsp & nbsp & nbsp r5(t0,t7,t6,t5,t4,t3,t2,t1,w[15],$409F60C4)
& nbsp & nbsp & nbsp inc(ctx.hash[0],t0)
& nbsp & nbsp & nbsp inc(ctx.hash[1],t1)
& nbsp & nbsp & nbsp inc(ctx.hash[2],t2)
& nbsp & nbsp & nbsp inc(ctx.hash[3],t3)
& nbsp & nbsp & nbsp inc(ctx.hash[4],t4)
& nbsp & nbsp & nbsp inc(ctx.hash[5],t5)
& nbsp & nbsp & nbsp inc(ctx.hash[6],t6)
& nbsp & nbsp & nbsp inc(ctx.hash[7],t7)
& nbsp & nbsp & nbsp fillchar(w,sizeof(w),0)
& nbsp & nbsp & nbsp ctx.indice:=0
& nbsp & nbsp & nbsp fillchar(ctx.hashbuffer,sizeof(ctx.hashbuffer),0)
fin
procedimiento HavalUpdateLen(ctx:THaval_CTX len:longword)
begin
& nbsp & nbsp & nbsp inc(ctx.lenlo,(len shl 3))
& nbsp & nbsp & nbsp si ctx.lenlo<(len shl 3), a continuacion, inc(ctx.lenhi)
& nbsp & nbsp & nbsp inc(ctx.lenhi,len shr 29)
fin
procedimiento HavalFlush(ctx:THaval_CTX)
begin
& nbsp & nbsp & nbsp ctx.lenhi:=0
& nbsp & nbsp & nbsp ctx.lenlo:=0
& nbsp & nbsp & nbsp ctx.indice:=0
& nbsp & nbsp & nbsp fillchar(ctx.hashbuffer,sizeof(ctx.hashbuffer),0)
& nbsp & nbsp & nbsp fillchar(ctx.hash,sizeof(ctx.hash),0)
fin
procedimiento HavalInit(ctx:THaval_CTX)
begin
& nbsp & nbsp & nbsp HavalFlush(ctx)
& nbsp & nbsp & nbsp ctx.hash[0]:=$243F6A88
& nbsp & nbsp & nbsp ctx.hash[1]:=$85A308D3
& nbsp & nbsp & nbsp ctx.hash[2]:=$13198A2E
& nbsp & nbsp & nbsp ctx.hash[3]:=$03707344
& nbsp & nbsp & nbsp ctx.hash[4]:=$A4093822
& nbsp & nbsp & nbsp ctx.hash[5]:=$299F31D0
& nbsp & nbsp & nbsp ctx.hash[6]:=$082EFA98
& nbsp & nbsp & nbsp ctx.hash[7]:=$EC4E6C89
fin
procedimiento HavalUpdate(ctx:THaval_CTX const Tamaño de Bufer: longint)
var p:^byte
begin
& nbsp & nbsp & nbsp HavalUpdateLen(ctx,tamaño)
& nbsp & nbsp & nbsp p:=@buffer
& nbsp & nbsp & nbsp mientras que el tamaño>0
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si(sizeof(ctx.hashbuffer)-ctx.indice)<=palabra larga(tamaño), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mover(p^,ctx.hashbuffer[ctx.indice],sizeof(ctx.hashbuffer)-ctx.indice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp dic(tamaño,sizeof(ctx.hashbuffer)-ctx.indice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(p,sizeof(ctx.hashbuffer)-ctx.indice)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HavalCompress(ctx)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mover(p^,ctx.hashbuffer[ctx.indice],tamaño)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(ctx.indice,tamaño)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp tamaño:=0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp final
fin
procedimiento HavalFinal(ctx:THaval_CTX var digerir)
begin
& nbsp & nbsp & nbsp ctx.hashbuffer[ctx.indice]:=$80
& nbsp & nbsp & nbsp si ctx.indice>118, a continuacion, HavalCompress(ctx)
& nbsp & nbsp & nbsp ctx.hashbuffer[118]:=((HASH_SIZE y 3)shl 6)o(5 shl 3)o 1
& nbsp & nbsp & nbsp ctx.hashbuffer[119]:=(HASH_SIZE shr 2)y $FF
& nbsp & nbsp & nbsp mover(ctx.lenlo,ctx.hashbuffer[120],sizeof(ctx.lenlo))
& nbsp & nbsp & nbsp mover(ctx.lenhi,ctx.hashbuffer[124],sizeof(ctx.lenhi))
& nbsp & nbsp & nbsp HavalCompress(ctx)
& nbsp & nbsp & nbsp mover(ctx.hash,digerir,HASH_SIZE div 8)
& nbsp & nbsp & nbsp HavalFlush(ctx)
fin
//******************************************************************************
// PRNG
//******************************************************************************
procedimiento PrngInit(ctx:TPrng_CTX semilla:longword)
var i:byte
begin
& nbsp & nbsp & nbsp ctx.x1:=(semilla PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x2:=ctx.x1 mod PrngM2
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x3:=ctx.x1 mod PrngM3
& nbsp & nbsp & nbsp for i:=1 a 97
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.x2:=(ctx.x2*PrngI2 PrngC2)mod PrngM2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ctx.r[i]:=(ctx.x1 ctx.x2/PrngM2)/PrngM1
& nbsp & nbsp & nbsp final
fin
funcion Prng(ctx:TPrng_CTX):longword
var i:longword
begin
& nbsp & nbsp & nbsp ctx.x1:=(ctx.x1*PrngI1 PrngC1)mod PrngM1
& nbsp & nbsp & nbsp ctx.x2:=(ctx.x2*PrngI2 PrngC2)mod PrngM2
& nbsp & nbsp & nbsp ctx.x3:=(ctx.x3*PrngI3 PrngC3)mod PrngM3
& nbsp & nbsp & nbsp i:=1 (97*ctx.x3)div PrngM3
& nbsp & nbsp & nbsp Prng:=trunc($FFFFFFFF*ctx.r[i])
& nbsp & nbsp & nbsp ctx.r[i]:=(ctx.x1 ctx.x2/PrngM2)/PrngM1
fin
procedimiento PrngFlush(ctx:TPrng_CTX)
var i:byte
begin
& nbsp & nbsp & nbsp ctx.x1:=0
& nbsp & nbsp & nbsp ctx.x2:=0
& nbsp & nbsp & nbsp ctx.x3:=0
& nbsp & nbsp & nbsp for i:=1 a 97 ctx.r[i]:=0
fin
//******************************************************************************
// Rutinas Clave
//******************************************************************************
procedimiento MutateKey(var key:key256)
var i:byte
& nbsp & nbsp & nbsp & nbsp exp_key:array[0..1,0..7]de larga
& nbsp & nbsp & nbsp & nbsp ran_ctx:Prng_CTX
& nbsp & nbsp & nbsp & nbsp hash_ctx:Haval_CTX
& nbsp & nbsp & nbsp & nbsp temp_key:key256
begin
// *** [1]tecla de alimentacion de 8 semillas en PRNG para generar 16 anhela
& nbsp & nbsp & nbsp for i:=0 to 7
& nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrngInit(@ran_ctx,clave[i]) //el uso de la clave de semillas de datos
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp exp_key[0,i]:=Prng(@ran_ctx) //expandir clave
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp exp_key[1,i]:=no Prng(@ran_ctx) //niega a reducir PRNG relacion
& nbsp & nbsp & nbsp final
// *** [2]de alimentacion [1] como de 64 bytes en SHA256
& nbsp & nbsp & nbsp for i:=0 a 7 ¿temp_key[i]:=a[i]
& nbsp & nbsp & nbsp HavalInit(@hash_ctx)
& nbsp & nbsp & nbsp HavalUpdate(@hash_ctx,exp_key[0][0],64) //alimentacion ampliado clave como los datos
& nbsp & nbsp & nbsp HavalFinal(@hash_ctx,clave)
// *** [3]xor(^) [2] y [1] para producir la clave final
& nbsp & nbsp & nbsp for i:=0 to 7 ¿la tecla[i]:=tecla[i]xor temp_key[i] //reducir HASH r lationship
fin
funcion PasswordToKey(pass:string):key256
var i,j:integer
& nbsp & nbsp & nbsp & nbsp temp_chars:array[0..42]de bytes
& nbsp & nbsp & nbsp & nbsp key_size:byte
& nbsp & nbsp & nbsp & nbsp temp_key:array[0..31]de bytes
& nbsp & nbsp & nbsp & nbsp temp_pos:byte
& nbsp & nbsp & nbsp & nbsp bit_pos:byte
begin
// *** [1]convertir Caracteres de 8 bits para 6bit bytes
& nbsp & nbsp & nbsp for i:=1 to length(pass)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso de bytes(pass[i]) de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 97..122:temp_chars[i]:=byte(pass[i])-97 //si..z asignar 0-25
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 65..90 :temp_chars[i]:=byte(pass[i])-39 //si..Z asignar 26-51
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 48..57 :temp_chars[i]:=byte(pass[i]) 4 //si es 0..9 asignar 52-61
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp byte('.'):temp_chars[i]:=62 //si . asignar 62
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp byte('_'):temp_chars[i]:=63 //si _ asignar 63
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp key_size:=(longitud(pass
De 256 bits de las claves para el cifrado fuerte
By Consejos Y Trucos
De 256 bits de las claves para el cifrado fuerte : Multi-millones de consejos para hacer su vida más fácil.