diff options
| -rw-r--r-- | lib/lib6.c | 113 | ||||
| -rw-r--r-- | lib/lib6.h | 26 | ||||
| -rw-r--r-- | set6/task43.c | 98 |
3 files changed, 236 insertions, 1 deletions
@@ -4,6 +4,7 @@ #include "lib3.h" #include "lib2.h" #include "lib.h" +#include <openssl/sha.h> int rsa_sign_bignum(BIGNUM *message, BIGNUM *signed_message, struct rsa_key_bignum *private) @@ -96,3 +97,115 @@ int shitty_pkcs1_5_padding_verify(char *to_verify, int len, char *message) return 1; } + +void init_dsa_pub_param(struct dsa_public_params *p) +{ + char *p_str = "800000000000000089e1855218a0e7dac38136ffafa72eda7" + "859f2171e25e65eac698c1702578b07dc2a1076da241c76c6" + "2d374d8389ea5aeffd3226a0530cc565f3bf6b50929139ebe" + "ac04f48c3c84afb796d61e5a4f9a8fda812ab59494232c7d2" + "b4deb50aa18ee9e132bfa85ac4374d7f9091abc3d015efc87" + "1a584471bb1"; + + char *q_str = "f4f47f05794b256174bba6e9b396a7707e563c5b"; + + char *g_str = "5958c9d3898b224b12672c0b98e06c60df923cb8bc999d119" + "458fef538b8fa4046c8db53039db620c094c9fa077ef389b5" + "322a559946a71903f990f1f7e0e025e2d7f7cf494aff1a047" + "0f5b64c36b625a097f1651fe775323556fe00b3608c887892" + "878480e99041be601a62166ca6894bdd41a7054ec89f756ba" + "9fc95302291"; + + p->p = BN_new(); + p->q = BN_new(); + p->g = BN_new(); + + BN_hex2bn(&p->p, p_str); + BN_hex2bn(&p->q, q_str); + BN_hex2bn(&p->g, g_str); + p->bits = BN_num_bytes(p->q)*16; +} + +void dsa_compute_per_user_keys(struct dsa_public_params *pub_param, struct + dsa_per_user_param *priv_param) +{ + BN_pseudo_rand(priv_param->private, pub_param->bits, -1, -1); + BN_mod(priv_param->private, priv_param->private, pub_param->q, ctx); + BN_mod_exp(priv_param->public, pub_param->g, priv_param->private, + pub_param->p, ctx); +} + +void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_user_param + *priv_param, BIGNUM *k) +{ + // random per message value + BIGNUM *k_1 = BN_new(); + BIGNUM *hash_bn = BN_new(); + BIGNUM *tmp = BN_new(); + SHA_CTX sha1; + char sha1_hash[20]; + + SHA1_Init(&sha1); + SHA1_Update(&sha1, mess, strlen(mess)); + SHA1_Final(sha1_hash, &sha1); + BN_bin2bn(sha1_hash, 20, hash_bn); + BN_zero(priv_param->r); + BN_zero(priv_param->s); + + while(BN_is_zero(priv_param->r) || BN_is_zero(priv_param->s)) { + if(BN_is_zero(k)) { + BN_pseudo_rand(k, pub_param->bits, -1, -1); + BN_mod(k, k, pub_param->q, ctx); + } + BN_mod_exp(priv_param->r, pub_param->g, k, pub_param->p, ctx); + BN_mod(priv_param->r, priv_param->r, pub_param->q, ctx); + + BN_mod_mul(tmp, priv_param->private, priv_param->r, pub_param->q, ctx); + BN_mod_add(tmp, hash_bn, tmp, pub_param->q, ctx); + BN_mod_inverse(k_1, k, pub_param->q, ctx); + BN_mod_mul(priv_param->s, k_1, tmp, pub_param->q, ctx); + } +} + + +int dsa_verify(char *mess, struct dsa_public_params *pub, struct dsa_per_user_param + *priv) +{ + SHA_CTX sha1; + char sha1_hash[20]; + BIGNUM *w = BN_new(); + BIGNUM *u1 = BN_new(); + BIGNUM *u2 = BN_new(); + BIGNUM *tmp1 = BN_new(); + BIGNUM *tmp2 = BN_new(); + BIGNUM *v = BN_new(); + BIGNUM *hash_bn = BN_new(); + + BN_mod_inverse(w, priv->s, pub->q, ctx); + + SHA1_Init(&sha1); + SHA1_Update(&sha1, mess, strlen(mess)); + SHA1_Final(sha1_hash, &sha1); + BN_bin2bn(sha1_hash, 20, hash_bn); + + BN_mod_mul(u1, w, hash_bn, pub->q, ctx); + BN_mod_mul(u2, priv->r, w, pub->q, ctx); + + BN_mod_exp(tmp1, pub->g, u1, pub->p, ctx); + BN_mod_exp(tmp2, priv->public, u2, pub->p, ctx); + + BN_mod_mul(v, tmp1, tmp2, pub->p, ctx); + BN_mod(v, v, pub->q, ctx); + + return BN_cmp(v, priv->r); +} + +void dsa_recover_x_from_known_k(struct dsa_public_params *pub, BIGNUM *k, + struct dsa_per_user_param *priv, BIGNUM *mess_hash) +{ + BIGNUM *r_1 = BN_new(); + BN_mod_inverse(r_1, priv->r, pub->q, ctx); + BN_mod_mul(priv->private, k, priv->s, pub->q, ctx); + BN_mod_sub(priv->private, priv->private, mess_hash, pub->q, ctx); + BN_mod_mul(priv->private, priv->private, r_1, pub->q, ctx); +} @@ -8,9 +8,33 @@ #include "lib.h" +struct dsa_public_params { + BIGNUM *p; + BIGNUM *q; + BIGNUM *g; + unsigned int bits; +}; + +struct dsa_per_user_param { + BIGNUM *public; + BIGNUM *private; + // signature data here also because they should not be here + BIGNUM *r; + BIGNUM *s; +}; + + int rsa_sign_bignum(BIGNUM *message, BIGNUM *signed_message, struct rsa_key_bignum *private); int rsa_verify_bignum(BIGNUM *signed_message, BIGNUM *org_message, struct rsa_key_bignum *public); int shitty_pkcs1_5_padding_verify(char *to_verify, int len, char *message); int pkcs1_5_padding_verify(char *to_verify, int len, char *message); - +void init_dsa_pub_param(struct dsa_public_params *p); +void dsa_compute_per_user_keys(struct dsa_public_params *pub_param, struct + dsa_per_user_param *priv_param); +void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_user_param + *priv_param, BIGNUM *k); +int dsa_verify(char *mess, struct dsa_public_params *pub, struct dsa_per_user_param + *priv); +void dsa_recover_x_from_known_k(struct dsa_public_params *pub, BIGNUM *k, + struct dsa_per_user_param *priv, BIGNUM *mess_hash); #endif /* __LIB_6_H__ */ diff --git a/set6/task43.c b/set6/task43.c new file mode 100644 index 0000000..b1386fa --- /dev/null +++ b/set6/task43.c @@ -0,0 +1,98 @@ +#include "../lib/lib.h" +#include "../lib/lib2.h" +#include "../lib/lib3.h" +#include "../lib/lib4.h" +#include "../lib/lib5.h" +#include "../lib/lib6.h" +#include <openssl/sha.h> + +int main() +{ + int i; + struct dsa_public_params dsa_pub; + struct dsa_per_user_param dsa_user; + struct dsa_per_user_param dsa_user_org; + BIGNUM *hash_bn = BN_new(); + BIGNUM *k = BN_new(); + char *message = "For those that envy a MC it can be hazardous to your health\nSo be friendly, a matter of life and death, just like a etch-a-sketch\n"; + + out = BIO_new(BIO_s_file()); + BIO_set_fp(out, stdout, BIO_NOCLOSE); + ctx = BN_CTX_new(); + + printf("message is:\n%s\n", message); + SHA_CTX sha1; + char sha1_hash[20]; + char hex[40]; + dsa_user.public = BN_new(); + dsa_user.private = BN_new(); + dsa_user.r= BN_new(); + dsa_user.s = BN_new(); + + dsa_user_org.public = BN_new(); + dsa_user_org.private = BN_new(); + dsa_user_org.r= BN_new(); + dsa_user_org.s = BN_new(); + + SHA1_Init(&sha1); + SHA1_Update(&sha1, message, strlen(message)); + SHA1_Final(sha1_hash, &sha1); + hex_binary_to_string(sha1_hash, hex, 20); + printf("hash of message is: %s\n", hex); + BN_bin2bn(sha1_hash, 20, hash_bn); + BN_print(out, hash_bn); + + init_dsa_pub_param(&dsa_pub); + + // set public key + char * y = "84ad4719d044495496a3201c8ff484feb45b962e7302e56a392aee4" + "abab3e4bdebf2955b4736012f21a08084056b19bcd7fee56048e004" + "e44984e2f411788efdc837a0d2e5abb7b555039fd243ac01f0fb2ed" + "1dec568280ce678e931868d23eb095fde9d3779191b8c0299d6e07b" + "bb283e6633451e535c45513b2d33c99ea17"; + char *r = "548099063082341131477253921760299949438196259240"; + char *s = "857042759984254168557880549501802188789837994940"; + + BN_hex2bn(&dsa_user.public, y); + // well this is decimal .... + BN_dec2bn(&dsa_user.r, r); + BN_dec2bn(&dsa_user.s, s); + + BN_copy(dsa_user_org.public, dsa_user.public); + BN_copy(dsa_user_org.r, dsa_user.r); + BN_copy(dsa_user_org.s, dsa_user.s); + + // can i verfiy that? + // brute force + BIGNUM *tmp = BN_new(); + for(i=0;i<65536;i++) { + BN_set_word(k, i); + //BN_copy(dsa_user.r, dsa_user_org.r); + //BN_copy(dsa_user.s, dsa_user_org.s); + //BN_copy(dsa_user.public, dsa_user_org.public); + dsa_recover_x_from_known_k(&dsa_pub, k, &dsa_user, hash_bn); + // compute signture with this x,k and compare + printf("\nprivate key for k = %i\n", i); + BN_print(out, dsa_user.private); + //dsa_sign(message, &dsa_pub, &dsa_user, k); + BN_mod_exp(tmp, dsa_pub.g, dsa_user.private, dsa_pub.p, ctx); + if(!BN_cmp(tmp, dsa_user.public)) + break; + } + printf("\nk is: %i, private key:\n", i); + BN_print(out, dsa_user.private); + char *str_priv = malloc(BN_num_bytes(dsa_user.private)); + char *str_priv_hex = malloc(BN_num_bytes(dsa_user.private)*2+1); + BN_bn2bin(dsa_user.private, str_priv); + hex_binary_to_string(str_priv, str_priv_hex, BN_num_bytes(dsa_user.private)); + + SHA1_Init(&sha1); + SHA1_Update(&sha1, str_priv_hex, BN_num_bytes(dsa_user.private)*2); + SHA1_Final(sha1_hash, &sha1); + + char *given_hash = "0954edd5e0afe5542a4adf012611a91912a3ec16"; + hex_binary_to_string(sha1_hash, hex, 20); + printf("\nhash of private key is: %s\n", hex); + printf("given one: %s\n", given_hash); + printf("equal?: %i", !memcmp(hex, given_hash, 20)); +} |
