forked from nique_372/CryptoByLeo
222 lines
6.3 KiB
MQL5
222 lines
6.3 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Main.mqh |
|
|
//| Copyright 2026, Niquel Mendoza |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza"
|
|
#property link "https://www.mql5.com"
|
|
#property strict
|
|
|
|
#ifndef CRYPTOBYLEO_SRC_PSEALE_MAIN_MQH
|
|
#define CRYPTOBYLEO_SRC_PSEALE_MAIN_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include <TSN\\MQLArticles\\Utils\\Random.mqh>
|
|
#include "..\\Simetric\\AES\\Defines.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
/*
|
|
Una clase para generar seeds random pseudo... para OAEP
|
|
La idea es combinar varias fuentes de "entropia"
|
|
Y juntarlas..
|
|
Ahora mismo solo hay una R1 quizas añada mas.
|
|
Esto no es seguro criptograficamente pero para OAEP quizas este bien
|
|
Para las key no
|
|
*/
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// pseudo para crypto
|
|
class CPseudoAleatorio
|
|
{
|
|
private:
|
|
static Xoshiro256 s_rand;
|
|
public:
|
|
CPseudoAleatorio(void) {}
|
|
~CPseudoAleatorio(void) {}
|
|
|
|
//---
|
|
// out=array don de se ponen los datos
|
|
// otl=numero de datos
|
|
// i=indice donde se mepzian a poiner los datos
|
|
static void Random(uchar& out[], int olt, int i);
|
|
|
|
//---
|
|
// out=array don de se ponen los datos
|
|
// otl=numero de datos
|
|
// i=indice donde se mepzian a poiner los datos
|
|
static void Random(ulong& out[], int olt, int i);
|
|
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CPseudoAleatorio::Random(uchar& out[], int olt, int i)
|
|
{
|
|
olt += i;
|
|
for(; i + 7 < olt;)
|
|
{
|
|
ulong ul = 0;
|
|
const ulong s = s_rand.RandomUlong();
|
|
switch(uchar(s & 7)) // % 8 = & 7
|
|
{
|
|
case 0:
|
|
{
|
|
ul = s_rand.RandomUlong();
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
ul = (ulong)TerminalInfoInteger(TERMINAL_PING_LAST) << 16;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
ul = (ulong)TerminalInfoInteger(TERMINAL_MEMORY_USED) << 16;
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
ul = ulong(TerminalInfoDouble(TERMINAL_RETRANSMISSION) * 100) << 16;
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
ul = GetMicrosecondCount();
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
ul = GetTickCount64();
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
ul = ulong(SymbolInfoDouble(_Symbol, SYMBOL_BID) * SymbolInfoDouble(_Symbol, SYMBOL_LAST));
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
ul = (s_rand.RandomUlong() ^ s_rand.RandomUlong()) << (s_rand.RandomUlong() & 31);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//--
|
|
if((s << 16) > 0)
|
|
{
|
|
ul = (ul << 32) | (ul >> 32);
|
|
}
|
|
|
|
//---
|
|
const ulong t = s_rand.RandomUlong();
|
|
out[i++] = g_aes_sbox[uchar(ul) ^ uchar(t)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 8) ^ uchar(t >> 8)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 16) ^ uchar(t >> 16)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 24) ^ uchar(t >> 24)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 32) ^ uchar(t >> 32)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 40) ^ uchar(t >> 40)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 48) ^ uchar(t >> 48)];
|
|
out[i++] = g_aes_sbox[uchar(ul >> 56) ^ uchar(t >> 56)];
|
|
}
|
|
|
|
//---
|
|
for(; i < olt; i++)
|
|
{
|
|
out[i] = g_aes_sbox[s_rand.RandomUlong() & 255];
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
static void CPseudoAleatorio::Random(ulong &out[], int olt, int i)
|
|
{
|
|
olt += i;
|
|
for(; i < olt; i++)
|
|
{
|
|
ulong ul = 0;
|
|
const ulong s = s_rand.RandomUlong();
|
|
switch(uchar(s & 7)) // % 8 = & 7
|
|
{
|
|
case 0:
|
|
{
|
|
ul = s_rand.RandomUlong();
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
ul = (ulong)TerminalInfoInteger(TERMINAL_PING_LAST) << 16;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
ul = (ulong)TerminalInfoInteger(TERMINAL_MEMORY_USED) << 16;
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
ul = ulong(TerminalInfoDouble(TERMINAL_RETRANSMISSION) * 100) << 16;
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
ul = GetMicrosecondCount();
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
ul = GetTickCount64();
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
ul = ulong(SymbolInfoDouble(_Symbol, SYMBOL_BID) * SymbolInfoDouble(_Symbol, SYMBOL_LAST));
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
ul = (s_rand.RandomUlong() ^ s_rand.RandomUlong()) << (s_rand.RandomUlong() & 31);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//--
|
|
if((s << 16) > 0)
|
|
{
|
|
ul = (ul << 32) | (ul >> 32);
|
|
}
|
|
|
|
//---
|
|
const ulong t = s_rand.RandomUlong();
|
|
// 32 bajos combinado con gaes 32 altos ul
|
|
out[i] = g_aes_sbox[(uchar(ul) ^ uchar(t))] |
|
|
g_aes_sbox[(uchar(ul >> 8) ^ uchar(t >> 8))] << 8 |
|
|
g_aes_sbox[(uchar(ul >> 16) ^ uchar(t >> 16))] << 16 |
|
|
g_aes_sbox[(uchar(ul >> 24) ^ uchar(t >> 24))] << 24 |
|
|
(ul & 0xffffffff) << 32;
|
|
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
Xoshiro256 CPseudoAleatorio::s_rand;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
#endif // CRYPTOBYLEO_SRC_PSEALE_MAIN_MQH
|