diff --git a/app/src/app.cpp b/app/src/app.cpp index 6100cdb..e1875d0 100644 --- a/app/src/app.cpp +++ b/app/src/app.cpp @@ -2,24 +2,24 @@ #include #include -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(); return n; } -std::vector prime_range(int max, int min = 2) +std::vector prime_range(long long int max, long long int min = 2) { //Sieve of Eratosthenes algo from https://www.baeldung.com/cs/prime-number-algorithms - std::vector primes; + std::vector primes; std::vector primes_check(max); 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]) { - int j = i * i; + long long int j = i * i; while (j <= max) { primes_check[j] = false; @@ -27,50 +27,88 @@ std::vector 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); 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; - else return gcd(b, a % b); + long long int temp; + 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) { - if(gcd(e, phi) == 1) break; + if (gcd(e, phi) == 1) k += 1; + if (k >= 20) break; e += 1; } - float d = (e^-1) % phi; - BK_INFO("n:{0} phi:{1} e:{2} d:{3}", n, phi, e, d); - int msg = 11; - float C = pow(msg, e); - C = fmod(C, n); - BK_INFO(C); - float M = pow(C,d); - M = fmod(M, n); + long long int d = 0; + long long int j = 0; + while (j < 2) + { + d += 1; + 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); } +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() { Bk::Log::init("Bakacypher"); - rsa(); + diffi(); return 0; } \ No newline at end of file