62 lines
No EOL
3.4 KiB
Markdown
62 lines
No EOL
3.4 KiB
Markdown
# URandom
|
|
|
|
Este folder contiene las "fuentes" de números aleatorios que usa el resto de la librería: `BigUInteger` (generación de primos, `FillRandom`), `RSA` (generación de claves, IV de OAEP/PSS) y `Fernet` (generación de claves).
|
|
|
|
Cada fuente vive en su propio `.mqh` y envuelve un backend distinto:
|
|
|
|
- **`BCrypt.mqh`** (`CURandom`) — usa `bcrypt.dll` de Windows (`BCryptGenRandom`). Criptográficamente seguro, pero requiere DLLs habilitadas en el terminal.
|
|
- **`PRNG.mqh`** (`CURandomPRNG<TBackend>`) — usa [PNRGByLeo](https://forge.mql5.io/nique_372/PNRGByLeo) puro MQL5, sin DLLs, mezclando el generador con fuentes
|
|
de entropía del terminal (ping, memoria, ticks). No es criptográficamente seguro ni comparable a un `/dev/urandom` o BCryptGenRadom (win)
|
|
real, pero es la única opción para quien no puede o no quiere usar DLLs en su EA.
|
|
|
|
Se mantienen ambas porque cada una responde a un trade-off distinto entre seguridad y dependencias: DLLs dan mejor entropía pero atan el proyecto al ecosistema de Windows/DLLs habilitadas (un problema si vas a vender en Market o publicar en CodeBase); PRNG puro evita esa dependencia a costa de seguridad criptográfica real. La librería no elige por ti — expone ambas bajo el mismo contrato y tú decides cuál usar según tu caso.
|
|
|
|
## Contrato
|
|
|
|
Cualquier clase de esta carpeta (y cualquiera nueva que agregues) debe implementar estas 3 funciones estáticas con estas firmas exactas:
|
|
|
|
```mql5
|
|
static void RandomCryptoBytes(uchar& out[], int oult, int o_s = 0);
|
|
static void RandomUlongArr(ulong& out[], int oult, int o_s = 0);
|
|
static void RandomUlongArrRange(ulong& out[], int oult, ulong last, int o_s = 0);
|
|
```
|
|
|
|
No hay una interfaz base ni un puntero de función: el resto de la librería consume estas clases vía template (`template <typename TRandomFunc>`), nunca por instancia o interfaz en tiempo de ejecución. Es una decisión de diseño deliberada — todo el binding se resuelve en tiempo de compilación, sin el costo ni la indirección de una resolución virtual. Por eso el contrato no se puede forzar con una interfaz; solo con la firma.
|
|
|
|
### Verificar que tu clase cumple el contrato
|
|
|
|
Al ser duck typing por template, si te falta un método o la firma no coincide, el error de compilación puede aparecer varias capas adentro (p. ej. dentro de `BigUInteger::FillRandom`), lejos de tu clase nueva. Para evitarlo, incluye `ContractVer.mqh` y llama a `_URandomContractCheck<TuClase>()` una vez desde tu código de test/integración (no en producción) al terminar de escribir tu clase:
|
|
|
|
```mql5
|
|
#include "ContractVer.mqh"
|
|
#include "PRNG.mqh"
|
|
|
|
void OnInit()
|
|
{
|
|
TSN::_URandomContractCheck<TSN::CURandomPRNG<CMiBackend>>();
|
|
}
|
|
```
|
|
|
|
Si algo no cumple el contrato, el error sale ahí, con el nombre real de tu clase — no enterrado dentro de BigInteger o RSA.
|
|
|
|
## Uso
|
|
|
|
No se llaman directamente en la mayoría de los casos: se pasan como parámetro de template a las funciones de la librería que requieren aleatoriedad, y son ellas quienes las invocan internamente. Por ejemplo, al cifrar con la clave pública RSA (que internamente necesita bytes aleatorios para el IV de OAEP):
|
|
|
|
```mql5
|
|
#include "..\\RSA\\Keys\\Public.mqh"
|
|
#include "BCrypt.mqh"
|
|
|
|
TSN::CRsaPublicKey pub;
|
|
uchar mensaje[], out[];
|
|
// ...
|
|
pub.Cifrar<TSN::CURandom>(mensaje, out);
|
|
```
|
|
|
|
O usando el backend sin DLL, con un backend concreto de PNRGByLeo:
|
|
|
|
```mql5
|
|
#include "PRNG.mqh"
|
|
|
|
pub.Cifrar<TSN::CURandomPRNG<CXoshiro256> >(mensaje, out);
|
|
``` |