Using 64 bit integers
This commit is contained in:
parent
62439387e5
commit
f7040d4300
2 changed files with 42 additions and 23 deletions
51
rsa.c
51
rsa.c
|
@ -3,13 +3,12 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
int gcd(int a, int b) {
|
uint64_t gcd(uint64_t a, uint64_t b) {
|
||||||
while (b != 0) {
|
while (b != 0) {
|
||||||
int temp = b;
|
uint64_t temp = b;
|
||||||
b = a % b;
|
b = a % b;
|
||||||
a = temp;
|
a = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +70,7 @@ uint64_t modexp(uint64_t a, uint64_t b, uint64_t m) {
|
||||||
|
|
||||||
uint64_t gen_prime(uint64_t min, uint64_t max) {
|
uint64_t gen_prime(uint64_t min, uint64_t max) {
|
||||||
uint64_t cand = 0;
|
uint64_t cand = 0;
|
||||||
while (!miller_rabin(cand, 10)) cand = prand_range(min, max);
|
while (!miller_rabin(cand, 5)) cand = prand_range(min, max);
|
||||||
|
|
||||||
return cand;
|
return cand;
|
||||||
}
|
}
|
||||||
|
@ -88,26 +87,26 @@ bool is_prime(int n) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool miller_rabin(int n, int k) {
|
bool miller_rabin(uint64_t n, uint64_t k) {
|
||||||
if (n < 2)
|
if (n < 2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int d = n - 1;
|
uint64_t d = n - 1;
|
||||||
int s = 0;
|
uint64_t s = 0;
|
||||||
|
|
||||||
while (d % 2 == 0) {
|
while (d % 2 == 0) {
|
||||||
d /= 2;
|
d /= 2;
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < k; i++) {
|
for (uint64_t i = 0; i < k; i++) {
|
||||||
int a = prand_range(2, n - 2);
|
uint64_t a = prand_range(2, n - 2);
|
||||||
int x = modexp(a, d, n);
|
uint64_t x = modexp(a, d, n);
|
||||||
|
|
||||||
if (x == 1 || x == n - 1)
|
if (x == 1 || x == n - 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (int r = 1; r < s; r++) {
|
for (uint64_t r = 1; r < s; r++) {
|
||||||
x = modexp(x, 2, n);
|
x = modexp(x, 2, n);
|
||||||
if (x == n - 1)
|
if (x == n - 1)
|
||||||
break;
|
break;
|
||||||
|
@ -120,11 +119,31 @@ bool miller_rabin(int n, int k) {
|
||||||
return true; // Likely prime
|
return true; // Likely prime
|
||||||
}
|
}
|
||||||
|
|
||||||
int mod_inverse(int e, int phi) {
|
int mod_inverse(int a, int m) {
|
||||||
for (int d = 0; d < phi; d++) {
|
int m0 = m;
|
||||||
if ((d * e) % phi == 1)
|
int y = 0, x = 1;
|
||||||
return d;
|
|
||||||
|
if (m == 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (a > 1) {
|
||||||
|
// q is quotient
|
||||||
|
int q = a / m;
|
||||||
|
int t = m;
|
||||||
|
|
||||||
|
// m is remainder now
|
||||||
|
m = a % m;
|
||||||
|
a = t;
|
||||||
|
t = y;
|
||||||
|
|
||||||
|
// Update x and y
|
||||||
|
y = x - q * y;
|
||||||
|
x = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
// Make x positive
|
||||||
|
if (x < 0)
|
||||||
|
x += m0;
|
||||||
|
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
14
rsa.h
14
rsa.h
|
@ -10,7 +10,7 @@
|
||||||
* @param b Second number
|
* @param b Second number
|
||||||
* @return The greatest common divider
|
* @return The greatest common divider
|
||||||
*/
|
*/
|
||||||
int gcd(int a, int b);
|
uint64_t gcd(uint64_t a, uint64_t b);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Computes Euler's Totient function φ(n), which counts the number of
|
* @brief Computes Euler's Totient function φ(n), which counts the number of
|
||||||
|
@ -31,13 +31,13 @@ int totient(int n);
|
||||||
uint64_t modexp(uint64_t a, uint64_t b, uint64_t m);
|
uint64_t modexp(uint64_t a, uint64_t b, uint64_t m);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Computes the modular inverse of e modulo phi.
|
* @brief Computes the modular inverse of a modulo m.
|
||||||
*
|
*
|
||||||
* @param e The integer whose modular inverse is to be found.
|
* @param a The integer whose modular inverse is to be found.
|
||||||
* @param phi The modulus.
|
* @param m The modulus.
|
||||||
* @return The modular inverse of e modulo phi, or -1 if no inverse exists.
|
* @return The modular inverse of a modulo m, or -1 if no inverse exists.
|
||||||
*/
|
*/
|
||||||
int mod_inverse(int e, int phi);
|
int mod_inverse(int a, int m);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generates a random prime number within the given range.
|
* @brief Generates a random prime number within the given range.
|
||||||
|
@ -64,7 +64,7 @@ bool is_prime(int n);
|
||||||
* @param k The number of rounds of testing to perform.
|
* @param k The number of rounds of testing to perform.
|
||||||
* @return true if n is probably prime, false if n is composite.
|
* @return true if n is probably prime, false if n is composite.
|
||||||
*/
|
*/
|
||||||
bool miller_rabin(int n, int k);
|
bool miller_rabin(uint64_t n, uint64_t k);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Computes the greatest common divisor (GCD) of two integers a and b
|
* @brief Computes the greatest common divisor (GCD) of two integers a and b
|
||||||
|
|
Loading…
Add table
Reference in a new issue