Esta librería genera, comprueba, dibuja cuadrados mágicos y cifra ligeramente datos con un algoritmo basado en patrones de generación de cuadrados mágicos.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
20.txt
Cifrar.java
Comprobar.java
CuadradosMagicos.java
Descifrar.java
Dibujar.java
Generador.java
README.md
README.md.mscrypt
README.md.mscrypt2
README.md.msdecrypt
ShapesDemo2D.java
cifrado.txt
ciframe.txt
descifrado.txt
magico.txt
magico2.txt
password.txt
password2.txt
test.txt

README.md

CuadradosMagicos Aplicaciones prácticas

Se pretende lo mencionado en el título, y se me ha ocurrido hacer un algoritmo de cifrado basado en cuadrados mágicos múltiplos de 4.

Los archivos CuadradosMagicos.java y Cifrar.java tienen implementado todo lo necesario para cifrar archivos.

Lo malo de este cifrado es que hay una relación de tamaño entre la contraseña y el bloque de datos, y el bloque ha de ser de un tamaño comprendido su total como n^2. Por lo que se busca un tamaño que se acerque.

Las contraseñas pueden ser binarias, o en su representación hexadecimal. Pero solo está facilitado para contraseñas en texto.

Si un bloque ocupa 512 bytes, tiene 4096 bits, y estos bits pueden cifrarse de 256 bits veces posibles, siguiendo un patrón simétrico para generar cuadrados mágicos múltiplos de 4.

En este repositorio se incluye un ejemplo listo y una salida de consola que enseña cómo.

Ejemplo práctico de Cifrado

abels-MacBook-Pro:cuadrados_magicos aberope$ cat ciframe.txt
Esto es un test.

En teoría estoy a punto de conseguir cifrar este texto, y voy a guardar el resultado en cifrado.txt

Guardando... para ver el tamaño necesario :-\

Input data size is: 1456
Need at least 2640 bits more of data.

Hace falta mucho más texto... así que me enrollaré:

Los datos son bits de 0 a 1 que forman secuencias. Si numeramos de 1 a n bits, tenemos la secuencia necesaria para
disponer los numeros en un cuadrado magico. Luego genera un patrón.. y lo aplica. Si es 1 es inclusivo..
abels-MacBook-Pro:cuadrados_magicos aberope$ cat password.txt ; java Cifrar ciframe.txt cifrado.txt
CS5kGXPksEjZubrXCS5kGXPksEjZubrX
Contraseña:
Input data size is: 4096
Pwd size: 256 bits.
Binary pass: 01000011010100110011010101101011010001110101100001010000011010110111001101000101011010100101101001110101011000100111001001011000010000110101001100110101011010110100011101011000010100000110101101110011010001010110101001011010011101010110001001110010010110000001101001001110010001101010111001011010010101101010001011001110110101100000101000011010111000101101011010101100110010101100001000011010010011100100011010101110010110100101011010100010110011101101011000001010000110101110001011010110101011001100101011000010
Data size: 4096 bits.

Cifrado resultante

abels-MacBook-Pro:cuadrados_magicos aberope$ hexdump -C cifrado.txt
00000000  41 75 74 6f 66 07 57 26  74 e6 30 f4 64 ea e4 26  |Autof.W&t.0.d..&|
00000010  8a 02 cc e6 20 f4 ec 66  74 87 cf 07 26 07 17 14  |.... ..ft...&...|
00000020  ff 70 20 f8 24 70 74 76  5d 4b 46 26 04 06 05 6f  |.p .$ptv]KF&...o|
00000030  2e 15 07 47 34 6f 36 66  65 f0 e6 e2 e7 72 20 74  |...G4o6fe....r t|
00000040  72 56 f4 a0 14 27 60 f4  6f a4 46 3f a6 ee 4f 1d  |rV...'`.o.F?..O.|
00000050  36 e8 04 67 e7 60 56 66  48 36 b0 ec 64 04 ea f4  |6..g.`VfH6..d...|
00000060  32 14 6e e4 60 64 6f a8  f7 6e 40 06 67 e7 0a 0d  |2.n.`do..n@.g...|
00000070  e6 f6 48 06 ef ae 54 3e  74 02 8e d6 54 60 e6 ec  |..H...T>t...T`..|
00000080  47 2e 4c 0d 0e 2e 06 46  f0 f0 e6 70 a0 6e 65 72  |G.L....F...p.ner|
00000090  a8 6c fe 20 64 70 6d e0  85 95 06 26 2e 05 4a 67  |.l. dpm....&..Jg|
000000a0  32 e7 56 ef 26 a6 7e 2d  de 4a 02 60 ee 10 f4 54  |2.V.&.~-.J.`...T|
000000b0  36 24 e8 54 e7 48 62 60  12 f7 46 ff 72 2c 26 a7  |6$.T.Hb`..F.r,&.|
000000c0  a6 25 ae 02 ce 65 6c 04  20 20 14 a6 2c 04 47 65  |.%...el.  ..,.Ge|
000000d0  74 60 56 24 5c 70 26 e6  6f 64 ea 60 7b 79 72 4c  |t`V$\p&.od.`{yrL|
000000e0  b1 eb 66 a6 74 77 f6 67  6e 22 02 20 27 02 24 28  |..f.tw.gn". '.$(|
000000f0  06 00 25 55 47 00 04 74  72 7c ff 26 7c c7 27 65  |..%UG..tr|.&|.'e|
00000100  48 15 45 f0 14 66 06 a6  ae b6 65 17 47 3f a6 77  |H.E..f....e.G?.w|
00000110  65 e7 a6 0f 73 30 71 6c  12 2e 04 64 00 72 e2 20  |e...s0ql...d.r. |
00000120  ae 0a 62 24 6d ea 28 04  40 14 6d 65 68 55 6d 6e  |..b$m.(.@.mehUmn|
00000130  48 06 ef 76 12 26 e6 65  26 a0 20 60 30 28 28 38  |H..v.&.e&. `0((8|
00000140  1c 05 48 e6 06 14 24 77  fe a8 65 04 67 e4 67 06  |..H...$w..e.g.g.|
00000150  67 e8 67 72 ba 30 51 28  20 4c 14 ff 04 56 00 ef  |g.gr.0Q( L...V..|
00000160  2f e7 26 66 05 b6 15 42  e0 20 e6 28 62 20 e4 62  |/.&f...B. .(b .b|
00000170  2c 20 6c 64 e6 4c e4 6e  15 34 6c 65 66 67 67 07  |, ld.L.n.4lefgg.|
00000180  64 4c ee e7 e0 40 30 6e  07 67 64 72 27 e6 48 60  |dL...@0n.gdr'.H`|
00000190  06 e6 48 32 27 0c 64 20  62 70 6f ee 6c 32 a6 ee  |..H2'.d bpo.l2..|
000001a0  e6 6a 04 7e e4 64 47 e6  2f 57 a0 2c 6e 04 e4 06  |.j.~.dG./W.,n...|
000001b0  06 67 6c 00 06 14 70 64  6e 38 2f 67 66 e0 27 ef  |.gl...pdn8/gf.'.|
000001c0  a6 20 4c 14 6c 66 f6 40  05 47 0e e7 76 27 46 77  |. L.lf.@.G..v'Fw|
000001d0  6e 46 14 e7 36 14 e7 27  76 ae 2e 00 e0 20 fc 66  |nF..6..'v.... .f|
000001e0  26 47 36 0c 0f 25 43 4e  b0 c2 68 20 74 e2 30 30  |&G6..%CN..h t.00|
000001f0  30 6c ea a0 68 66 72 ec  15 57 2f 14 6f 2e 4e 2a  |0l..hfr..W/.o.N*|
00000200
abels-MacBook-Pro:cuadrados_magicos aberope$

Relación bloque de datos en bits, con tamaño de password en bits.

Un bloque de n = 16 tiene n^2 = 256 bits de datos. Se puede dividir en cuadrados de 4 * 4 = 16 bits. En concreto 16 cuadrados. Cada cuadrado se puede cifrar de forma inclusiva o exclusiva, bit 1 se swapea, 0 se mantiene. Y cada cuadrado de n = 4 tiene 2 patrones simétricos. Si es 1, se elige el patrón inclusivo, si no el exclusivo. Teniendo en cuenta que para generar la magia en un cuadrado mágico, se debe mantener las esquinas y el centro, podemos rotarlas 180 grados o no, de ahí el 1 y el 0. bit: 0 patrón de mantener esquinas y centro. bit = 1: patrón simétrico del anterior, pero rotando esquinas y centro. esto es a nivel de n cualquier valor, pero en este caso se divide para comprar la inclusión 1 o exclusión 0, con la password.

Por tanto, si tenemos 256 bits de datos, tenemos 16 bits de contraseña. 16 ^ 2 posibilidades.

Pero como podemos obtener el bloque sin cifrar pero revertido, aplicando una contraseña negada, tenemos la mitado: 16 ^ 2 / 2 = 128 posibilidades.

Para un bloque de datos de tipo Ethernet, de 1500 bytes = 12000 bits, podemos usar un bloque de 256 bits con padding aleatorio. Pero no nos sirve.

El problema que estoy analizando es que se podría cifrar cualquier dato dividiendo el bloque en bloques del mismo tamaño hasta llegar al último y ponerle un padding a ese último.

Con la misma password ciframos cada bloque.

Es decir que una cadena de 32 bytes, tiene 128 variantes completamente alejadas de las passwords que descifran el 100% del bloque.

Cifrado con Método 3: División del bloque de entrada entre cuadrados de 16 bits.

Lo dicho en el título, por ejemplo si tenemos un paquete de red 1500 bytes, tenemos 12000 bits de datos.

Si dividimos 12000 bits entre bloques de 16 bits, tenemos 750 bloques de 4 * 4, luego n = 4.

Para calcular las posibilidades para crackear un paquete de red, al 100%: 750 bloques dan para 750 bits de contraseña, pues cada bloque se cifra de forma inclusiva o exclusiva. Por tanto 2 ^ 750 / 2 = 2.961193e+225 posibilidades.

Supongo que habrán muchas formas de descifrar un paquete de red, pero la complejidad de este algoritmo no me deja ver de momento métodos de colisionamiento y crackeo de forma eficiente. Pero me parece una burrada de probabilidades para cifrar 1500 bytes.

Cifrado en base a n = 2

Bueno, después de lo que he aprendido, sé que un cuadrado mágico de n = 4 es como 4 de n = 2. Lo único que uno de n = 2 no es magico. Si tenemos 4 cuadrados de n = 2, tenemos 2 patrones por cuadrado. Que serían 2 * 4 = 8 posibilidades de disponer los números en ese cuadrado. Pero mágicos, solo hay 2 patrones.

Como no he descubierto ninguna propiedad de cifrar respetando las propiedades mágicas, me he dado cuenta que el sistema que utiliza puede ser aplicado de otra forma, sin generar cuadrados mágicos.

Así que voy a enlazar una nuevo proyecto aquí porque creo que será mejor no mezclar la magia, con la realidad ;).

https://github.com/aberope/LibMSCipher.git

Colisiones en el cifrado

A simple vista todo parece perfecto, pero en realidad nunca lo es.

En este caso, si tenemos un bloque de 512 bytes, necesitamos una contraseña de 32 bytes. Parece como si fuera 256^32 posibilidades, pero en realidad, hay un patrón opuesto al patrón de cifrado, que es simétrico, pero negando el patrón de cifrado, por ejemplo si tenemos esta contraseña:

01000011010100110011010101101011010001110101100001010000011010110111001101000101011010100101101001110101011000100111001001011000010000110101001100110101011010110100011101011000010100000110101101110011010001010110101001011010011101010110001001110010010110000001101001001110010001101010111001011010010101101010001011001110110101100000101000011010111000101101011010101100110010101100001000011010010011100100011010101110010110100101011010100010110011101101011000001010000110101110001011010110101011001100101011000010

Descifrar el cuadrado con una contraseña negada:

10111100101011001100101010010100101110001010011110101111100101001000110010111010100101011010010110001010100111011000110110100111101111001010110011001010100101001011100010100111101011111001010010001100101110101001010110100101100010101001110110001101101001111110010110110001101110010101000110100101101010010101110100110001001010011111010111100101000111010010100101010011001101010011110111100101101100011011100101010001101001011010100101011101001100010010100111110101111001010001110100101001010100110011010100111101

Obtendríamos el texto plano como si hubiesemos hecho un strrev de los bits del texto plano original.

Por lo que este cifrado "solo tendría" 256^32 / 2 posibilidades...

Generar cuadrados mágicos

Para generar unos cuadrados mágicos programáticamente, lanza la herramienta Generador. Por ejemplo:

$ java Generador
5
75 140 55 120 35 40 80 145 60 100 105 45 85 125 65 70 110 25 90 130 135 50 115 30 95
4
1 15 14 4 12 6 7 9 8 10 11 5 13 3 2 16
8
1 2 62 61 60 59 7 8 9 10 54 53 52 51 15 16 48 47 19 20 21 22 42 41 40 39 27 28 29 30 34 33 32 31 35 36 37 38 26 25 24 23 43 44 45 46 18 17 49 50 14 13 12 11 55 56 57 58 6 5 4 3 63 64
16
1 2 3 4 252 251 250 249 248 247 246 245 13 14 15 16 17 18 19 20 236 235 234 233 232 231 230 229 29 30 31 32 33 34 35 36 220 219 218 217 216 215 214 213 45 46 47 48 49 50 51 52 204 203 202 201 200 199 198 197 61 62 63 64 192 191 190 189 69 70 71 72 73 74 75 76 180 179 178 177 176 175 174 173 85 86 87 88 89 90 91 92 164 163 162 161 160 159 158 157 101 102 103 104 105 106 107 108 148 147 146 145 144 143 142 141 117 118 119 120 121 122 123 124 132 131 130 129 128 127 126 125 133 134 135 136 137 138 139 140 116 115 114 113 112 111 110 109 149 150 151 152 153 154 155 156 100 99 98 97 96 95 94 93 165 166 167 168 169 170 171 172 84 83 82 81 80 79 78 77 181 182 183 184 185 186 187 188 68 67 66 65 193 194 195 196 60 59 58 57 56 55 54 53 205 206 207 208 209 210 211 212 44 43 42 41 40 39 38 37 221 222 223 224 225 226 227 228 28 27 26 25 24 23 22 21 237 238 239 240 241 242 243 244 12 11 10 9 8 7 6 5 253 254 255 256
4
1 15 14 4 12 6 7 9 8 10 11 5 13 3 2 16
8
1 63 62 4 5 59 58 8 56 10 11 53 52 14 15 49 48 18 19 45 44 22 23 41 25 39 38 28 29 35 34 32 33 31 30 36 37 27 26 40 24 42 43 21 20 46 47 17 16 50 51 13 12 54 55 9 57 7 6 60 61 3 2 64
16
1 2 254 253 252 251 7 8 9 10 246 245 244 243 15 16 17 18 238 237 236 235 23 24 25 26 230 229 228 227 31 32 224 223 35 36 37 38 218 217 216 215 43 44 45 46 210 209 208 207 51 52 53 54 202 201 200 199 59 60 61 62 194 193 192 191 67 68 69 70 186 185 184 183 75 76 77 78 178 177 176 175 83 84 85 86 170 169 168 167 91 92 93 94 162 161 97 98 158 157 156 155 103 104 105 106 150 149 148 147 111 112 113 114 142 141 140 139 119 120 121 122 134 133 132 131 127 128 129 130 126 125 124 123 135 136 137 138 118 117 116 115 143 144 145 146 110 109 108 107 151 152 153 154 102 101 100 99 159 160 96 95 163 164 165 166 90 89 88 87 171 172 173 174 82 81 80 79 179 180 181 182 74 73 72 71 187 188 189 190 66 65 64 63 195 196 197 198 58 57 56 55 203 204 205 206 50 49 48 47 211 212 213 214 42 41 40 39 219 220 221 222 34 33 225 226 30 29 28 27 231 232 233 234 22 21 20 19 239 240 241 242 14 13 12 11 247 248 249 250 6 5 4 3 255 256

Comprobar los cuadrados mágicos anteriores

$ java Comprobar
[PASTE HERE]
5
75 140 55 120 35 40 80 145 60 100 105 45 85 125 65 70 110 25 90 130 135 50 115 30 95
4
1 15 14 4 12 6 7 9 8 10 11 5 13 3 2 16
8
1 2 62 61 60 59 7 8 9 10 54 53 52 51 15 16 48 47 19 20 21 22 42 41 40 39 27 28 29 30 34 33 32 31 35 36 37 38 26 25 24 23 43 44 45 46 18 17 49 50 14 13 12 11 55 56 57 58 6 5 4 3 63 64
16
1 2 3 4 252 251 250 249 248 247 246 245 13 14 15 16 17 18 19 20 236 235 234 233 232 231 230 229 29 30 31 32 33 34 35 36 220 219 218 217 216 215 214 213 45 46 47 48 49 50 51 52 204 203 202 201 200 199 198 197 61 62 63 64 192 191 190 189 69 70 71 72 73 74 75 76 180 179 178 177 176 175 174 173 85 86 87 88 89 90 91 92 164 163 162 161 160 159 158 157 101 102 103 104 105 106 107 108 148 147 146 145 144 143 142 141 117 118 119 120 121 122 123 124 132 131 130 129 128 127 126 125 133 134 135 136 137 138 139 140 116 115 114 113 112 111 110 109 149 150 151 152 153 154 155 156 100 99 98 97 96 95 94 93 165 166 167 168 169 170 171 172 84 83 82 81 80 79 78 77 181 182 183 184 185 186 187 188 68 67 66 65 14 195 196 60 59 58 57 56 55 54 53 205 206 207 208 209 210 211 212 44 43 42 41 40 39 38 37 221 222 223 224 225 226 227 228 28 27 26 25 24 23 22 21 237 238 239 240 241 242 243 244 12 11 10 9 8 7 6 5 253 254 255 256
4
1 15 14 4 12 6 7 9 8 10 11 5 13 3 2 16
8
1 63 62 4 5 59 58 8 56 10 11 53 52 14 15 49 48 18 19 45 44 22 23 41 25 39 38 28 29 35 34 32 33 31 30 36 37 27 26 40 24 42 43 21 20 46 47 17 16 50 51 13 12 54 55 9 57 7 6 60 61 3 2 64
16
1 2 254 253 252 251 7 8 9 10 246 245 244 243 15 16 17 18 238 237 236 235 23 24 25 26 230 229 228 227 31 32 224 223 35 36 37 38 218 217 216 215 43 44 45 46 210 209 208 207 51 52 53 54 202 201 200 199 59 60 61 62 194 193 192 191 67 68 69 70 186 185 184 183 75 76 77 78 178 177 176 175 83 84 85 86 170 169 168 167 91 92 93 94 162 161 97 98 158 157 156 155 103 104 105 106 150 149 148 147 111 112 113 114 142 141 140 139 119 120 121 122 134 133 132 131 127 128 129 130 126 125 124 123 135 136 137 138 118 117 116 115 143 144 145 146 110 109 108 107 151 152 153 154 102 101 100 99 159 160 96 95 163 164 165 166 90 89 88 87 171 172 173 174 82 81 80 79 179 180 181 182 74 73 72 71 187 188 189 190 66 65 64 63 195 196 197 198 58 57 56 55 203 204 205 206 50 49 48 47 211 212 213 214 42 41 40 39 219 220 221 222 34 33 225 226 30 29 28 27 231 232 233 234 22 21 20 19 239 240 241 242 14 13 12 11 247 248 249 250 6 5 4 3 255 256
0
DIABOLICO
ESOTERICO
ESOTERICO
ESOTERICO
ESOTERICO
ESOTERICO
ESOTERICO