Test diffielman algo

graphic
anulax1225 ago%!(EXTRA string=9 months)
parent 9064d57ee2
commit 1f5f756508
  1. 96
      app/src/app.cpp

@ -2,24 +2,24 @@
#include <math.h> #include <math.h>
#include <stdlib.h> #include <stdlib.h>
int random(int max, int min = 0) long long int random(long long int max, long long int min = 0)
{ {
int n = rand(); long long int n = rand();
while (n > max || n < min) n = rand(); while (n > max || n < min) n = rand();
return n; return n;
} }
std::vector<int> prime_range(int max, int min = 2) std::vector<long long int> prime_range(long long int max, long long int min = 2)
{ {
//Sieve of Eratosthenes algo from https://www.baeldung.com/cs/prime-number-algorithms //Sieve of Eratosthenes algo from https://www.baeldung.com/cs/prime-number-algorithms
std::vector<int> primes; std::vector<long long int> primes;
std::vector<bool> primes_check(max); std::vector<bool> primes_check(max);
std::fill(primes_check.begin(), primes_check.end(), true); std::fill(primes_check.begin(), primes_check.end(), true);
for (int i = 2; i < sqrt(max); i++) for (long long int i = 2; i < sqrt(max); i++)
if (primes_check[i]) if (primes_check[i])
{ {
int j = i * i; long long int j = i * i;
while (j <= max) while (j <= max)
{ {
primes_check[j] = false; primes_check[j] = false;
@ -27,50 +27,88 @@ std::vector<int> prime_range(int max, int min = 2)
} }
} }
for (int i = min; i < primes_check.size(); i++) for (long long int i = min; i < primes_check.size(); i++)
if (primes_check[i]) primes.push_back(i); if (primes_check[i]) primes.push_back(i);
return primes; return primes;
} }
int gcd(int a, int b) long long int gcd(long long int a, long long int b)
{ {
if (b == 0) return a; long long int temp;
else return gcd(b, a % b); while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
} }
void rsa() long long int power(long long int val, long long int power)
{ {
auto primes = prime_range(100); long long int res = val;
for(long long int i = 1; i < power; i++) res *= val;
return res;
}
//int p = primes[random(primes.size())];
//int q = primes[random(primes.size())];
int p = 3;
int q = 11;
int n = p * q;
int phi = (p - 1) * (q - 1);
int e = 2; void rsa()
{
auto primes = prime_range(100, 50);
//long long int p = primes[random(primes.size())];
//long long int q = primes[random(primes.size())];
long long int p = 13;
long long int q = 17;
long long int n = p * q;
long long int phi = (p - 1) * (q - 1);
long long int e = 2;
long long int k = 0;
while(e < phi) while(e < phi)
{ {
if(gcd(e, phi) == 1) break; if (gcd(e, phi) == 1) k += 1;
if (k >= 20) break;
e += 1; e += 1;
} }
float d = (e^-1) % phi;
BK_INFO("n:{0} phi:{1} e:{2} d:{3}", n, phi, e, d);
int msg = 11; long long int d = 0;
float C = pow(msg, e); long long int j = 0;
C = fmod(C, n); while (j < 2)
BK_INFO(C); {
float M = pow(C,d); d += 1;
M = fmod(M, n); if (1 == (e * d) % phi)
{
j += 1;
}
}
BK_INFO("p:{4} q:{5} n:{0} phi:{1} e:{2} d:{3}", n, phi, e, d, p, q);
long long int msg = 20;
long long int C = power(msg, e) % n;
BK_INFO("{0} {1}", C, power(msg, e));
long long int M = C ^ d % n;
BK_INFO(M); BK_INFO(M);
} }
void diffi()
{
long long int a, b, g, p, ga, gb, gab, gba;
a = 10030;
b = 10294;
g = 10927;
p = prime_range(1000, 900)[3];
ga = g^a % p;
gb = g^b % p;
gab = ga^b % p;
gba = gb^a % p;
BK_INFO("a{0} b{1} g{2} p{3} ga{4} gb{5} gab{6} gba{7}", a, b, g, p, ga, gb, gab, gba);
}
int main() int main()
{ {
Bk::Log::init("Bakacypher"); Bk::Log::init("Bakacypher");
rsa(); diffi();
return 0; return 0;
} }
Loading…
Cancel
Save