Discussão do artigo "Implementação do algoritmo criptográfico SHA-256 do zero em MQL5"

 

Novo artigo Implementação do algoritmo criptográfico SHA-256 do zero em MQL5 foi publicado:

Criar integrações com bolsas de criptomoedas sem arquivos DLL foi, por muito tempo, uma tarefa complexa, mas esta solução fornece uma base completa para conexão direta ao mercado.

Ao implementar o SHA-256 em um ambiente de trading, a otimização da eficiência torna-se um fator decisivo, pois cada milissegundo pode afetar os resultados das negociações. A implementação personalizada oferece diversas maneiras de otimizar o desempenho que seriam impossíveis ao usar funções integradas.

Os sistemas de trading frequentemente apresentam padrões específicos em suas operações criptográficas. Por exemplo, as assinaturas de ordens normalmente contêm componentes semelhantes, como carimbos de tempo, símbolos e quantidades. Compreendendo esses padrões, podemos otimizar nossa implementação de SHA-256 de forma específica para estruturas de dados relacionadas ao trading.

Vejamos como ocorre o envio de ordens em um cenário típico de negociação. Para cada ordem, são necessários vários fragmentos de informação: o par de moedas, o tipo de ordem, a quantidade, o preço e o carimbo de tempo. Em implementações padrão, esses dados seriam processados como novas entradas a cada vez. No entanto, podemos otimizar esse processo reconhecendo que muitos componentes permanecem inalterados ou seguem padrões previsíveis.


Autor: Abdulkudus Okatengwu Kadir

 

Se o key_text tiver mais de 64 caracteres, o HMacSha256 fará o cálculo incorretamente. O que deve ser corrigido nesse caso?

 
Sergey Zhilinskiy #:

Se o key_text tiver mais de 64 caracteres, o HMacSha256 fará o cálculo incorretamente. O que deve ser corrigido nesse caso?

Minha implementação atual se adapta a chaves com mais de 64 caracteres. Você tem algum par específico de chave e mensagem para o qual ele não funcionou?

 
Abdulkudus Okatengwu Kadir #:

Minha implementação atual se adapta a chaves com mais de 64 caracteres. Você tem algum par específico de chave e mensagem para o qual isso não funcionou?

string text = "Hello";

string key_text = "1234567890123456789012345678901234567890123456789012345678901234";

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

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

if string key_text = "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 #:

string text = "Hello";

string key_text = "1234567890123456789012345678901234567890123456789012345678901234";

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

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

if string key_text = "123456789012345678901234567890123456789012345678901234567890123" - OK

Acabei de experimentar em meu terminal e obtive o mesmo resultado que a ferramenta de hash on-line:

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

usando o código abaixo:
void Hash()
{
   // O texto a ser processado em hash
   string text = "Hello";
   string key_text = "1234567890123456789012345678901234567890123456789012345678901234";
   HMacSha256 myhash(key_text, text);
   Print(myhash.hexval);
}
Talvez você queira compartilhar seu código.

 

Sim, ele funciona corretamente com o Sha256Algorithm.mqh original. Fiz algumas alterações, talvez seja por isso que não funcionou?

 string CSha256Class::GetHex( void )
  {
   string result  = "" ;
 /*
 result += UintToHex(h0);
 result += UintToHex(h1);
 result += UintToHex(h2);
 result += UintToHex(h3);
 result += UintToHex(h4);
 result += UintToHex(h5);
 result += UintToHex(h6);
 result += 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);
  }

Desculpe-me por incomodá-lo!

 
Há uma implementação de SHA256, SHA384, SHA512 no kodobase, que também funciona na MQL5.
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.