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;
}

Генерация ключей для шифросвязи Extra Systems Cypher Net в этой программе происходит без привлечения каких бы то ни было сторонних библиотек, исключительно своими силами, но с соблюдением при этом всех необходимых стандартов RSA. Программа keygen используется нами в скриптах создания комплекта поставки изделия потребителю.

Контент этой страницы доступен также на английском, французском, немецком, португальском, испанском, итальянском и украинском языке.


© Extra Systems, 2024 Extra Web Top