я использую openssl
в моем проекте C ++, но проблема запутала меня.
RSA *rsa = RSA_generate_key(kBits, kExp, 0, 0);
cout << "rsa->n: " << endl
<< rsa->n << endl
<< "rsa->d: " << endl
<< rsa->d << endl
<< "rsa->e: " << endl
<< rsa->e << endl;
char *n_b = BN_bn2hex(rsa->n);
char *d_b = BN_bn2hex(rsa->d);
char *e_b = BN_bn2hex(rsa->e);
n_s = std::string(n_b);
d_s = std::string(d_b);
e_s = std::string(e_b);
RSA *pRSAKey = RSA_new();
BN_hex2bn(&pRSAKey->n, n_s.c_str());
BN_hex2bn(&pRSAKey->d, d_s.c_str());
BN_hex2bn(&pRSAKey->e, e_s.c_str());
cout << "pRSAKey->n: " << endl
<< pRSAKey->n << endl
<< "pRSAKey->d: " << endl
<< pRSAKey->d << endl
<< "pRSAKey->e: " << endl
<< pRSAKey->e << endl;
К моему удивлению, результат следующий:
rsa->n:
0xee2200
rsa->d:
0xee2220
rsa->e:
0xee2240
pRSAKey->n:
0xee2fa0
pRSAKey->d:
0xee2fc0
pRSAKey->e:
0xee3390
Итак, почему значение изменилось? Что я должен сделать, чтобы исправить мой код?
Вы печатаете адреса указателей.
От документы мы можем видеть, что члены RSA
являются pointers
в BIGNUM
:
struct
{
BIGNUM *n; // public modulus
BIGNUM *e; // public exponent
BIGNUM *d; // private exponent
BIGNUM *p; // secret prime factor
BIGNUM *q; // secret prime factor
BIGNUM *dmp1; // d mod (p-1)
BIGNUM *dmq1; // d mod (q-1)
BIGNUM *iqmp; // q^-1 mod p
// ...
};
RSA
Также из документы, мы узнаем, что:
Основным объектом в этой библиотеке является BIGNUM. Он используется для хранения
одно большое целое число. Этот тип следует рассматривать как непрозрачные и поля
не должны быть изменены или доступны напрямую.
использование BN_print
или же BN_print_fp
напечатать BIGNUM
,
Других решений пока нет …