2026-08-23 08:35:14 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Gen.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_RSA_KEYS_GEN_MQH
|
| | | #define CRYPTOBYLEO_SRC_RSA_KEYS_GEN_MQH
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #include "H.mqh"
|
| | |
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | namespace TSN
|
| | | {
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | class CRsa
|
| | | {
|
| | | public:
|
| | | CRsa(void) {}
|
| | | ~CRsa(void) {}
|
| | |
|
| | | //---
|
2026-09-01 12:27:22 -05:00 | | | template <typename TRandomGen>
|
2026-08-26 13:35:15 -05:00 | | | static bool GenerateKeyData(int public_exponent, int key_size_bits,
|
| | | int rounds_test_primo, int t_attemps, CRsaPublicKey& pub, CRsaPrivateKey& priv);
|
2026-08-23 08:35:14 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-09-01 12:27:22 -05:00 | | | template <typename TRandomGen>
|
2026-08-26 13:35:15 -05:00 | | | static bool CRsa::GenerateKeyData(int public_exponent, int key_size_bits,
|
| | | int rounds_test_primo, int t_attemps, CRsaPublicKey& pub, CRsaPrivateKey& priv)
|
2026-08-23 08:35:14 -05:00 | | | {
|
2026-08-24 09:57:30 -05:00 | | | //
|
2026-08-23 19:36:33 -05:00 | | | //---
|
| | | /* En esta funcion creamos
|
| | | - p (primo grande)
|
| | | - q (primero grande)
|
| | | - n (producto de p y q)
|
| | | - d (se deriva de lo publico)
|
| | | */
|
| | |
|
| | | //---
|
| | | /*
|
| | | 1. Fijar e = 65537 (dado, no se "elige" en tiempo de generación)
|
| | | 2. Generar candidato p:
|
| | | a. Sacar un número aleatorio impar de 1024 bits
|
| | | b. Testear primalidad (Miller-Rabin / Fermat)
|
| | | c. Si no es primo → volver a (a)
|
| | | d. Si es primo → verificar gcd(e, p-1) == 1
|
| | | e. Si NO es coprimo con e → descartar p entero, volver a (a)
|
| | | 3. Repetir todo el paso 2 para generar q (con la condición extra p ≠ q)
|
| | | 4. n = p × q
|
| | | 5. φ(n) = (p-1)(q-1)
|
2026-08-26 13:35:15 -05:00 | | | 6. d = e⁻¹ mod φ(n) (Euclides extendido) | e * d = 1 mod φ(n) (ed es como ax en formula)
|
2026-08-23 19:36:33 -05:00 | | | */
|
| | |
|
| | | //----
|
| | | const int keyss_limbs = BIGNUMERBYLEO_BITS_TO_LIMBS(key_size_bits);
|
2026-08-26 13:35:15 -05:00 | | | BigUInteger p(TSN::BigUInteger::EMPTY_INT_ARR, keyss_limbs);
|
| | | BigUInteger q(TSN::BigUInteger::EMPTY_INT_ARR, keyss_limbs);
|
2026-08-23 19:36:33 -05:00 | | |
|
| | | //--- P
|
| | | while(true)
|
| | | {
|
2026-08-26 13:35:15 -05:00 | | | if(--t_attemps < 0)
|
| | | return false;
|
| | |
|
| | |
|
2026-08-23 19:36:33 -05:00 | | | // La idea aqui es primeramente generar un nuermo alaeatorio
|
| | | // generamos
|
2026-08-26 13:35:15 -05:00 | | | p.FillRandom<TRandomGen>();
|
2026-08-23 19:36:33 -05:00 | | | // BCryptGenRandom(0, p.m_v, sizeof(ulong) * keyss_limbs, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
|
| | | p.m_v[0] |= 1; // foramozas a que sea impar
|
| | | // Ahora formzaos que el alto este activado
|
| | | // La idea es que neceistos garnaizasr qeu este numero sea de key_size_bits
|
| | | // Por que peude que en la generacion los altos esten apgados asi qeu teoramte no seria un numero de esos bit
|
| | | // asi que lo forzamos activand el mas alto
|
| | | p.m_v[keyss_limbs - 1] |= (1ULL << 63);
|
| | |
|
| | | //--- ahora le pasamos
|
2026-09-01 12:27:22 -05:00 | | | if(!p.IsProbablePrime<TRandomGen>(rounds_test_primo))
|
2026-08-23 19:36:33 -05:00 | | | continue;
|
| | |
|
| | | // restamos 1
|
| | | p -= 1;
|
| | |
|
| | | // Buscamos que sean coprimos (con el public exponent)
|
2026-08-24 09:57:30 -05:00 | | | if(p.Gdc(public_exponent) == 1)
|
2026-08-23 19:36:33 -05:00 | | | break;
|
| | | }
|
| | |
|
| | | //---
|
| | | p += 1;
|
| | |
|
| | | //--- q
|
| | | while(true)
|
| | | {
|
2026-08-26 13:35:15 -05:00 | | | if(--t_attemps < 0)
|
| | | return false;
|
| | | q.FillRandom<TRandomGen>();
|
2026-08-23 19:36:33 -05:00 | | | q.m_v[0] |= 1; // foramozas a que sea impar
|
| | | q.m_v[keyss_limbs - 1] |= (1ULL << 63);
|
| | | //---
|
| | | if(p == q)
|
| | | continue; // deben de ser diferentes
|
| | | //--- ahora le pasamos
|
2026-09-01 12:46:11 -05:00 | | | if(!q.IsProbablePrime<TRandomGen>(rounds_test_primo))
|
2026-08-23 19:36:33 -05:00 | | | continue;
|
2026-08-26 13:35:15 -05:00 | | | q -= 1; // restamos 1
|
2026-08-23 19:36:33 -05:00 | | | // Buscamos que sean coprimos (con el public exponent)
|
2026-08-24 09:57:30 -05:00 | | | if(q.Gdc(public_exponent) == 1)
|
2026-08-23 19:36:33 -05:00 | | | break;
|
| | | }
|
| | |
|
| | | //---
|
| | | BigUInteger phi_n = (p - 1) * q; // q ya es q-1
|
| | | // Ahora d = e⁻¹ mod φ(n)
|
2026-08-24 09:57:30 -05:00 | | | // public_exponent * x = 1 (mod phi(n))
|
2026-08-26 13:35:15 -05:00 | | | // primero converitmos a e a un big integer.. usando contructo exacto
|
| | | const BigUInteger bige(TSN::BigUInteger::EMPTY_NUMBER_EXACT, public_exponent);
|
| | | // ahora si calculamos..
|
2026-09-09 12:01:15 -05:00 | | | BigUInteger d = BNBL_GdcExtendedRetX(bige, phi_n);
|
2026-08-26 13:35:15 -05:00 | | |
|
| | | //--- Calculo de crt
|
2026-08-29 20:40:52 -05:00 | | | // (dq)
|
2026-08-26 13:35:15 -05:00 | | | BigUInteger dq = d % q;
|
| | | // (dp)
|
| | | BigUInteger dp = d % (p - 1);
|
| | | // qinv
|
2026-09-09 12:01:15 -05:00 | | | BigUInteger qinv = BNBL_GdcExtendedRetX(q, p);
|
2026-08-23 19:36:33 -05:00 | | |
|
| | | //--- N final
|
| | | q += 1;
|
| | | BigUInteger n = p * q;
|
2026-08-26 13:35:15 -05:00 | | | BigUInteger ncopy = n;
|
2026-08-23 08:35:14 -05:00 | | |
|
2026-08-29 20:40:52 -05:00 | | | //--- load
|
| | | pub.Load(n, public_exponent, key_size_bits);
|
2026-09-01 12:31:52 -05:00 | | | priv.Load(ncopy, d, p, q, dp, dq, qinv, public_exponent, key_size_bits);
|
2026-08-26 13:35:15 -05:00 | | |
|
2026-08-29 20:40:52 -05:00 | | | //---
|
2026-08-26 13:35:15 -05:00 | | | return true;
|
2026-08-23 08:35:14 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | }
|
2026-08-26 13:35:15 -05:00 | | | #endif // CRYPTOBYLEO_SRC_RSA_KEYS_GEN_MQH
|
| | | //+------------------------------------------------------------------+
|