- Visión general de los métodos de transformación de la información disponibles
- Cifrado, hashing y empaquetado de datos: CryptEncode
- Descifrado y descompresión de datos: CryptDecode
Descifrado y descompresión de datos: CryptDecode
Para realizar operaciones de descifrado y descompresión de datos, MQL5 proporciona la función CryptDecode.
La función CryptDecode realiza una transformación inversa del array data al array result receptor utilizando el método especificado.
int CryptDecode(ENUM_CRYPT_METHOD method, const uchar &data[], const uchar &key[], uchar &result[])
Tenga en cuenta que la obtención de sumas hash realizada, en particular, por la función CryptEncode, es una transformación unidireccional: es imposible recuperar los datos originales a partir de los hashes.
La función devuelve el número de bytes colocados en el array de destino o 0 en caso de error. El código de error se añadirá a _LastError. Podría ser, por ejemplo, INVALID_PARAMETER (4003) si intentamos descifrar el hash (method es igual a una de las constantes CRYPT_HASH) o INVALID_ARRAY (4006) si la clave de descifrado no es lo suficientemente larga o está ausente.
Si la clave es incorrecta (diferente de la utilizada en el cifrado), obtendremos como resultado un galimatías en lugar de los datos fuente codificados, pero el código de error es cero. Este es el comportamiento normal de la función.
Comprobemos el trabajo de CryptDecode utilizando el mismo script CryptDecode.mq5.
En los parámetros de entrada puede especificar el texto o el archivo que desea convertir. El texto siempre está implícito en la codificación Base64, ya que todos los datos codificados están en formato binario y no se admiten en los parámetros input. El método de conversión se selecciona en la lista Method.
input string Text; // Text (base64, or empty to process File)
|
Los métodos de cifrado requieren una clave que puede especificarse como una cadena en el campo CustomKey si GenerateKey contiene la opción DUMMY_KEY_CUSTOM. También puede generar una clave demo de la longitud requerida a partir de la enumeración DUMMY_KEY_LENGTH (es la misma que en el script CryptEncode.mq5).
input DUMMY_KEY_LENGTH GenerateKey = DUMMY_KEY_CUSTOM; // GenerateKey (length, or from CustomKey)
|
En GenerateKey y CustomKey, debe elegir los mismos valores que al lanzar CryptEncode.mq5.
El algoritmo en OnStart comienza con una descripción de los arrays necesarios y la obtención de una clave a partir de una cadena o por simple generación (sólo para una demostración, utilice software o algoritmos especiales para generar una clave cripto-resistente que funcione).
void OnStart()
|
A continuación, leemos el contenido del archivo o descodificamos Base64 desde el campo Text (dependiendo de lo que se haya rellenado) para obtener los datos que se van a procesar.
method = (ENUM_CRYPT_METHOD)Method;
|
Si el usuario intenta recuperar datos del hash, mostraremos una advertencia.
if(IS_HASH(method))
|
Por último, realizamos directamente la desencriptación o descompresión (unpacking). En el caso de un texto, el resultado simplemente se registra. En el caso de un archivo, añadimos la extensión «.dec» al nombre y escribimos un nuevo archivo: puede compararse con el original, que se procesó mediante el script CryptEncode.mq5.
ResetLastError();
|
Si ejecuta el script con la configuración predeterminada, intentará descodificar el archivo MQL5Book/clock10.htm.BASE64. Se supone que se creó durante los experimentos de la sección anterior, por lo que el proceso debería tener éxito.
- CRYPT_BASE64, key required: false
|
El archivo clock10.htm.BASE64.dec obtenido es completamente idéntico al original clock10.htm. Lo mismo debería ocurrir si descifra archivos con extensiones AES128, AES256 o DES, siempre que especifique la misma clave que la utilizada al cifrar.
Para mayor claridad, comprobemos el descifrado del texto. Anteriormente, el cifrado de una frase conocida mediante el método AES128 producía un binario que, por comodidad, se convertía en la cadena Base64 siguiente:
AQuvVCoSy1szaN8Owy8tQxl9rIrRj9hOqK7KgYYGh9E= |
Vamos a introducirla en el campo Text y a seleccionar AES128 en la lista desplegable Method. Veremos los siguientes registros:
CustomKey=My top secret key is very strong / ok Key (bytes): [00] 4D | 79 | 20 | 74 | 6F | 70 | 20 | 73 | 65 | 63 | 72 | 65 | 74 | 20 | 6B | 65 | [16] 79 | 20 | 69 | 73 | 20 | 76 | 65 | 72 | 79 | 20 | 73 | 74 | 72 | 6F | 6E | 67 | - CRYPT_AES128, key required: true Text=AQuvVCoSy1szaN8Owy8tQxl9rIrRj9hOqK7KgYYGh9E= / ok StringToCharArray(Text,base64,0,-1,CP_UTF8)=44 / ok Text (bytes): [00] 41 | 51 | 75 | 76 | 56 | 43 | 6F | 53 | 79 | 31 | 73 | 7A | 61 | 4E | 38 | 4F | [16] 77 | 79 | 38 | 74 | 51 | 78 | 6C | 39 | 72 | 49 | 72 | 52 | 6A | 39 | 68 | 4F | [32] 71 | 4B | 37 | 4B | 67 | 59 | 59 | 47 | 68 | 39 | 45 | 3D | CryptDecode(CRYPT_BASE64,base64,dummy,data)=32 / ok Raw data to decipher (after de-base64): [00] 01 | 0B | AF | 54 | 2A | 12 | CB | 5B | 33 | 68 | DF | 0E | C3 | 2F | 2D | 43 | [16] 19 | 7D | AC | 8A | D1 | 8F | D8 | 4E | A8 | AE | CA | 81 | 86 | 06 | 87 | D1 | CryptDecode(method,data,key,result)=32 / ok Text restored: Let's encrypt this message |
El mensaje se ha descifrado correctamente.
Si, con el mismo texto de entrada, elige generar una clave arbitraria (aunque de longitud suficiente), obtendrá un galimatías en lugar de un mensaje.
Key (bytes): [00] 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | - CRYPT_AES128, key required: true Text=AQuvVCoSy1szaN8Owy8tQxl9rIrRj9hOqK7KgYYGh9E= / ok StringToCharArray(Text,base64,0,-1,CP_UTF8)=44 / ok Text (bytes): [00] 41 | 51 | 75 | 76 | 56 | 43 | 6F | 53 | 79 | 31 | 73 | 7A | 61 | 4E | 38 | 4F | [16] 77 | 79 | 38 | 74 | 51 | 78 | 6C | 39 | 72 | 49 | 72 | 52 | 6A | 39 | 68 | 4F | [32] 71 | 4B | 37 | 4B | 67 | 59 | 59 | 47 | 68 | 39 | 45 | 3D | CryptDecode(CRYPT_BASE64,base64,dummy,data)=32 / ok Raw data to decipher (after de-base64): [00] 01 | 0B | AF | 54 | 2A | 12 | CB | 5B | 33 | 68 | DF | 0E | C3 | 2F | 2D | 43 | [16] 19 | 7D | AC | 8A | D1 | 8F | D8 | 4E | A8 | AE | CA | 81 | 86 | 06 | 87 | D1 | CryptDecode(method,data,key,result)=32 / ok Text restored: ??? ?L?? ??J Q+?]?v?9?????n?N?Ű |
El programa se comportará de forma similar si confunde el método de encriptación.
No tiene sentido elegir métodos de "unhashing": INVALID_PARAMETER (4003).
- CRYPT_HASH_MD5, key required: false
|
Un intento de descomprimir (CRYPT_ARCH_ZIP) algo que no es un bloque «deflate» comprimido dará como resultado INTERNAL_ERROR (4001). Se puede obtener el mismo error si se activa la opción de omitir CRC para el «archivo» sin él o, a la inversa, se descomprimen los datos sin la opción, aunque el empaquetado se haya realizado con ella.