Extra Systems

CYPHERNET

консольная система надежной коммерческой шифросвязи через сеть интернет

процедура создания ключей RSA keygen


Процедура 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 Extra Web Top