Процедура keygen занимается созданием ключей RSA на базе трех передаваемых ей простых чисел. Ее работа идет по такому алгоритму:
#include "cyphernet.h" typedef struct rsa_key { struct rsa_key_item public_key; struct rsa_key_item private_key; } RSAKEY; RSAKEY local_rsa_key; int value_is_negative(signed char *value) { return (*(value + VALUE_LENTH - 1) == MAX_DIGIT); } void dec_value(signed char *operand) { int i; *operand -= 1; for (i = 0; i < VALUE_LENTH; i++) if (*(operand + i) < 0) { *(operand + i) += RADIX; if ((i + 1) < VALUE_LENTH) *(operand + i + 1) -= 1; } } void value_add(signed char *operand1, signed char *operand2) { //operand1 += operand2 int i; for (i = 0; i < VALUE_LENTH; i++) { *(operand1 + i) += *(operand2 + i); if (*(operand1 + i) > MAX_DIGIT) { *(operand1 + i) -= RADIX; if ((i + 1) < VALUE_LENTH) *(operand1 + i + 1) += 1; } } } void div_value(signed char *dividend, signed char *divider, signed char *result, signed char *remainder) { //result = dividend / divider int rl, dl; signed char factor[VALUE_LENTH], tractor[VALUE_LENTH]; clear_value(result); copy_value(dividend, remainder); while (cmp_value(divider, remainder) != 1) { rl = get_value_lenth(remainder); dl = get_value_lenth(divider); if (rl == dl) { while (cmp_value(divider, remainder) != 1) { value_sub(remainder, divider); inc_value(result); } } else { clear_value(factor); inc_value(factor); shl_value(factor, rl - dl - 1); mul_value(divider, factor, tractor); while (cmp_value(tractor, remainder) != 1) { value_sub(remainder, tractor); value_add(result, factor); } } } } void long_ext_gcd(signed char *a, signed char *b, signed char *result) { signed char r[VALUE_LENTH], s[VALUE_LENTH], t[VALUE_LENTH], old_r[VALUE_LENTH], old_s[VALUE_LENTH]; signed char quotient[VALUE_LENTH], tmp[VALUE_LENTH], tmp2[VALUE_LENTH]; copy_value(a, old_r); copy_value(b, r); clear_value(s); clear_value(old_s); inc_value(old_s); clear_value(result); clear_value(t); inc_value(t); while (test_value(r)) { div_value(old_r, r, quotient, tmp); copy_value(r, old_r); copy_value(tmp, r); mul_value(quotient, s, tmp2); copy_value(old_s, tmp); value_sub(tmp, tmp2); copy_value(s, old_s); copy_value(tmp, s); mul_value(quotient, t, tmp2); copy_value(result, tmp); value_sub(tmp, tmp2); copy_value(t, result); copy_value(tmp, t); } if (value_is_negative(result)) value_add(result, a); } void create_rsa_key(signed char *p, signed char *q, signed char *e, signed char *n, signed char *d) { signed char ip[VALUE_LENTH], iq[VALUE_LENTH], fi[VALUE_LENTH]; mul_value(p, q, n); copy_value(p, ip); copy_value(q, iq); dec_value(ip); dec_value(iq); mul_value(ip, iq, fi); long_ext_gcd(fi, e, d); } RSAKEY *make_rsa_key(signed char *p, signed char *q, signed char *e) { copy_value(e, local_rsa_key.public_key.exponent); create_rsa_key(p, q, e, local_rsa_key.public_key.modulus, local_rsa_key.private_key.exponent); copy_value(local_rsa_key.public_key.modulus, local_rsa_key.private_key.modulus); return &local_rsa_key; } int main (int argc, char *argv[]) { signed char p[VALUE_LENTH], q[VALUE_LENTH], e[VALUE_LENTH], d[VALUE_LENTH], n[VALUE_LENTH]; if (argc != 4) { printf("Неправильно указаны параметры\n"); return 1; } str_to_value(argv[1], p); str_to_value(argv[2], q); str_to_value(argv[3], e); make_rsa_key(p, q, e); value_to_str(local_rsa_key.private_key.modulus, n); value_to_str(local_rsa_key.private_key.exponent, d); value_to_str(local_rsa_key.public_key.exponent, e); printf("%s %s \n", n, e); printf("%s %s \n", n, d); return 0; }
Генерация ключей шифросвязи при этом происходит без привлечения каких бы то ни было сторонних библиотек, исключительно своими силами, но с соблюдением при этом всех необходимых стандартов RSA.
© Extra Systems, 2024 |