English Русский 日本語
preview
Erforschung der Kryptographie in MQL5: Ein Schritt-für-Schritt-Ansatz

Erforschung der Kryptographie in MQL5: Ein Schritt-für-Schritt-Ansatz

MetaTrader 5Integration | 24 Januar 2025, 08:48
106 0
Saif Akhlaq
Saif Akhlaq

Einführung

In der sich ständig weiterentwickelnden Landschaft des algorithmischen Handels hat die Schnittstelle zwischen Finanzen und Technologie neue Horizonte für Händler und Entwickler gleichermaßen eröffnet. Da wir die Grenzen dessen, was bei automatisierten Handelssystemen möglich ist, immer weiter ausdehnen, hat ein Bereich, in dem die Einbeziehung von Kryptographie in Handelsalgorithmen eine bedeutende Rolle spielt, stark an Bedeutung gewonnen. Die Kryptographie, die früher ausschließlich der sicheren Kommunikation und dem Datenschutz vorbehalten war, hält nun Einzug in die Arsenale versierter Händler, die den Wert der Sicherung ihrer Handelsstrategien und sensiblen Daten erkannt haben.

In diesem Artikel tauchen wir tief in die Welt der Kryptographie innerhalb der MQL5-Programmierumgebung ein. Aufbauend auf den Grundkenntnissen des algorithmischen Handels und der MQL5-Programmierung untersuchen wir, wie kryptografische Funktionen die Sicherheit und Funktionalität Ihrer Handelsalgorithmen verbessern können. Wir werden die wichtigsten kryptographischen Methoden, die in MQL5 verfügbar sind, analysieren, ihre Anwendungen verstehen und demonstrieren, wie sie effektiv in Ihre Handelsstrategien implementiert werden können.

Wir werden uns mit folgenden Themen befassen:

  1. Verständnis der Kryptographie im algorithmischen Handel
  2. Kryptographische Methoden in MQL5
  3. Die Funktionen CryptEncode und CryptDecode
  4. Praktische Anwendungen und Beispiele
  5. Sichere Signalübertragung per E-Mail
  6. Fortgeschrittene Techniken und bewährte Praktiken
  7. Schlussfolgerung

Am Ende dieses Artikels werden Sie ein solides Verständnis dafür haben, wie Sie die Kryptographie in MQL5 nutzen können, um Ihre Handelsalgorithmen zu sichern, sensible Daten zu schützen und sich möglicherweise einen Wettbewerbsvorteil auf dem Markt zu verschaffen.



Verständnis der Kryptographie im algorithmischen Handel

Bevor wir uns mit den technischen Aspekten befassen, ist es wichtig zu verstehen, warum Kryptographie beim algorithmischen Handel wichtig ist. Im Kern ist die Kryptografie die Wissenschaft der Informationssicherheit, die sicherstellt, dass Daten vertraulich, vollständig und authentisch bleiben. Im Zusammenhang mit Handelsalgorithmen erfüllt die Kryptographie mehrere Zwecke:

  • Schutz des geistigen Eigentums: Ihre Handelsalgorithmen sind ein wertvolles Gut. Die Verschlüsselung Ihres Codes oder bestimmter Komponenten kann unbefugten Zugriff oder Reverse Engineering verhindern.
  • Sicherung der Datenübertragung: Wenn Ihre Algorithmen mit externen Diensten kommunizieren, sorgt die Verschlüsselung dafür, dass sensible Daten wie API-Schlüssel oder Kontoinformationen sicher bleiben.
  • Überprüfung der Datenintegrität: Mit Hilfe von Hash-Funktionen kann überprüft werden, dass Daten nicht manipuliert wurden, um die Zuverlässigkeit von Signalen oder Dateneinspeisungen zu gewährleisten.

In einem Umfeld, in dem Millisekunden den Unterschied ausmachen können und in dem geschützte Strategien streng gehütete Geheimnisse sind, kann der Einsatz von Kryptographie einen entscheidenden Unterschied machen.



Kryptographische Methoden in MQL5

MQL5 bietet eine Reihe von kryptografischen Funktionen, mit denen Entwickler Verschlüsselung, Hashing und Datenkompression implementieren können. Das Verständnis dieser Methoden ist entscheidend für die effektive Integration von Kryptographie in Ihre Handelsalgorithmen.

Überblick über die verfügbaren Methoden: Die kryptographischen Funktionen von MQL5 drehen sich um zwei Hauptoperationen: CryptEncode und CryptDecode. Diese Funktionen unterstützen verschiedene Methoden, die in der Aufzählung ENUM_CRYPT_METHOD definiert sind. Lassen Sie uns diese Methoden untersuchen:
  1. Verschlüsselungsmethoden:

    • DES (Data Encryption Standard): Ein älterer symmetrischer Schlüsselalgorithmus, der einen 56-Bit-Schlüssel verwendet. Obwohl sie historisch bedeutsam ist, gilt sie nach heutigen Maßstäben als weniger sicher.
    • AES (Advanced Encryption Standard):
      • AES128: Verwendet einen 128-Bit-Schlüssel.
      • AES256: Verwendet einen 256-Bit-Schlüssel. Bietet aufgrund der längeren Schlüssellänge ein höheres Maß an Sicherheit.
  2. Hashing-Methoden:

    • MD5 (Message-Digest Algorithm 5): Erzeugt einen 128-Bit-Hash-Wert. Weit verbreitet, gilt aber als anfällig für Kollisionsangriffe.
    • SHA1 (Secure Hash Algorithm 1): Erzeugt einen 160-Bit-Hash. Gilt aufgrund von Schwachstellen auch als weniger sicher.
    • SHA256: Gehört zur SHA-2-Familie und erzeugt einen 256-Bit-Hash. Gilt derzeit für die meisten Anwendungen als sicher.
  3. Datenkodierung und -komprimierung:

    • Base64: Kodiert binäre Daten in ASCII-Zeichen. Nützlich zum Einbetten von Binärdaten in Textformate.
    • ZIP-Komprimierung (Deflate): Komprimiert Daten mit dem Deflate-Algorithmus. Hilfreich bei der Reduzierung der Datenmenge.

Symmetrisch vs. symmetrisch verstehen. Asymmetrische Verschlüsselung: Es ist wichtig zu wissen, dass die eingebauten Funktionen von MQL5 symmetrische Verschlüsselungsmethoden unterstützen. Bei der symmetrischen Verschlüsselung wird derselbe Schlüssel sowohl für die Verschlüsselung als auch für die Entschlüsselung verwendet. Dies steht im Gegensatz zur asymmetrischen Verschlüsselung, bei der ein öffentlicher Schlüssel die Daten verschlüsselt und ein privater Schlüssel sie entschlüsselt.

Während die symmetrische Verschlüsselung schneller und weniger ressourcenintensiv ist, wird die Schlüsselverwaltung kritisch, da der Schlüssel vertraulich bleiben muss. Bei Handelsanwendungen bedeutet dies in der Regel, dass der Schlüssel sicher in Ihrer Anwendung gespeichert oder sicher von einer externen Quelle abgerufen wird.



Die Funktionen CryptEncode und CryptDecode

Das Herz der Kryptographie in MQL5 liegt in den Funktionen CryptEncode und CryptDecode. Mit diesen Funktionen können Sie Daten mit den besprochenen Methoden umwandeln.

CryptEncode Funktion:

int CryptEncode(
   ENUM_CRYPT_METHOD method,
   const uchar &data[],
   const uchar &key[],
   uchar &result[]
);
  • method: Die zu verwendende kryptografische Methode.
  • data: Die zu transformierenden Originaldaten.
  • key: Der Schlüssel für Verschlüsselungsmethoden (kann bei Hashing und Base64 leer sein).
  • result: Das Array, in dem die transformierten Daten gespeichert werden sollen.

Wichtige Punkte:

  • Verschlüsselungsmethoden: Einen Schlüssel mit einer bestimmten Länge verlangen (z. B. 16 Byte für AES128).
  • Hashing-Methoden: Sie benötigen keinen Schlüssel.
  • Base64 und Komprimierung: Sie benötigen auch keinen Schlüssel, können aber Optionen über den Schlüsselparameter akzeptieren.
CryptDecode Funktion:

int CryptDecode(
   ENUM_CRYPT_METHOD method,
   const uchar &data[],
   const uchar &key[],
   uchar &result[]
);
  • method: Die kryptografische Methode zur Umkehrung.
  • data: Die zu dekodierenden transformierten Daten.
  • key: Der bei der Verschlüsselung verwendete Schlüssel (muss übereinstimmen).
  • result: Das Array, in dem die ursprünglichen Daten wiederhergestellt werden sollen.

Wichtige Punkte:

  • Symmetrische Verschlüsselung: Für die Kodierung und Dekodierung muss derselbe Schlüssel verwendet werden.
  • Unumkehrbare Methoden: Hashing-Funktionen können nicht entschlüsselt werden.

Praktische Überlegungen:
  • Schlüsselverwaltung: Die sichere Aufbewahrung und Verwaltung von Schlüsseln ist entscheidend. Die Hardcodierung von Schlüsseln kann riskant sein, wenn keine zusätzlichen Schutzmaßnahmen vorhanden sind.
  • Fehlerbehandlung: Überprüfen Sie immer die Rückgabewerte dieser Funktionen. Ein Rückgabewert von 0 bedeutet, dass ein Fehler aufgetreten ist.
  • Datenarten: Daten werden in Byte-Arrays (uchar) verarbeitet. Seien Sie vorsichtig bei der Konvertierung zwischen Strings und Byte-Arrays, insbesondere bei der Zeichenkodierung.

Einfache Beispiele

Um unser Verständnis zu festigen, wollen wir praktische Beispiele für die Verwendung dieser Funktionen in MQL5-Skripten untersuchen.

Beispiel 1: Verschlüsseln und Entschlüsseln einer Nachricht mit AES

Angenommen, wir wollen eine vertrauliche Nachricht verschlüsseln, bevor wir sie in einer Datei speichern oder über ein Netzwerk versenden.

Verschlüsselungs-Skript:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string message = "Confidential Trade Parameters";
   uchar key[16];
   uchar data[];
   uchar encrypted[];
   
   // Generate a 16-byte key (In practice, use a secure key)
   for(int i = 0; i < 16; i++)
      key[i] = (uchar)(i + 1);
   
   // Convert message to byte array
   StringToCharArray(message, data, 0, StringLen(message), CP_UTF8);
   
   // Encrypt the data
   if(CryptEncode(CRYPT_AES128, data, key, encrypted) > 0)
   {
      Print("Encryption successful.");
      // Save or transmit 'encrypted' array
   }
   else
   {
      Print("Encryption failed. Error code: ", GetLastError());
   }
}

Entschlüsselungs-Skript:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uchar key[16];
   uchar encrypted[]; // Load encrypted data
   uchar decrypted[];
   
   // Generate the same 16-byte key
   for(int i = 0; i < 16; i++)
      key[i] = (uchar)(i + 1);
   
   // Decrypt the data
   if(CryptDecode(CRYPT_AES128, encrypted, key, decrypted) > 0)
   {
      string message = CharArrayToString(decrypted, 0, -1, CP_UTF8);
      Print("Decryption successful: ", message);
   }
   else
   {
      Print("Decryption failed. Error code: ", GetLastError());
   }
}

Erläuterung:

  • Schlüsselgeneration: Zur Demonstration erzeugen wir einen einfachen Schlüssel. In einem realen Szenario sollten Sie einen sicheren, zufälligen Schlüssel verwenden.
  • Datenkonvertierung: Wir konvertieren die Text-Nachricht in ein Byte-Array für die Verschlüsselung.
  • Fehlerüberprüfung: Wir überprüfen, ob die Verschlüsselung/Entschlüsselung erfolgreich war.
Beispiel 2: Hashing von Daten mit SHA256


Hashing ist nützlich, um die Integrität von Daten zu überprüfen, ohne den ursprünglichen Inhalt preiszugeben.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string dataToHash = "VerifyThisData";
   uchar data[];
   uchar hash[];
   
   // Convert string to byte array
   StringToCharArray(dataToHash, data, 0, StringLen(dataToHash), CP_UTF8);
   
   // Compute SHA256 hash
   if(CryptEncode(CRYPT_HASH_SHA256, data, NULL, hash) > 0)
   {
      // Convert hash to hexadecimal string for display
      string hashString = "";
      for(int i = 0; i < ArraySize(hash); i++)
         hashString += StringFormat("%02X", hash[i]);
      
      Print("SHA256 Hash: ", hashString);
   }
   else
   {
      Print("Hashing failed. Error code: ", GetLastError());
   }
}

Erläuterung:

  • Kein Schlüssel erforderlich: Hashing-Funktionen benötigen keinen Schlüssel.
  • Hash-Anzeige: Zur besseren Lesbarkeit wird das Hash-Byte-Array in eine hexadezimale Zeichenfolge umgewandelt.

Beispiel 3: Kodierung von Daten mit Base64

Die Base64-Kodierung ist praktisch, wenn Sie binäre Daten in textbasierte Formate wie JSON oder XML einfügen müssen.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string binaryData = "BinaryDataExample";
   uchar data[];
   uchar base64[];
   
   // Convert string to byte array
   StringToCharArray(binaryData, data, 0, StringLen(binaryData), CP_UTF8);
   
   // Encode with Base64
   if(CryptEncode(CRYPT_BASE64, data, NULL, base64) > 0)
   {
      string base64String = CharArrayToString(base64, 0, -1, CP_UTF8);
      Print("Base64 Encoded Data: ", base64String);
   }
   else
   {
      Print("Base64 Encoding failed. Error code: ", GetLastError());
   }
}

Erläuterung:

  • Textdarstellung: Base64 wandelt binäre Daten in eine ASCII-Zeichenkette um.
  • Häufige Anwendungsfälle: Einbettung von Bildern in HTML oder Übertragung von Binärdaten in textbasierten Protokollen.


Sichere Signalübertragung per E-Mail

In diesem Abschnitt werden wir ein detailliertes Beispiel untersuchen, bei dem ein Händler Handelssignale auf sichere Weise per E-Mail weitergeben muss. Die E-Mail-Kommunikation ist von Natur aus unsicher, und sensible Informationen können während der Übertragung abgefangen oder manipuliert werden. Um die Vertraulichkeit und Integrität der Signale zu schützen, werden wir Verschlüsselungs- und Hashing-Techniken unter Verwendung der kryptografischen Funktionen von MQL5 implementieren.

Überblick über das Szenario:

Angenommen, Sie sind ein professioneller Händler, der einer ausgewählten Gruppe von Kunden Handelssignale liefert. Sie senden diese Signale per E-Mail, die sensible Informationen wie Einstiegspunkte, Stop-Loss-Niveaus und Take-Profit-Ziele enthalten. Um unbefugten Zugriff zu verhindern und sicherzustellen, dass nur Ihre Kunden die Signale lesen können, müssen Sie die Nachrichten verschlüsseln. Außerdem wollen Sie sicherstellen, dass die Signale während der Übertragung nicht manipuliert werden, und fügen daher eine digitale Signatur mit einem Hash ein.

Zielsetzungen:
  • Vertraulichkeit: Verschlüsseln der Handelssignale, sodass nur autorisierte Kunden sie entschlüsseln und lesen können.
  • Integrität: Einfügen eines Hash in die Nachricht, um jegliche Manipulation zuerkennen.
  • Authentifizierung: Sicherstellen, dass die Signale tatsächlich von Ihnen und nicht von einem Betrüger stammen.

Überblick über die Lösung:

Wir verwenden AES256-Verschlüsselung, um den Inhalt der Nachricht zu sichern, und SHA256-Hashing, um eine digitale Signatur zu erstellen. Der Prozess umfasst:

  1. Generierung eines sicheren Schlüssels: Wir generieren einen starken Verschlüsselungscode und teilen ihn vorher auf sicherem Weg dem Kunden mit.
  2. Verschlüsselung des Signals: Vor dem Senden wird die Signalnachricht mit dem Algorithmus AES256 verschlüsselt.
  3. Erstellen eines Hashes: Wir werden einen SHA256-Hash der verschlüsselten Nachricht berechnen.
  4. Versenden der E-Mail: Wir senden die verschlüsselte Nachricht und den Hash per E-Mail an die Kunden.
  5. Client-Entschlüsselung: Die Clients verwenden den gemeinsamen Schlüssel, um die Nachricht zu entschlüsseln und den Hash zu überprüfen, um die Integrität sicherzustellen.

Generierung und Weitergabe des Verschlüsselungscodes - Schlüsselgenerierungsskript (KeyGenerator.mq5):

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uchar key[32];

   // Generate a secure random key
   for(int i = 0; i < 32; i++)
      key[i] = (uchar)MathRand();

   // Display the key in hexadecimal format
   string keyHex = "";
   for(int i = 0; i < 32; i++)
      keyHex += StringFormat("%02X", key[i]);

   Print("Generated Key (Hex): ", keyHex);

   // Save the key to a file (securely store this file)
   int fileHandle = FileOpen("encryption_key.bin", FILE_BIN|FILE_WRITE);
   if(fileHandle != INVALID_HANDLE)
   {
      FileWriteArray(fileHandle, key, 0, ArraySize(key));
      FileClose(fileHandle);
      Print("Key saved to encryption_key.bin");
   }
   else
   {
      Print("Failed to save the key. Error: ", GetLastError());
   }
}

Wichtiger Hinweis: Die Schlüsselverwaltung ist entscheidend. Der Schlüssel muss sicher generiert und über einen sicheren Kanal (z. B. persönliches Treffen, sichere Messaging-App) an die Kunden weitergegeben werden. Senden Sie den Schlüssel niemals per E-Mail.

Erläuterung:

  • Zufällige Schlüsselgenerierung: Wir erzeugen einen 32-Byte-Schlüssel mit MathRand(). Um die Zufälligkeit zu verbessern, sollten Sie einen sichereren Zufallszahlengenerator verwenden.
  • Schlüsseldarstellung: Wir geben den Schlüssel im hexadezimalen Format aus, um ihn zu speichern.
  • Schlüsselspeicher: Der Schlüssel wird in einer Binärdatei „encryption_key.bin“ gespeichert. Stellen Sie sicher, dass diese Datei sicher gespeichert und nur an autorisierte Personen weitergegeben wird.

Praktische Tipps:

  • Sicherer Zufall: Verwenden Sie einen kryptografisch sicheren Zufallszahlengenerator, falls verfügbar.
  • Schlüsselverteilung: Geben Sie den Schlüssel auf sichere Weise weiter. Übertragen Sie den Schlüssel nicht über unsichere Kanäle.

Verschlüsselung des Handelssignals - Signalverschlüsselungsscript (SignalSender.mq5):

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string signal = "BUY EURUSD at 1.12345\nSL: 1.12000\nTP: 1.13000";
   uchar data[];
   uchar key[32];
   uchar encrypted[];
   uchar hash[];
   uchar nullKey[];

   // Load the encryption key
   int fileHandle = FileOpen("encryption_key.bin", FILE_BIN|FILE_READ);
   if(fileHandle != INVALID_HANDLE)
   {
      FileReadArray(fileHandle, key, 0, 32);
      FileClose(fileHandle);
   }
   else
   {
      Print("Failed to load the encryption key. Error: ", GetLastError());
      return;
   }

   // Convert the signal to a byte array
   StringToCharArray(signal, data, 0, StringLen(signal), CP_UTF8);

   // Encrypt the signal
   int result = CryptEncode(CRYPT_AES256, data, key, encrypted);
   if(result <= 0)
   {
      Print("Encryption failed. Error code: ", GetLastError());
      return;
   }

   // Compute the hash of the encrypted signal
   result = CryptEncode(CRYPT_HASH_SHA256, encrypted, nullKey, hash);
   if(result <= 0)
   {
      Print("Hashing failed. Error code: ", GetLastError());
      return;
   }

   // Convert encrypted data and hash to Base64 for email transmission
   uchar base64Encrypted[], base64Hash[];
   CryptEncode(CRYPT_BASE64, encrypted, nullKey, base64Encrypted);
   CryptEncode(CRYPT_BASE64, hash, nullKey, base64Hash);

   string base64EncryptedStr = CharArrayToString(base64Encrypted, 0, WHOLE_ARRAY, CP_UTF8);
   string base64HashStr = CharArrayToString(base64Hash, 0, WHOLE_ARRAY, CP_UTF8);

   // Prepare the email content
   string emailSubject = "Encrypted Trading Signal";
   string emailBody = "Encrypted Signal (Base64):\n" + base64EncryptedStr + "\n\nHash (SHA256, Base64):\n" + base64HashStr;

   // Send the email (Assuming email settings are configured in MetaTrader)
   bool emailSent = SendMail(emailSubject, emailBody);
   if(emailSent)
   {
      Print("Email sent successfully.");
   }
   else
   {
      Print("Failed to send email. Error code: ", GetLastError());
   }
}

Erläuterung:

  • Laden des Schlüssels: Wir lesen den Verschlüsselungsschlüssel aus der Datei encryption_key.bin.
  • Signalumwandlung: Das Handelssignal wird in ein Byte-Array umgewandelt.
  • Verschlüsselung: Wir verwenden CRYPT_AES256, um das Signal mit dem Schlüssel zu verschlüsseln.
  • Hashing: Wir berechnen einen SHA256-Hash der verschlüsselten Daten, um die Integrität zu gewährleisten.
  • Base64-Kodierung: Sowohl die verschlüsselten Daten als auch der Hash werden in Base64 kodiert, um sie E-Mail-freundlich zu machen.
  • E-Mail-Vorbereitung: Das verschlüsselte Signal und der Hash werden in den Text der E-Mail aufgenommen.
  • E-Mail-Versand: Wir verwenden SendMail, um die E-Mail zu versenden. Stellen Sie sicher, dass die E-Mail-Einstellungen in MetaTrader korrekt konfiguriert sind.

Praktische Tipps:

  • Fehlerbehandlung: Überprüfen Sie stets die Rückgabewerte kryptographischer Funktionen und behandeln Sie Fehler entsprechend.
  • E-Mail-Konfiguration: Stellen Sie sicher, dass die SMTP-Einstellungen im MetaTrader für die E-Mail-Funktionalität konfiguriert sind.
  • Base64-Kodierung: Erforderlich für die Übertragung von Binärdaten über textbasierte Protokolle wie E-Mail.

Client-Seite: Entschlüsselung des Signals - Client-Entschlüsselungsskript (SignalReceiver.mq5):

//+------------------------------------------------------------------+
//|                                               SignalReceiver.mq5 |
//|                                                      Sahil Bagdi |
//|                         https://www.mql5.com/en/users/sahilbagdi |
//+------------------------------------------------------------------+
#property copyright "Sahil Bagdi"
#property link      "https://www.mql5.com/en/users/sahilbagdi"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // Received Base64-encoded encrypted signal and hash from email
   string base64EncryptedStr = "Received encrypted signal in Base64";
   string base64HashStr = "Received hash in Base64";

   uchar key[32];
   uchar encrypted[];
   uchar hash[];
   uchar computedHash[];
   uchar decrypted[];
   uchar nullKey[];

   // Load the encryption key
   int fileHandle = FileOpen("encryption_key.bin", FILE_BIN|FILE_READ);
   if(fileHandle != INVALID_HANDLE)
   {
      FileReadArray(fileHandle, key, 0, 32);
      FileClose(fileHandle);
   }
   else
   {
      Print("Failed to load the encryption key. Error: ", GetLastError());
      return;
   }

   // Convert Base64 strings back to byte arrays
   uchar base64Encrypted[], base64Hash[];
   StringToCharArray(base64EncryptedStr, base64Encrypted, 0, WHOLE_ARRAY, CP_UTF8);
   StringToCharArray(base64HashStr, base64Hash, 0, WHOLE_ARRAY, CP_UTF8);

   // Decode Base64 to get encrypted data and hash
   CryptDecode(CRYPT_BASE64, base64Encrypted, nullKey, encrypted);
   CryptDecode(CRYPT_BASE64, base64Hash, nullKey, hash);

   // Compute hash of the encrypted data
   int result = CryptEncode(CRYPT_HASH_SHA256, encrypted, nullKey, computedHash);
   if(result <= 0)
   {
      Print("Hashing failed. Error code: ", GetLastError());
      return;
   }

   // Compare the computed hash with the received hash
   if(ArrayCompare(hash, computedHash) != 0)
   {
      Print("Signal integrity compromised!");
      return;
   }
   else
   {
      Print("Signal integrity verified.");
   }

   // Decrypt the signal
   result = CryptDecode(CRYPT_AES256, encrypted, key, decrypted);
   if(result <= 0)
   {
      Print("Decryption failed. Error code: ", GetLastError());
      return;
   }

   // Convert decrypted data back to string
   string signal = CharArrayToString(decrypted, 0, result, CP_UTF8);
   Print("Decrypted Trading Signal:\n", signal);

   // Now you can act upon the trading signal
}

Erläuterung:

  • Laden des Schlüssels: Der Client lädt denselben Verschlüsselungscode.
  • Base64-Dekodierung: Das Base64-kodierte verschlüsselte Signal und der Hash werden wieder in Byte-Arrays umgewandelt.
  • Hash-Verifizierung: Wir berechnen den Hash-Wert der verschlüsselten Daten und vergleichen ihn mit dem empfangenen Hash-Wert, um die Integrität zu überprüfen.
  • Entschlüsselung: Wenn der Hash übereinstimmt, wird das Signal mit CryptDecode entschlüsselt.
  • Signalabfrage: Die entschlüsselten Daten werden zur Verwendung wieder in eine Zeichenkette umgewandelt.

Zu beachtende Punkte

Stellen Sie sich vor, Sie senden eine wichtige Nachricht - sei es eine persönliche Notiz oder eine Geschäftskorrespondenz - über einen digitalen Kanal anstelle eines herkömmlichen Papierumschlags. Um sie vor neugierigen Blicken zu schützen, kommen Verschlüsselung und Hashing als leistungsfähige Schutzmaßnahmen ins Spiel. Bei der Verschlüsselung wird der Inhalt verschlüsselt, sodass die Nachricht, selbst wenn sie abgefangen wird, unlesbar bleibt. Das Hashing hingegen stellt sicher, dass der Empfänger überprüfen kann, ob die Nachricht unterwegs verändert wurde, ähnlich wie ein einzigartiges Siegel, das die Authentizität bestätigt.

Stellen wir uns einmal vor, wie dies in der Praxis funktioniert:

  1. Sichere Schlüsselspeicherung: Stellen Sie sich vor, Sie lassen den Schlüssel zu Ihrem Tresor zu Hause unter der Fußmatte liegen. Nicht gerade die sicherste Idee, oder? Das Gleiche gilt für Verschlüsselungsschlüssel - sie müssen sicher aufbewahrt werden, um Unbefugte fernzuhalten. Wenn ein Schlüssel leicht zugänglich ist, ist es so gut, als würde man die Tür unverschlossen lassen.

  2. Hash-Verifizierung: Nehmen wir an, Sie versenden ein wichtiges Paket per Kurier, mit einem eindeutigen Tracking-Code, den der Empfänger überprüfen kann. Ebenso bestätigt die Hash-Verifizierung, dass Ihre Daten während der Übertragung nicht manipuliert wurden. Wenn unterwegs Änderungen an den Daten vorgenommen werden, zeigt der Hash dies an und warnt Sie vor möglichen Manipulationen.

  3. Schlüsselverwaltung: Stellen Sie sich vor, Sie verschicken Ihren Hausschlüssel auf einer Postkarte an einen Freund - riskant, oder? In der Kryptografie ist die Schlüsselverwaltung von entscheidender Bedeutung, d. h., dass Verschlüsselungsschlüssel nur über sichere Kanäle versandt werden sollten, um ein Abfangen oder eine Kompromittierung zu vermeiden.

  4. Regelmäßige Schlüssel-Updates: Jahrelang denselben Schlüssel zu nutzen ist so, als würde man nie die Türschlösser wechseln. Eine regelmäßige Aktualisierung der Verschlüsselungsschlüssel trägt zur Risikominderung bei und sorgt dafür, dass Ihre Daten optimal geschützt sind.

Zur Erhöhung der Sicherheit kann die asymmetrische Verschlüsselung (wie digitale Signaturen) die Authentizität überprüfen, ähnlich wie ein einzigartiger Stempel, der beweist, dass die Nachricht wirklich von Ihnen stammt. MQL5 unterstützt diese Funktion zwar nicht von Haus aus, aber externe Bibliotheken können bei der Implementierung helfen.


Fortgeschrittene Techniken und bewährte Praktiken

Lassen Sie uns nun einige fortgeschrittene Tipps und bewährte Verfahren für die Verwendung von Kryptografie in MQL5 erkunden:

  • Sichere Verwaltung von Schlüsseln: Eine wirksame Schlüsselverwaltung ist von zentraler Bedeutung für die Sicherheit. Bedenken Sie:

    • Sichere Verwahrung: Vermeiden Sie die Festcodierung von Schlüsseln im Code. Speichern Sie sie in verschlüsselten Dateien oder holen Sie sie aus sicheren Quellen.
    • Dynamische Schlüssel: Generierung von Schlüsseln zur Laufzeit mit sicheren Zufallszahlengeneratoren.
    • Regelmäßige Rotation der Schlüssel: Wechseln Sie die Schlüssel regelmäßig, um das Risiko einer Kompromittierung zu minimieren.
  • Kombination von kryptographischen Methoden: Verbessern Sie den Schutz durch die Kombination kryptografischer Ansätze:

    • Verschlüsseln und Hash: Berechnen Sie nach der Verschlüsselung einen Hash des verschlüsselten Textes, damit Sie bei der Entschlüsselung die Integrität der Daten bestätigen können.
    • Komprimieren vor Verschlüsseln: Die Komprimierung von Daten vor der Verschlüsselung verringert ihre Größe und fügt eine weitere Ebene der Komplexität hinzu.
  • Fehlerbehandlung und Fehlersuche: Kryptografische Funktionen können aus verschiedenen Gründen fehlschlagen, weshalb eine robuste Fehlerbehandlung unerlässlich ist:

    • Ungültige Parameter: Vergewissern Sie sich, dass die Schlüssel die richtige Länge haben und die Datenarrays richtig initialisiert sind.
    • Unzureichender Speicher: Große Datenarrays können zu Speicherproblemen führen.
    • Verwendung von GetLastError(): Verwenden Sie GetLastError(), um auf Fehlercodes zuzugreifen und Probleme effektiv zu beheben.
  • Leistungsanalyse: Kryptografische Prozesse können ressourcenintensiv sein, weshalb ein Gleichgewicht zwischen Sicherheit und Effizienz entscheidend ist:

    • Verarbeitungsaufwand: Verschlüsselung und Hashing erfordern Rechenleistung, daher sollten Sie sich auf den Schutz sensibler Daten beschränken.
    • Wahl des Algorithmus: Entscheiden Sie sich für schnellere Algorithmen (z. B. AES128 gegenüber AES256), wo immer dies möglich ist, um ein Gleichgewicht zwischen Sicherheit und Leistung herzustellen.

Diese Methoden wirken wie robuste Schlösser und machen die Kryptografie zu einem mächtigen Schutzschild, das Ihre Daten vor unbefugtem Zugriff schützt.


Schlussfolgerung

Die Kryptographie ist ein leistungsfähiges Instrument im Bereich des algorithmischen Handels und bietet Lösungen für die Sicherheit, Integrität und Vertraulichkeit von Daten. Durch die Integration von kryptografischen Methoden in Ihre MQL5-Programme können Sie Ihre Handelsalgorithmen absichern, sensible Daten schützen und die Zuverlässigkeit Ihrer Handelssysteme erhöhen.

In diesem Artikel haben wir die verschiedenen in MQL5 verfügbaren kryptografischen Funktionen untersucht, uns mit praktischen Beispielen befasst und fortgeschrittene Techniken und bewährte Verfahren diskutiert. Zu den wichtigsten Erkenntnissen gehören:

  • Kryptographische Methoden verstehen: Kenntnis der Stärken und Anwendungen der verschiedenen Algorithmen.
  • Implementierung von CryptEncode und CryptDecode: Effektive Nutzung dieser Funktionen zur sicheren Datenumwandlung.
  • Sichere Schlüsselverwaltung: Erkennen der Bedeutung des Schutzes kryptographischer Schlüssel.
  • Praktische Anwendungen: Anwendung der Kryptographie auf reale Handelsszenarien für mehr Sicherheit.

Mit der weiteren Entwicklung des algorithmischen Handels wird die Rolle der Kryptographie zweifellos an Bedeutung gewinnen. Händler und Entwickler, die sich diese Tools zu eigen machen, werden besser gerüstet sein, um die Herausforderungen der Datensicherheit zu meistern und sich einen Wettbewerbsvorteil auf dem Markt zu sichern.

Viel Spaß beim Coding! Viel Spaß beim Handeln!

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/16238

Beigefügte Dateien |
Example2.mq5 (1.32 KB)
Example3.mq5 (1.21 KB)
KeyGenerator.mq5 (1.42 KB)
SignalReceiver.mq5 (2.66 KB)
SignalSender.mq5 (2.65 KB)
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 45): Reinforcement Learning mit Monte-Carlo MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 45): Reinforcement Learning mit Monte-Carlo
Monte-Carlo ist der vierte, alternative Algorithmus des Reinforcement Learning, den wir mit dem Ziel betrachten, seine Implementierung in assistentengestützte Expert Advisors zu untersuchen. Obwohl sie auf Zufallsstichproben beruht, bietet sie umfangreiche Simulationsmöglichkeiten, die wir ausnutzen können.
Funktionsentwicklung mit Python und MQL5 (Teil I): Vorhersage gleitender Durchschnitte für weitreichende AI-Modelle Funktionsentwicklung mit Python und MQL5 (Teil I): Vorhersage gleitender Durchschnitte für weitreichende AI-Modelle
Die gleitenden Durchschnitte sind bei weitem die besten Indikatoren für die Vorhersage unserer KI-Modelle. Wir können unsere Genauigkeit jedoch noch weiter verbessern, indem wir unsere Daten sorgfältig transformieren. In diesem Artikel wird gezeigt, wie Sie KI-Modelle erstellen können, die in der Lage sind, weiter in die Zukunft zu prognostizieren, als Sie es derzeit tun, ohne dass Ihre Genauigkeit signifikant sinkt. Es ist wirklich bemerkenswert, wie nützlich die gleitenden Durchschnitte sind.
Analyse mehrerer Symbole mit Python und MQL5 (Teil II): Hauptkomponentenanalyse zur Portfolio-Optimierung Analyse mehrerer Symbole mit Python und MQL5 (Teil II): Hauptkomponentenanalyse zur Portfolio-Optimierung
Das Management des Risikos eines Handelskontos ist für alle Händler eine Herausforderung. Wie können wir Handelsanwendungen entwickeln, die dynamisch hohe, mittlere und niedrige Risikomodi für verschiedene Symbole in MetaTrader 5 erlernen? Durch den Einsatz der PCA erhalten wir eine bessere Kontrolle über die Portfoliovarianz. Ich werde zeigen, wie man Anwendungen erstellt, die diese drei Risikomodi aus den Marktdaten des MetaTrader 5 lernen.
Handel mit dem MQL5 Wirtschaftskalender (Teil 1): Beherrschung der Funktionen des MQL5-Wirtschaftskalenders Handel mit dem MQL5 Wirtschaftskalender (Teil 1): Beherrschung der Funktionen des MQL5-Wirtschaftskalenders
In diesem Artikel untersuchen wir, wie der MQL5-Wirtschaftskalender für den Handel verwendet werden kann, indem wir zunächst seine Kernfunktionen verstehen. Anschließend implementieren wir wichtige Funktionen des Wirtschaftskalenders in MQL5, um relevante Nachrichtendaten für Handelsentscheidungen zu extrahieren. Abschließend zeigen wir auf, wie diese Informationen genutzt werden können, um Handelsstrategien effektiv zu verbessern.