TARDÍGRADOS

Ciencia en español -ʟᴀ ʀᴀᴢóɴ ᴇsᴛá ᴀʜí ғᴜᴇʀᴀ-

Archive for the ‘criptografía’ Category

STOCHASHES: ¿Qué es un hash estocástico, y para qué sirve?

Posted by Albert Zotkin en junio 1, 2020

Hola amigos de Tardígrados. Hoy me voy a inventar un nuevo concepto de hash, que podremos aplicar en el campo de la criptografía, y en el de las criptomonedas. Se trata del concepto de hash estocástico. En el mundo de las criptodivisas, estamos acostumbrados a trabajar como todo tipo de hashes, y demás cadenas y scripts de todo tipo. Pero. creo que lo que voy a definir a continuación no existe, como tal, en el mundo de la criptografía.
Podemos definir un hash estocástico como una función tal que tiene como input una cadena constante de N bytes, y cada vez que la aplicamos, genera una cadena casi-aleatoria de N bits. Decímos, casi-aleatoria, porque en realidad lo que cada byte del input de entrada define es una probabilidad. Al ser N bytes de entrada existirán N bits de salida, y cada uno de esos bits es generado de acuerdo a la probabilidad definida por su correspondiente byte de entrada. Eso significa, que cada vez que aplicamos la función, obtenemos una cadena de N bits distinta (aunque podría darse el improbable caso de que alguna cadena se repitiera), y estadisticamente se podría comprobar cómo para cualquier muestra, se cumple siempre la distribución definida en las probabilidades codificadas en los bytes de entrada. O sea, un hash estocástico de N bytes genera hashes estándar de N bits.

Pongamos un ejemplo: Definamos una función stochash256 que tomará 256 bytes como input, y “escupirá”, 256 bits de salida, cada vez que se ejecute. Para la realización de este proyecto, usaré la librería de node.js llamada bitcore-lib, la cual posee bonitas funciones y utilidades varias. Crearé un script en node.js para que podamos ver la idea, y cómo trabaja esa función, que he llamado stochash256.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
			Stochashes
*/
const bitcore = require('bitcore-lib');
const Random = bitcore.crypto.Random;

var stochash = Random.getRandomBuffer(256);
for(var i=0;i<100;i++){
		var hash = stochash256(stochash);
		console.log(hash.toString('hex'));
}

function stochash256(buffer){
	if(buffer.length !== 256) return null;
	var pt  = 0;
	var hash = []
	while(1){
			var byte = buffer.readUInt8(pt);
	 		var repunit = getRepunit(byte);
	 		var rnd = Random.getRandomBuffer(1).readUInt8(0);
	 		hash.push(repunit[rnd]);
	 pt++;
	 if(pt == buffer.length)break;
	}
	 var result = new bitcore.crypto.BN.fromString(hash.join(''),2);
	 return result.toBuffer();
}
function getRepunit(byte){
	
	const two = new bitcore.crypto.BN(2);
	const one = new bitcore.crypto.BN(1);
	var b = new bitcore.crypto.BN(byte);
	var repunit = two.pow(b);
	repunit = repunit.sub(one);
	return repunit.toString(2,256);
	
	
}
La librería bitcore-lib nos ofrece la función const Random = bitcore.crypto.Random, con la cual podemos generar buffers aleatorios de arbitraria longitud. En nuestro caso generamos uno de 256 bytes, para empezar

var stochash = Random.getRandomBuffer(256);
Una vez que tenemos ese buffer de 256 bytes aleatorios, con cada byte definiendo una probabilidad que será aplicada a su correspondiente bit de salida, generamos una muestra de 100 hashes estándar, aplicando la función stochash256 con el mismo buffer constante stochash. En seguida vemos, que uso una función auxiliar llamada getRepunit. ¿qué hace?. Crea un número repunit en base 2 según el valor del byte con el que estamos trabjando. Es decir, esa función getRepunit nos da un numero en base 2 (ceros y unos), que contiene tantos unos seguidos como especifica el valor del byte. rellenamos con ceros a la izquierda para completar hasta 256. Una vez que tenemos nuestro número repunit, solo hay que escoger al azar uno cualquiera de sus ceros y unos, para obtener así nuestro bit casi-aleatorio (estocástico). la idea de usar números repunit en base 2 como recurso para realizar la probabilidad definida en el valor del byte, se me ocurrió ayer mientras echaba una siestecilla de 2 horas 😛
Apliquemos nuestra función stochash256 para obtener una muestra de 100 hashes estándar de 256 bits cada uno, que expresaremos en base hexadecimal:
1. Primero generamos el buffer aleatorio de 256 bytes de entrada stochash. Y después aplicamos 100 veces stochash256, con ese stochash constante:
{
        "stochash": 
"4f92bc84fd5126a6a65f31bf33b5ad112644e7a55f22e134a4ccba1800323  						 fb1b2ac0d9c31c0b8001cd4edfb9447be44e9cf04987d0f5a26936b9463e1					 96ba76b38aa35068a1e960447d1850a20d8a10d9b723b9ba7178551f19988
3bcd41ec6f9c813135d585b173b1047dc98a23f83a84a3ce8fde269ed9f7d
bb2f5fa6a9f8f9395b8a4cb96961d50a752069800eb5ee75435138210d724						 20b751be5480042997f42c2966ffdfa117e68bc746fd98f27665853aff3cd						 081d9a1c2dd702e74982f50255c9afbfefe7e8a6158d1ed75258afd772e03  						 00cba1c8d3c76d7a969e90f7f3a8b61eb3cd649114e346a923ad32fe4b354
9d8f2e15d47d6ef8fed69570",
        "hashes": [
                "1b343045ce7898ea771ad17dcc1f9d23379190083f560403cdc3ea5d0c274cfd",
                "38d63263c67fdabeae5cda15cc121f21a4acf1289f13060bd5f3381745096bdc",
                "69142ae56c72d1a3d29a326d823d18bfa4b1a02ca35b4e4ac7c0290d0d311cff",
                "29b4ba65d4f9ce9cf242fc2dcc10dfe3a409c10cd766ac684fe3791b65076c7d",
                "78c232c0ce7489fd5609dd3d80bd9debff85c28ceba70c8acfe04989348348dc",
                "6a8682614e7280afc648cc1dc23e992d9ca8899d17413e49dd6a783b1500e0f8",
                "fb0833219e74c0bab2da982dc095dfe786a1f129db316c6ac5ead97f4fad783f",
                "7982e2c2b47b48b39a4acf1ec095996fb4a18c288b1a9e7a5fe9790d4d7954be",
                "f9542e21d07fc32b9beb9b76ce1dfbc78c88f52c975b460adee36d5f758d4cdc",
                "d89222e1f67ad26fd6d09db7cc11cfa7838081199f4b1e6a6fe37869192c509f",
                "ec927641c678506fa70ace2dc82cff83b2a18128db3724cacbcbb91d0d0574da",
                "ebbeb263c65ec068a6888c05c7979ffb848cf8809f22246ac9e269cd1d0de4be",
                "19d6bbc1d67ad828b30a413dc2159f639105b0e83f1a5e4259cafd2d410460be",
                "6d9c7ac5d052dba7d68a989de21ecd23b4a1400cfb72ae0acfe9e8431580745d",
                "fb5e7ae196b390fbf212de14c892cc67b590c0288f1f060aceea28491501689f",
                "e99073609e7ad0dff7628831843abfebb7809129d3610e4ad5e1394954206c9d",
                "6d1422e19672c01a86c8df2dc0559feb96a94088df3b2e08cfe6690d7d1554dd",
                "ecf602e3d272ca2eeb4ac82dc8349bbf90048008571f0e4a57eae95d0f055cde",
                "a99e32819e73d8b8a748d73dcc1e5dc3950890259b707e2a47c2fc5d5c8c443f",
                "edc26280b47bc09f2688fb258535dd8392a9800897274e4a5dc2f0ff49806afe",
                "39127a619e5bdaebb3d0f41d8018ddcfa6af8c08db3a66c3cbe370ed1d2be27e",
                "b8d62022d072cb8bc45ad325c1169fe134b4fc2893af3e4247eb615d150864df",
                "69567a6150628aadb61ad80fca0dfda7d5a5e08877758e0bddeacd5d718a7cfe",
                "edd7baf0c23b92fd8a2cd81dc02d1d25c0a9d98817be6e8a49e2f00d548c62fe",
                "39ac72e1e472c2eb7618de3dc087de6f9ce1c1b8bbc17c4a47e3391dd50d488f",
                "bb943ee4d678d29e2fdad82dd01f1da7e599880d1b081c0b4fca790f5c0154fe",
                "699a3a7144761b3e6e48de8dc6399de5d6acc029931d2e5ac3c2e90b0db56cfe",
                "5a903260d4fac84af740f219c01f1de5b4b5c0016f16dec2c9e6e84f5509ccde",
                "2f823ac38670d1cf0642940dcb591ca5b60d81a8ff5d2e3b4fc2691d0b016c9a",
                "580622e15673d37e339ce4bcc0341d6b8ca1a0091b0f4e62c08a044c2d356cba",
                "399732e31672da9ae748f83dc011dd659581c12893443e2a4feae94916356e5b",
                "7c96fa40d678ca5b63dac7358e1cbda790a0c1089b171e9bc5caed7d1d05629a",
                "2b9678e1f67ad8defec8982988959d4fa9e1b8289b5a5e4a5bca391c678d60de",
                "385e3b66de7ad02f2658c125c0523d239ca5c129db8c1e41dfa2e1cd6c04acbd",
                "ef9738e74077c9ee965a8885c895dda394a08518c3260c7adff3e94d1681d85d",
                "789622a0543adc0cf6cac3b8c29d9d27bca9e4083f6f170b47faf97d45246e1e",
                "28163ac5027bda3e1648dc34d891bd7b9e81a808bb53064acfe6397957847cde",
                "d91e62c1d6d39064b282c96340188d8f848c91285f1e0e0a5de2ecdd25814c9c",
                "29dc76c21676d0583750c016ca2cbda5d388e908936ac65acfe9785d0d21e81e",
                "29b27a60c67e92ff3e52c51ec01d9d87ada1812cf7557e4bdbcb71090f916cde",
                "7e843aa18072d0decb0acb19c28e1dbff68dc23053262e5acbc2f95d1555709e",
                "3e0620831672c0ae8e42de05c2961e83d4819029df7746cac9eaf94b5fc57a9f",
                "3f9432c144b7daeffa48d82542149daf878ca080df5f1e4acfa23949661168ac",
                "2c8422f0d67ec0acdf48d02fc4f29ba3dc8488295f4e2e0ac9c2694317056cde",
                "8f323f61c672c0b6be68c044c4119f27d18dd00c97364c4ad9ee294b4d11629e",
                "58d63aa14e72c0a8ae50f83dca3d1b2fd381a1688f424e1aceea3de74723c499",
                "f9572ee0de7ad0edee62db2dcb141b6f84bda0889b124ecadfe3d8ff07a17c99",
                "7dd67ae1c6b896cfc64a9034c19d9dc79425d108db380e5b41ca797d050cc8df",
                "98fa2241867a0a3e2f4ab635c0144dcb8181810891507e4ac8e25d4d1d4d2cd5",
                "7814b6e5c6509299d7125b0dc02d3d579f899008db37064bc3c76959472652fe",
                "791836e3567eda6a8688dd68c0113de39e80882903121e5a4fe2d9595f27649a",
                "79d023a6ce77d88ce740e20dc817defba089842c9b740e0acdea7d6f3510619e",
                "78da32a2de70d29c265a9a7dca15dde5db88a519d7350f424bc8291c07216c7e",
                "382236e0447bc00cea98f805d4159ee7b08991a0b3d94a1a4ffab90d5d17469f",
                "ac987bc16670d2eca2884a25c33eff8b97240128fb6f0e9b57c21f1d450468dd",
                "f91263014c72c2a38652de3d821c9f6f8089e90147070e1a45cbb90fd50102df",
                "39c61aa0d21281387682d1adc81d7f25e3a581a8c17a4e1acde2694d0d04629a",
                "e9d622e3c67458bdc298d90ce0913de39e85e808df4e0e237be3793d260548ad",
                "6d9262e09673ca492a185919c5989d0df62dc0a94f1bae4b4fe039791f05609c",
                "49866260e47cc028ab51ce0bc2189fa19c8de1b997eb4e4acbc67859450d401b",
                "399e2ee6dc7b9820e742c811d9359da9b49508081f9f2e4a4fe3e967d7217cbc",
                "5db773e5de7b99ea8321dc1cc21fddabe48c942093c72e0a5de3b84d75016cbe",
                "79f2b220d27a407aa6b8da0cc035dd75bca49b085f5a4e8adfebc84914897cde",
                "1d0632679672c04e2c01c83dd91cd90586b0802cd6680e2ac6c0a12b070164fc",
                "7987326544f0d14d9218170dc0101daf920bb1259357c44a4be0195915096d5d",
                "191e7061e4fd90ac7b18da2dc4159ca1a084b0b843579e4ac9c0690d1c03089f",
                "e99232e4c47cd8ecc648ca04cc059d2385a909195717764ad9ea7c5b0b0165ff",
                "bc9c92c1467ad00fea1a8804848c9fe79d29c8281b3aa608dd8b780f6d3c6c9e",
                "7cba70c1d673d08f6e48c13482309be399a5c90d9f0e8e4b4f6b698d1d25609c",
                "6d123aa3d6f9c0ab060ad5a3c69c99e5a4808038533a641bd3ee617904014cde",
                "991e30e18679d00e645afa95d714fbaf960989807b560e4bcbf0795d0715681f",
                "798623c20e72dcb0bf42da1dc89c9fc39ea58019937f0e4b4fe3b81d5d016a9e",
                "9e162a4100f8c82e56089b7dc81e9fefad359689d37f064bcfe9294445017c5e",
                "49c630c2c270d2db6e08d929c65fdfebbda0900c0b5f8e434fc2e81d160061dd",
                "883637e1063fda18ea02d61de019df8f9f8f99a89f04ce025fc1213e0c2d68b8",
                "c9163ac1d67bc2bba75288bdc6139f39900984b95f5aae43dfea294f3d1d7c8d",
                "28dc3ae1d673c0673a5ad83dc0a11f2794a589a87f38cc0adfc261099f03749d",
                "089c6af1867ac85bef009c0fc0019fe39b84c4e9e3324e4b4f4a785d412de09f",
                "19de32e1107fc83512489315ce1ddd879081c0008f135e8a8fda617b5d85e8de",
                "e8902a83c673d00ae6085035828e3ba39e81f008335b444ac7e2b95d922964dd",
                "98bc6ae1527288b8c248d83bc21359cf80098c04975f3e0ac7ffe84e95036edc",
                "2d5216f55672d8fec20adaacc61fbc3185a0a0189b557c0addc27f3b778de29d",
                "588f3660d472c82e7a88d23dc841dd87b68580a83f0b5e4b43a9ed1f441d60df",
                "399032f3de72c8dbe702882dc890ddef99a9a82c97388e0bcb68f95f5d0f69d1",
                "79537ae1467adb9aae9ad4b5c21d1f7f9589c00c93222e4a57e2fb7975cde0de",
                "65de0ae18233c0e1aac9d20dcc151def9480a048d3124e4acfcb295d55c47ebe",
                "5d36ba255e72d08bd658ec0dc01c1dff34a9c108137b2e4a4bea7919040d54fe",
                "48c062a4d6b2c2be8512a00f881f9fe58724a0089b3a0ecacfcbb91f050d3edd",
                "691712c1dcba01ab034c4e3d865cdf859b8991b89f3b2e4ac9e2282f4d0d7cbe",
                "2dd63082c672d186ee40d829c41abf85d921d128bf071ec9c9c968015d217edf",
                "799232e1f47fc05db6c8d63dca149de185e5c1a9475deec05be9b899c505fc9c",
                "0bb036a41e7bd83af60a98bdc094c9a5a72dc02c5b3b0b4a0fe6790b4391681f",
                "7b1402e5c27b88ae7b0ad84cc71b5d9786a48000933a1e624fc8285f5d8776b4",
                "b93612c11276d89f9418583cc4599d27dc818128bb32ee4bcda2211f578178dc",
                "39166a41467cd2aeffe8d93dc00e5fefa9888118935a6614cdc8e04d54a94898",
                "387130e1d67b90e72208de2cc03fbfcf86bdc02c53530e085fe0391b15305e1f",
                "3d1632c154729abf83c8d82d881b1dc78ea5a0091f1e960ac7ec611e151564dd",
                "4f467600c21bc2ce890a5c2dc21d5fafa5a1c1a99b5a66db5bea79df45206cdd",
                "5c963a62c470d8ce4e00d62dc61e0f2e8635082853364e4a5fe2780f4565e4fd",
                "599632e1d67298bf4a1adc1082959d2da6ad802dd75a460a4deadd0c5516409f"
        ]
}

se puede comprobar fácilmente como la muestra de hashes cae toda dentro de una distribución normal, según las probabilidades definidas en cada byte de stochash. Los stochashes nos servirán para optimizar la velocidad de resolución de bloques en minería de bitcoins u otras criptodivisas. Pero, ese es otro capítulo.

Saludos estocásticos a todos.

Posted in Bitcoin, criptografía, Criptomonedas | Etiquetado: , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a Comment »

Criptografía: un programilla muy sencillo más para codificar cadenas

Posted by Albert Zotkin en mayo 31, 2020

Hace ya algunos años, escribí y compilé un pequeño programa en lenguaje C para encriptar archivos. Era simple y directo. Ahora, lo he rescatado y lo he traducido a lenguaje javascript para node.js. Y aquí te lo presento:

/*
 ESTE PEQUEÑO PROGRAMILLA HACE LO SIGUIENTE:
 			1. DIVIDE LA CADENA DE BYTES EN DOS MITADES. DESPOUES, 
 			2. TRASPONE EL BYTE DE LA POSICIÓN X A LA POSICIÓN 
 				 L - X, DONDE L ES LA LONGITUD DE LA CADENA. Y SEGUIDAMENTE 
 				 
 			3. RESTA(Ó SUMA, DEPENDIENDO DE SI EL PARÁMETRO MODO ES 1 Ó 0) 
 				 AL CÓDIGO ASCII DE CADA BYTE.
*/

const fs = require('fs');
var file1 = '../uploads/building.jpg';
var file2 = '../uploads/building-2.jpg';
var flujofichero = fs.readFileSync(file1);
var puntero = 0;
var modo = 1;
var size = flujofichero.length;

if(flujofichero.length){
 while(puntero < size/2)
  {
    Traspuesta(puntero,size-puntero-1,modo,flujofichero);
    puntero++;   
  }
 
  fs.writeFile(file2, flujofichero, 'binary', function(err){ 	
  });
}




function Traspuesta(i, j, modo, buffer){ 

  var nparam1,nparam2;
  nparam1 = buffer.readUInt8(i);
  if(modo)nparam1 = nparam1 - 10;
  else nparam1 = nparam1 + 10;
  nparam1 = nparam1<0?256+nparam1:nparam1;
	nparam1 = nparam1>0xff?nparam1-256:nparam1;
  nparam2 = buffer.readUInt8(j);//flujofichero.charCodeAt(j);
  if(modo)nparam2 = nparam2 - 10;
  else nparam2 = nparam2 + 10;
 
  nparam2 = nparam2<0?256+nparam2:nparam2;
	nparam2 = nparam2>0xff?nparam2-256:nparam2;
  buffer.writeUInt8(nparam2, i);
  buffer.writeUInt8(nparam1, j);
}

En el código de arriba elijo un archivo de una imagen jpg llamado building.jpg. Lo abro mediante la instrucción flujofichero = fs.readFileSync(file1);, con lo cual sus bytes quedan cargados en la variable flujofichero , que es un buffer. Conprobamos que dicho buffer tiene longitud no nula, antes de aplicarle el proceso de encriptación. Resulta que nuestro archivo imagen posee una longitud en bytes de flujofichero.length = 699.395 bytes.
Ahora ya podemos empezar a encriptar. Aplicamos la función Traspuesta a lo largo de la cadena de bytes, y eso lo hacemos mediante un loop while, con la condición de que salga del bucle cuando la variable puntero sea igual o mayor a la mitad de la longitud de la cadena de bytes. La función Traspuesta es muy sencilla, el único misterio está en cono se puede truncar cada bytes al restarle o sumarle 10. Cuando a 1 byte, cuyo valor sabemos que está en el intervalo [0,255], porque 1 byte son 8 bits, le sumamos un número tal que el resultado desbordaría esos 8 bits, es decier se necesitarían más bits para expresar el resultado, entonces se produce un truncamiento. Pero ese truncamiento del byte Javascript no es posible porque las variables de javascript no poseen esa pre-condición. Por lo tanto, el truncamiento del byte hay que hacerlo manualmente. ¿Cómo?. Muy sencillo. Supongamos que tenemos el byte almacenado en la variable nparam1 y al sumarle 10 se desborda, entonces le aplicamos la siguiente condición, en caso de que se produzca ese desbordamiento:

nparam1 = nparam1>0xff?nparam1-256:nparam1;

que viene a decir que en caso de que la variable nparam1 sea mayor a 255, entonces quede truncada a nparam1-256. Algo muy parecido hacemos para el caso en que la variable sea un número negativo

 nparam1 = nparam1<0?256+nparam1:nparam1;
De esta forma el byte queda truncado, siempre tendremos 8 bits, y por lo tanto el tamaño del archivo encriptado será el mismo que el del original. Estos truncamientos se pueden hacer de muchas formas, yo he elegido la más “literaria”. El resultado de encriptar lo guardamos en otro archivo nuevo llamado building-2.jpg, y eso lo hacemos mediante la función asincrónica

 fs.writeFile(file2, flujofichero, 'binary', function(err)
{if(err)throw err;});

Otra cosa interesante de este programilla de encriptar es el parámetro modo. Si encriptas en modo = 1, entonces para recuperar el archivo original debes aplicar una encriptación sobre el archivo encriptado, pero con modo = 0. y viceversa. Si aplicas sucesivas iteraciones con el mismo modo, solo al cabo de 128 iteraciones consigues llegar al archivo original.
Veamos el aspecto de los dos archivos, el original y el encriptado:
y los primeros bytes de esa imagen original son estos:

00000000h: FF D8 FF E0 00 10 4A 46 49 46 00 01 02 01 00 48 ; ÿØÿà..JFIF.....H
00000010h: 00 48 00 00 FF E1 29 8A 45 78 69 66 00 00 4D 4D ; .H..ÿá)ŠExif..MM
00000020h: 00 2A 00 00 00 08 00 07 01 12 00 03 00 00 00 01 ; .*..............
00000030h: 00 01 00 00 01 1A 00 05 00 00 00 01 00 00 00 62 ; ...............b
00000040h: 01 1B 00 05 00 00 00 01 00 00 00 6A 01 28 00 03 ; ...........j.(..
00000050h: 00 00 00 01 00 02 00 00 01 31 00 02 00 00 00 1C ; .........1......
00000060h: 00 00 00 72 01 32 00 02 00 00 00 14 00 00 00 8E ; ...r.2.........Ž
00000070h: 87 69 00 04 00 00 00 01 00 00 00 A4 00 00 00 D0 ; ‡i.........¤...Ð
00000080h: 00 0A FC 80 00 00 27 10 00 0A FC 80 00 00 27 10 ; ..ü€..'...ü€..'.
00000090h: 41 64 6F 62 65 20 50 68 6F 74 6F 73 68 6F 70 20 ; Adobe Photoshop 
000000a0h: 43 53 34 20 57 69 6E 64 6F 77 73 00 32 30 31 37 ; CS4 Windows.2017
000000b0h: 3A 30 33 3A 30 31 20 32 32 3A 32 38 3A 32 32 00 ; :03:01 22:28:22.
000000c0h: 00 00 00 03 A0 01 00 03 00 00 00 01 00 01 00 00 ; .... ...........
000000d0h: A0 02 00 04 00 00 00 01 00 00 03 69 A0 03 00 04 ;  ..........i ...
000000e0h: 00 00 00 01 00 00 02 D9 00 00 00 00 00 00 00 06 ; .......Ù........
000000f0h: 01 03 00 03 00 00 00 01 00 06 00 00 01 1A 00 05 ; ................
00000100h: 00 00 00 01 00 00 01 1E 01 1B 00 05 00 00 00 01 ; ................

L Y los primeros bytes del archivo encriptado en mod = 0, son estos:

00000000h: E3 09 49 F5 89 8D 3B 06 D1 0F 94 0A 09 F9 F4 29 ; ã.Iõ‰;.Ñ.”..ùô)
00000010h: C1 FC C9 6E AA 02 C9 9C F5 11 4D 02 E9 94 1D 0A ; ÁüÉnª.Éœõ.M.é”..
00000020h: 09 E9 62 71 90 FC A9 EB E0 0A 09 AD D8 55 D4 0A ; .ébqü©ëà..­ØUÔ.
00000030h: 09 5C CE 89 DC 7F 19 06 61 43 98 0A 09 48 B8 81 ; .\ΉÜ..aC˜..H¸
00000040h: 06 D3 89 61 00 81 62 A1 3F EA 0A 09 E9 05 A1 7B ; .Ó‰a.b¡?ê..é.¡{
00000050h: 27 01 CC 0A 09 FC 04 49 B4 95 0F 0A 09 75 EB 05 ; '.Ì..ü.I´•...uë.
00000060h: C9 62 39 FC BD 0A 09 45 70 07 19 F4 1A A1 07 E9 ; Éb9ü½..Ep..ô.¡.é
00000070h: 3A 21 0A 09 87 7F 2B 19 02 C9 EE 35 08 2D B6 A9 ; :!..‡+..Éî5.-¶©
00000080h: 28 FC E9 EF 35 08 41 87 C2 D3 0A 09 9F 8F 02 0A ; (üéï5.A‡ÂÓ..Ÿ..
00000090h: 09 BC 78 44 06 79 ED 07 95 F4 30 9B 0A 09 62 98 ; .¼xD.yí.•ô0›..b˜
000000a0h: F7 0A 09 AE D8 B4 EB C9 FB C6 89 9F 7F A3 5F 03 ; ÷..®Ø´ëÉûƉŸ£_.
000000b0h: 39 D2 02 59 B4 95 11 0A 09 67 C5 07 D9 7E 6B CD ; 9Ò.Y´•...gÅ.Ù~kÍ
000000c0h: 0A 09 D5 A1 02 89 B8 98 1E 02 29 62 CE 0A 09 63 ; ..Õ¡.‰¸˜..)bÎ..c
000000d0h: 47 B2 4E 0A 09 19 7F F9 89 B3 19 E6 D3 0A 09 5C ; G²N...ù‰³.æÓ..\
000000e0h: 02 08 7B E0 65 13 08 B9 03 96 0A 09 BE C4 94 C1 ; ..{àe..¹.–..¾Ä”Á
000000f0h: FC C9 BF E5 0A 09 11 F5 D6 5F 08 ED DC 01 79 BD ; üÉ¿å...õÖ_.íÜ.y½
00000100h: 18 D6 08 39 3F F9 C9 B2 FD C8 01 89 FA 08 65 E0 ; .Ö.9?ùɲýÈ.‰ú.eà

Como me pareció un script muy sencillo y útil, lo he incluido como función dentro de mi libreria de utilidades de node.js, para cuando necesite una sencilla e inmediata encriptación de algo.

'use strict';
const OUTPUT = 1;
const INPUT = 0;
function WM_Encrypt(buffer, mode){
		 if(buffer.length){
				var puntero = 0;
				var size = buffer.length;
 				while(puntero < size/2)
  					{
    					Traspuesta(puntero,size-puntero-1,mode,buffer);
    					puntero++;   
  					}
		}
		
		return buffer;
}
function Traspuesta(i, j, modo, buffer){ 

  var nparam1,nparam2;
  nparam1 = buffer.readUInt8(i);
  if(modo)nparam1 = nparam1 - 10;
  else nparam1 = nparam1 + 10;
  nparam1 = nparam1<0?256+nparam1:nparam1;
	nparam1 = nparam1>0xff?nparam1-256:nparam1;
  nparam2 = buffer.readUInt8(j);//flujofichero.charCodeAt(j);
  if(modo)nparam2 = nparam2 - 10;
  else nparam2 = nparam2 + 10;
 
  nparam2 = nparam2<0?256+nparam2:nparam2;
	nparam2 = nparam2>0xff?nparam2-256:nparam2;
  buffer.writeUInt8(nparam2, i);
  buffer.writeUInt8(nparam1, j);
}

function wm_encode(buffer){
	return WM_Encrypt(buffer, OUTPUT);
}
function wm_decode(buffer){
	return WM_Encrypt(buffer, INPUT);
}
module.exports =
{
	WM_Encrypt:WM_Encrypt,
	wm_encode:wm_encode,
	wm_decode:wm_decode
};

Así, os puedo decir que:

#0ieZejW&eZecd[ieZWjf_hYd[ieZkbWI

que al desencriptarlo en modo 1, ya que fue encriptado en modo 0, obtenemos la cadena:

Saludos encriptados en modo 0 a todos 🙂

Posted in criptografía, informática, Matemáticas | Etiquetado: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a Comment »

 
A %d blogueros les gusta esto: