CryptoByLeo/Src/PseAle/Main.mqh

222 行
6.3 KiB
MQL5

2026-08-19 13:03:20 -05:00
//+------------------------------------------------------------------+
//| 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>
2026-08-19 17:43:41 -05:00
#include "..\\Simetric\\AES\\Defines.mqh"
2026-08-19 13:03:20 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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
2026-08-19 17:43:41 -05:00
// i=indice donde se mepzian a poiner los datos
static void Random(uchar& out[], int olt, int i);
2026-08-23 19:36:33 -05:00
//---
// 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);
2026-08-19 13:03:20 -05:00
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
static void CPseudoAleatorio::Random(uchar& out[], int olt, int i)
2026-08-19 13:03:20 -05:00
{
2026-08-19 17:43:41 -05:00
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;
}
2026-08-19 13:03:20 -05:00
2026-08-19 17:43:41 -05:00
//--
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];
}
2026-08-19 13:03:20 -05:00
}
2026-08-19 17:43:41 -05:00
2026-08-23 19:36:33 -05:00
//+------------------------------------------------------------------+
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;
}
}
2026-08-19 13:03:20 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Xoshiro256 CPseudoAleatorio::s_rand;
}
//+------------------------------------------------------------------+
#endif // CRYPTOBYLEO_SRC_PSEALE_MAIN_MQH