summaryrefslogtreecommitdiff
path: root/lib/lib5.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-11-20 00:43:27 +0100
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:26 +0100
commit30211642cbdee771ad4e0d8515719985e5c0c36a (patch)
tree557c212c41a3bf33b715fdec433c2ec065ae705b /lib/lib5.c
parent09e041bae5af286bc4c50c9a2ebf294b25d4d007 (diff)
task39: implemented own modular multiplicative invserse for bignum
Diffstat (limited to 'lib/lib5.c')
-rw-r--r--lib/lib5.c63
1 files changed, 61 insertions, 2 deletions
diff --git a/lib/lib5.c b/lib/lib5.c
index 89b781a..2f45c29 100644
--- a/lib/lib5.c
+++ b/lib/lib5.c
@@ -239,6 +239,18 @@ void extended_euclid_algo(int a, int b, struct extended_euclid *e)
return;
}
+int modular_multiplicative_inverse(int number, int _modulo)
+{
+ struct extended_euclid tmp;
+ extended_euclid_algo(number, _modulo, &tmp);
+ // only has a inverse iff gcd = 1
+ if ( tmp.d != 1)
+ return INT_MIN;
+
+ // mod works not fine for negytive numbers in c
+ return modulo(tmp.s, _modulo);
+}
+
int rsa_encrypt(int message, struct rsa_key *public)
{
return modulo((message^public->exponent), public->modulo);
@@ -265,6 +277,52 @@ int rsa_decrypt_bignum(BIGNUM *message, BIGNUM *res, struct rsa_key_bignum *priv
return BN_mod_exp(res, message, private->exponent, private->modulo, ctx);
}
+void extended_euclid_algo_bignum(BIGNUM *a, BIGNUM *b, struct extended_euclid_bignum *e)
+{
+ struct extended_euclid_bignum tmp;
+
+ if (BN_is_zero(b)) {
+ BN_copy(e->d, a);
+ BN_one(e->s);
+ BN_zero(e->t);
+ return;
+ }
+ tmp.d = BN_new();
+ tmp.s = BN_new();
+ tmp.t = BN_new();
+
+ BIGNUM *mod = BN_new();
+ BN_mod(mod, a, b, ctx);
+
+ extended_euclid_algo_bignum(b, mod, &tmp);
+ BN_copy(e->d, tmp.d);
+ BN_copy(e->s, tmp.t);
+ BN_div(mod, NULL, a, b, ctx);
+ BN_mul(mod, mod, tmp.t, ctx);
+ BN_sub(e->t, tmp.s, mod);
+
+
+ BN_free(mod);
+ BN_free(tmp.d);
+ BN_free(tmp.s);
+ BN_free(tmp.t);
+ return;
+}
+
+int modular_multiplicative_inverse_bignum_my(BIGNUM *res, BIGNUM *number, BIGNUM *modulo)
+{
+ struct extended_euclid_bignum tmp;
+ tmp.d = BN_new();
+ tmp.s = BN_new();
+ tmp.t = BN_new();
+ extended_euclid_algo_bignum(number, modulo, &tmp);
+ // only has a invese iff gcd = 1
+ if (!BN_is_one(tmp.d))
+ return -1;
+
+ return BN_nnmod(res, tmp.s, modulo, ctx);
+}
+
int rsa_generate_key_bignum(struct rsa_key_bignum *public, struct rsa_key_bignum *private)
{
// RSA with bignum
@@ -301,8 +359,9 @@ int rsa_generate_key_bignum(struct rsa_key_bignum *public, struct rsa_key_bignum
BIGNUM *e = BN_new();
BN_set_word(e, 3);
- BIGNUM *d = BN_mod_inverse(NULL, e, et, ctx);
-
+ //BIGNUM *d = BN_mod_inverse(NULL, e, et, ctx);
+ BIGNUM *d = BN_new();
+ modular_multiplicative_inverse_bignum_my(d, e, et);
public->exponent = e;
public->modulo = n;
private->exponent = d;