JC82: Algoritmo de cifrado (para passwords)

 

 

Leyendo el post de "camufling" -Nuevo método de cifrado- diseñé un algoritmo parecido para cifrar passwords (cifrado en una sola dirección), ya que en la empresa en la que trabajo no quieren utilizar ningun algoritmo comercial (ni gratuito).

Así que me dediqué a la tarea de desarrollar un algoritmo y funciona (ya es mucho decir de un egresado de sistemas que no vive en matemáticas :) ) más o menos, pero quiero compartir con la comunidad este código para todo aquel que le pueda servir. No me responsabilizo en ninguna forma de las consecuencias de utilizar este algoritmo; utilizénlo bajo su propio riesgo.

Aquí están los pasos:

1.- Obtener algunas propieades del texto
a=numero_vocales
c=numero_consonantes
sz=tamanhio_palabra

2.- Generamos la llave
ks=(a*sz)/1982 //key_size

3.- Con base en esto identificamos la columna a utilizar
columna= if (a mod 3 == 0){return 3;}elseif(a mod 2 ==0 ){return 2;}elseif(a mod 1 == 0){return 1;}

4.- Generar la tabla dinámica

|letra| 1 | 2 | 3 | x llave_generada |

A 31 33 37 x ks
B 51 53 57 x ks
C 61 63 67 x ks
D 71 73 77 x ks
E 91 93 97 x ks
F 111 113 117 x ks
G 131 133 137 x ks
H 141 143 147 x ks
I 151 153 157 x ks
J 161 163 167 x ks
K 171 173 177 x ks
L 191 193 197 x ks
M 231 233 237 x ks
N 251 253 357 x ks
Ñ 271 273 377 x ks
O 291 293 397 x ks
P 331 333 337 x ks
Q 351 353 357 x ks
R 361 363 367 x ks
S 371 373 377 x ks
T 381 383 387 x ks
U 391 393 397 x ks
V 431 433 437 x ks
W 441 443 447 x ks
X 451 453 457 x ks
Y 461 463 467 x ks
Z 471 473 477 x ks

5.- Reorganizamos el texto (los valores de las letras dependen de la "columna" seleccionada)

      E           j          e           m           p           l           o 
 r1=(91*ks) r2=(161*ks) r3=(91*ks) r4=(231*ks) r5=(331*ks) r6=(191*ks) r7=(291*ks)

6.- Generamos un nuevo alfabeto

	A=0
	B=1
	C=2
	D=3
	E=4
	F=5
	G=6
	H=7
	I=8
	J=9
	K=10
	L=11
	M=12
	N=13
	Ñ=14
	O=15
	P=16
	Q=17
	R=18
	S=19
	T=20
	U=21
	V=22
	W=23
	X=24
	Y=25
	Z=26

7.- Tomamos la parte izquierda del número (lo denominamos "e"); si es de tres cifras tomamos sólo las dos primeras apartir del punto, si ("e") esta cifra es mayor a 26 tomamos sólo la primera cifra. Obtenemos la letra del nuevo alfabeto a la cual pertenece "e".

Ejemplo 1:
	
	Este mensaje debe ser manejado como confidencial

	1.- Paso 1	
	$sz=48;
	$a=19;
	$z=23;

	2.- Paso 2
	if ((19 mod 3) == 0){return 3;} = 6.333
	elseif ((19 mod 2) == 0){return 2;} = 9.5
	elseif ((19 mod 1) == 0){return 1;} = 19
	columna=1;

	3.- Paso 3
	$ks=(48*19)/1982;  //Truncamos a 4 decimales
	$ks=0.4601;

	E=14.2631
	S=170.6971
	T=175.2938
	M=106.2831	//231*0.4601
	N=115.4851 	//251*0.4601
	J=74.0761 	//161*0.4601
	D=32.6671 	//71*0.4601
	B=23.465	//51*0.4601
	R=166.0961	//361*0.4601
	C=28.0661	//61*0.4601
	F=51.0711	//111*0.4601
	L=87.8791	//191*0.4601

	4.- Paso 7
	E=14.2631	->	14	->	Ñ
	S=170.6971	->	0	->	A

	T=175.2938	->	5	->	F
	M=106.2831	->	6	->	G
	N=115.4851	->	15	->	O
	J=74.0761 	->	4	->	E
	D=32.6671 	->	2	->	C
	B=23.465	->	23	->	W
	R=166.0961	->	6	->	G
	C=28.0661	->	8	->	I
	F=51.0711	->	1	->	B
	L=87.8791	->	7	->	H

	Este mensaje debe ser manejado como confidencial

	ñafñ gñoa-eñ cñwñ añg g-oñe-c- i-g- i-ob-cñoi--h

Me gustaria leer sus comentarios, críticas y demás; gracias por tomarse el tiempo de leer estas líneas.

Comentarios

Selecciona arriba tu forma preferida de visualizar los comentarios y pulsa el botón para guardar tu elección para próximas visitas (sólo si eres usuario registrado).
mlucena's picture

Es un método Monoalfabético?


Según me ha parecido entender, el algoritmo genera una transformación monoalfabética, pero incompleta. ¿Qué pasa con las letras "a", "i" y "o"?

En cualquier caso, si se emplea únicamente para cifrar contraseñas, quizás no tenga sentido hacer un análisis de frecuencias sobre el texto cifrado.

La verdad es que no entiendo el paso 2, pero parece que la transformación únicamente depende de los valores de a y sz, por lo que bastaría con calcular todas las posibles transformaciones e ir deshaciendo hasta encontrar el mensaje original.

No lo veo muy claro...

Dr Q's picture

Opinion sobre el metodo JC82


El agua perfora la roca

Hola en atencion a tu metodo de criptografia creo que (para cifrar mensajes) tiene una falla estructural basica que (creo) es la siguiente :

1)a cada palabra criptografiada le corresponde una unica letra sin importar la posicion de la misma en el texto..

2)ello lo hace (segun mi punto de vista ) vulnerable a un analisis de frecuencia estadistica ...por ejemplo la letra ñ es la codificacion (segun tu algoritmo) de la letra e y por tanto estudiando el % relativo de apariciones de la letra "ñ "(en el mensaje criptografiado)y observar que es similar al % de apariciones de la letra "e" en los textos escritos en español se puede deducir que dicha letra es el origen de la palabra criptografiada y asi sucesivamente hasta lograr descifrarlo totalmente

3) Si va a ser utilizado para encriptar un pasword se podria extraer del software a proteger la rutina de encriptacion hasta deducir que encripta palabra por palabra y pasar todas las letras del alfabeto por el ,obtener todo el alfabeto encriptado y usarlo para descifrar el pasword.

Si dije alguna tonteria sobre el tema disculpame...(soy nuevo en esto)

El agua perfora la roca

MrFrOsT's picture

Ops


Espero que no tengas demasiada confianza en ese método.
Siempre quenadie pueda acceder al código fuente del sistema empleado para encriptar o bien que no pued aacceder a las contraseñas encriptadas puede que pase... un tiepo.

Con el código fuente que das se puede romper a la inversa.
Con el mensaje cifrado, se puede ver que en vez de la "e" está la "ñ", en vez de la "a" hay una "-" etc. Conociendo nuestro idioma y las probabilidades de cada letra se rompe aun con mayor facilidad.

Tu pedías una opinión y te la he dado.

Ops!