Discusión sobre el artículo "Implementación del algoritmo criptográfico SHA-256 desde cero en MQL5"

 

Artículo publicado Implementación del algoritmo criptográfico SHA-256 desde cero en MQL5:

La creación de integraciones de intercambio de criptomonedas sin DLL ha sido durante mucho tiempo un reto, pero esta solución proporciona un marco completo para la conectividad directa con el mercado.

Al implementar SHA-256 en un entorno comercial, la optimización del rendimiento se vuelve crucial, ya que cada milisegundo puede afectar los resultados comerciales. Una implementación personalizada ofrece varias vías de optimización que no serían posibles con las funciones integradas.

Los sistemas de comercio a menudo exhiben patrones específicos en sus operaciones criptográficas.m Por ejemplo, las firmas de pedidos suelen contener componentes similares, como marcas de tiempo, símbolos y cantidades. Al comprender estos patrones, podemos optimizar nuestra implementación de SHA-256 específicamente para estructuras de datos relacionadas con el comercio.

Considere cómo funciona la colocación de órdenes en un escenario comercial típico. Cada orden requiere varios datos: el par comercial, el tipo de orden, la cantidad, el precio y la marca de tiempo. En implementaciones estándar, estos datos se procesarían como una entrada completamente nueva cada vez. Sin embargo, podemos optimizar este proceso reconociendo que muchos componentes permanecen constantes o siguen patrones predecibles.


Autor: Abdulkudus Okatengwu Kadir

 

Si key_text tiene más de 64 caracteres, entonces HMacSha256 calcula incorrectamente. ¿Qué hay que corregir para esto?

 
Sergey Zhilinskiy #:

Si key_text tiene más de 64 caracteres, entonces HMacSha256 calcula incorrectamente. ¿Qué hay que corregir para esto?

Mi implementación actual se adapta a claves con más de 64 caracteres de longitud. ¿Tiene algún par clave-mensaje específico para el que no funcione?

 
Abdulkudus Okatengwu Kadir #:

Mi implementación actual se adapta a claves con más de 64 caracteres de longitud. Tiene algún par clave-mensaje específico para el que no funcione?

string texto = "Hola";

string clave_texto = "1234567890123456789012345678901234567890123456789012345678901234";

https://www.devglan.com/online-tools/hmac-sha256-online -> 7558a77ff19ed6cb4777355e4bbc4772759a8130e1bb0913ba62b88411fdbaf8

Script de prueba -> 2025.02.27 22:28:43.792 Sha256TestFile (EURUSD,M5) 6d8ee9dc1d16261fd986fafb97d919584aa206ca76706fb3deccc63ab2b7f6b

if cadena texto_clave = "123456789012345678901234567890123456789012345678901234567890123" - OK
HMAC-SHA256 Hash Generator | Devglan
  • DevGlan
  • www.devglan.com
HMAC is a message authentication code (MAC) using a hash function. It combines with any cryptographic hash function, for example, md5, sha1, sha256. Hash function is wrapped to a class as one template parameter in HMAC and the wrapper class only has a static function involving...
 
Sergey Zhilinskiy #:

cadena texto = "Hola";

cadena clave_texto = "1234567890123456789012345678901234567890123456789012345678901234";

https://www.devglan.com/online-tools/hmac-sha256-online -> 7558a77ff19ed6cb4777355e4bbc4772759a8130e1bb0913ba62b88411fdbaf8

Script de prueba -> 2025.02.27 22:28:43.792 Sha256TestFile (EURUSD,M5) 6d8ee9dc1d16261fd986fafb97d919584aa206ca76706fb3deccc63ab2b7f6b

if cadena texto_clave = "123456789012345678901234567890123456789012345678901234567890123" - OK

Acabo de probarlo en mi terminal y me da lo mismo que la herramienta de hash online:

2025.02.28 12:37:16.468 hashin_example_code (EURUSD,M5) 7558A77FF19ED6CB4777355E4BBC4772759A8130E1BB0913BA62B88411FDBAF8

utilizando el código siguiente:
void Hash()
{
   // El texto a hash
   string text = "Hello";
   string key_text = "1234567890123456789012345678901234567890123456789012345678901234";
   HMacSha256 myhash(key_text, text);
   Print(myhash.hexval);
}
Si lo desea, puede compartir su código.

 

Sí, funciona correctamente con el Sha256Algorithm.mqh original. Hice algunos cambios, ¿quizás por eso no funcionaba?

 string CSha256Class::GetHex( void )
  {
   string result  = "" ;
 /*
 resultado += UintToHex(h0);
 resultado += UintToHex(h1);
 resultado += UintToHex(h2);
 resultado += UintToHex(h3);
 resultado += UintToHex(h4);
 resultado += UintToHex(h5);
 resultado += UintToHex(h6);
 resultado += UintToHex(h7);
*/ 
   result += StringFormat ( "%.2x" ,h0);
   result += StringFormat ( "%.2x" ,h1);
   result += StringFormat ( "%.2x" ,h2);
   result += StringFormat ( "%.2x" ,h3);
   result += StringFormat ( "%.2x" ,h4);
   result += StringFormat ( "%.2x" ,h5);
   result += StringFormat ( "%.2x" ,h6);
   result += StringFormat ( "%.2x" ,h7);

   return (result);
  }

¡Perdón por la molestia!

 
Hay una implementación de SHA256, SHA384, SHA512 en kodobase, funciona en MQL5 también.
SHA256, SHA384 and SHA512 + HMAC
SHA256, SHA384 and SHA512 + HMAC
  • www.mql5.com
Many developers need these functions, while working with different kinds of external APIs, like Bitcoin and altcoin exchanges where it is often necessary to send data with the confirmation of parameters validity through HMAC-SHA512, HMAC-SHA384 and HMAC-SHA256.