рдмрд┐рдЯ рдЯрди рдореЗрдВ рдЕрдзреНрдпрдпрди

рдПрдХ рдмрд╛рд░, "рдЗрди" рдЙрдард╛рддреЗ рд╕рдордп рдФрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдФрд░ рдЙрдкрдпреЛрдЧреА рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкреИрдХреЗрдЬ рдХреЗ "рдХреИрд╕реЗ" рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдЕрдЪрд╛рдирдХ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рднреА рдмрд╣реБрдд рд╣реА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡рд┐рдЪрд╛рд░ рдЧреБрдордирд╛рдореА рдореЗрдВ рдбреВрдм рдЧрдПред

рд▓реЗрдХрд┐рди рд╢реБрд╖реНрдХ рдЕрд╡рд╢реЗрд╖ рдмрдиреЗ рд░рд╣реЗ - OpenSSL рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд╛рдИ рдЧрдИ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ BN_ULONG рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд░реНрдЧрдореВрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдореЗрдВред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ (рдореИрдВ рдЕрдкрдиреА рдЕрддреНрдпрдзрд┐рдХ рднрд╛рд╡реБрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрдиреЗ рдХрд╛ рдпрд╣ рдЕрд╡рд╕рд░ рд▓реЗрддрд╛ рд╣реВрдВ, рдлрд┐рд░ рд╣рд░ рджрд┐рди рдЖрдкрдХреЛ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╡рд░реНрдЧрдореВрд▓ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдореЛрдбреБрд▓реЛ 2 рд╣реИ - рдЬрд╣рд╛рдВ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ \ n рд╣реИред рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ рдФрд░ рдЕрдкрдиреЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдПрдВред

рдпрджрд┐ рд╣рдо рдПрдХ рдХреЙрд▓рдо рдореЗрдВ, рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдмрд┐рдЯ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдЖрдИ-рдмрд┐рдЯреНрд╕ рдХреЗ рдореВрд▓реНрдп рд╕реЗ, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рдЬрд╛рдирдХрд░, рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд┐рдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдкрд░рд┐рдгрд╛рдо рдЬрд╛рдирдиреЗ рдФрд░ рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реБрдП, рдЖрдк рдЗрди рдмрд┐рдЯреНрд╕ рдХреА рдЬрд▓реНрджреА рд╕реЗ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдХрд╛рд░рдХреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рд╕рд╛рде, рдЕрд░реНрдерд╛рддреНред рдЬрдм рд╡рд░реНрдЧрдореВрд▓ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░рдХ рдХрд╛ рд╕рдВрдЧрдд рдмрд┐рдЯ (рдпрд╣ рдЕрдм рдПрдХ рд╣реИ) рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬрдм n / 2 рдмрд┐рдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЬрдбрд╝ рд╣реИ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рдкреНрдд рджреЛ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЬрдбрд╝реЗрдВ рд╣реЛрдВрдЧреАред

рдЫреЛрдЯреА рдзрд╛рд░рдгрд╛рдПрдБ - рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЬрдбрд╝ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрдВрддрд┐рдо рдмрд┐рдЯреНрд╕ рд╢реВрдиреНрдп рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕рдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛрдб рд╣реИред

рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реЗ рдкреНрд░рд╛рдЗрдо рдирдВрдмрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдмреАрдПрди_рдореВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЦреБрдж рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд╡рд╛рдпрд░_рд░реЙрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд░реВрдЯ рдХреА рджреЛ рдмрд╛рд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЧрдгрдирд╛ рджреЛ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░рдХ 11 рдпрд╛ 01 рдХреЗ рдЕрдВрддрд┐рдо рдмрд┐рдЯреНрд╕ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рднреЗрджреНрдп рд╣реИрдВред рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, OpenSSL рдкреИрдХреЗрдЬ рдХреЗ BIGNUM рдпрд╛ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд┐рдЯрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреЛ рдХреЛрдб

#include <bitset>
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>

using namespace std;
#define DIM 512

int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL;

int bits = DIM;
unsigned long e = RSA_F4;

bool generate_key() {
	r = RSA_new();
	ret = RSA_generate_key_ex(r, bits, bne, NULL);
	return (ret );
}

bitset<DIM> square_root(bitset<DIM> key, int prim_1) {
	bitset<DIM> prim;
	int carry = prim_1;
	int i, j, ie;
	prim[0] = 1;
	prim[1] = prim_1;

	ie = DIM / 2;
	for (i = 2; i < ie; i++) {
		for (j = 1; j < i; j++)
			carry = carry + (int) (prim[j] * prim[i - j]);

		bool i1 = i & 1;
		int q2 = (carry / 2) & 1;
		int key1 = (int) key[i + 1];
		if (!i1 && q2 != key1)
			prim[i] = 1;
		if (!i1 && q2 == key1)
			prim[i] = 0;
		if (i1 && q2 == key1)
			prim[i] = prim[(i + 1) / 2];
		if (i1 && q2 != key1)
			prim[i] = 1 - (int) prim[(i + 1) / 2];

		carry += 2 * (int) prim[i];
		carry /= 2;
	}
	return prim;
}

int main() {
	bitset<DIM> bit0_sqrt(0);
	bitset<DIM> bit1_sqrt(0);
	bitset<DIM> bit_p2(1);
	bne = BN_new();
	ret = BN_set_word(bne, e);
	char *pc, *qc, *rc;

	if (generate_key() == 1) {
		BIGNUM *rez = NULL;
		BIGNUM *p2 = NULL;
		BIGNUM *tmp = NULL;
		const BIGNUM *n = NULL;
		const BIGNUM *e = NULL;
		const BIGNUM *d = NULL;
		const BIGNUM *p = NULL;
		const BIGNUM *q = NULL;

		RSA_get0_key(r, &n, &e, &d);
		RSA_get0_factors(r, &p, &q);

		pc = BN_bn2hex(p);
		printf("  p = 0x%s\n", pc);

		p2 = BN_new();
		tmp = BN_new();
		BN_CTX *ctx;
		ctx = BN_CTX_new();
		BN_CTX_start(ctx);
		BN_mul(p2, p, p, ctx);
		pc = BN_bn2hex(p2);
		printf("p^2 = 0x%s\n", pc);

		bit_p2 = 0;
		for (int i = 0; i < BN_num_bits(p2); i++)
			if (BN_is_bit_set(p2, i))
				bit_p2[i] = 1;

		rez = BN_new();
		bit0_sqrt = square_root(bit_p2, 0);
		for (int i = 0; i < DIM; i++)
			if (bit0_sqrt[i])
				BN_set_bit(rez, i);
			else
				BN_clear_bit(rez, i);
		rc = BN_bn2hex(rez);
		printf(" 0r = 0x%s\n", rc);

		BN_sqr(tmp, rez, ctx);
		rc = BN_bn2hex(tmp);
		printf(" p2 = 0x%s\n", rc);

		bit1_sqrt = square_root(bit_p2, 1);
		for (int i = 0; i < DIM; i++)
			if (bit1_sqrt[i])
				BN_set_bit(rez, i);
			else
				BN_clear_bit(rez, i);
		rc = BN_bn2hex(rez);
		printf(" 1r = 0x%s\n", rc);

		BN_sqr(tmp, rez, ctx);
		rc = BN_bn2hex(tmp);
		printf(" p2 = 0x%s\n", rc);
	}

	BIO_free_all(bp_public);
	BIO_free_all(bp_private);
	RSA_free(r);
	BN_free(bne);
}

рдХреЛрдб рд╕рд░рд▓ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ - рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рднрд╛рдЧ рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЙрд▓ рд╣реИ, рд░реВрдЯ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдмрд┐рдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рдЧрдгрдирд╛ рдХреЗрд╡рд▓ 10 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдбреАрдЖрдИрдПрдо рдПрдХ рдЖрдпрд╛рдо рд╣реИред

   p = 0xE5CBB3DF3D2E3F56A3DEEAE03204A37995970BFD98FE7242EB37BFFC4935BFD3

p^2 = 0xCE4611E425E1B6E3C6594862F0C53A61E3D2460CD86A1709B992806B3B920C89
F2F33861A38225ABFB4A95E65852BEB5930F7968120D65F039A83417531A87E9

    0r = 0x1A344C20C2D1C0A95C21151FCDFB5C866A68F40267018DBD14C84003B6CA402D
    p2 = 0x02AEAA25AB8538367E9B72A28CBBF36EB8A42E11A66D3283E3230072A9268CE3
F2F33861A38225ABFB4A95E65852BEB5930F7968120D65F039A83417531A87E9

    1r = 0xE5CBB3DF3D2E3F56A3DEEAE03204A37995970BFD98FE7242EB37BFFC4935BFD3
    p2 = 0xCE4611E425E1B6E3C6594862F0C53A61E3D2460CD86A1709B992806B3B920C89
F2F33861A38225ABFB4A95E65852BEB5930F7968120D65F039A83417531A87E9

рдирд┐рд╖реНрдХрд░реНрд╖ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдФрд░ 0r рдФрд░ 1r, рд╕рдВрдЦреНрдпрд╛ 2 рдХреЗ modulo 2 рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рд╣реИрдВ DIM рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдПред рдЙрдиред 0r * 0r == P2 mod 2 ^ DIM рдФрд░ 1r * 1r == P2 mod 2 ^ DIMред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 1r * 1r == P2ред

рдмрдЧреБрд▓рд╛ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреЗрдЬ рд╣реИ рдФрд░ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЙрдкрджреНрд░рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдХреЗрдЪ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдЪреНрдЫрд╛ рд╣реИред

All Articles