Мы пытаемся выполнить шифрование RSA с помощью метода «RSA_public_encrypt ()» (openSSL на Symbian), но нам это не совсем удается. Само шифрование проходит успешно, но зашифрованный текст (который мы пытаемся сопоставить с хешем) не такой, каким должен быть (на других платформах мы это проверили, теперь он работает правильно, и здесь мы получаем другие значения). Мы думаем, что это, вероятно, связано с тем, что входные данные не предоставлены в правильном формате для метода «RSA_public_encrypt ()».
Код:
#define RSA_E 0x10001L
void Authenticator::Test(TDesC8& aSignature, TDesC8& aMessage) {
RSA *rsa;
char *plainkey;
char *cipherkey;
int buffSize;
// create the public key
BIGNUM * bn_mod = BN_new();
BIGNUM * bn_exp = BN_new();
const char* modulus2 = "137...859"; // 309 digits
// Convert to BIGNUM
int len = BN_dec2bn(&bn_mod, modulus2); // with 309 digits -> gives maxSize 128 (OK!)
BN_set_word(bn_exp, RSA_E);
rsa = RSA_new(); // Create a new RSA key
rsa->n = bn_mod; // Assign in the values
rsa->e = bn_exp;
rsa->d = NULL;
rsa->p = NULL;
rsa->q = NULL;
int maxSize = RSA_size(rsa); // Find the length of the cipher text
// maxSize is 128 bytes (1024 bits)
// session key received from server side, what format should this be in ???
plainkey = "105...205"; // 309 digits
cipherkey = (char *)malloc(maxSize);
memset(cipherkey, 0, maxSize);
if (rsa) {
buffSize = RSA_public_encrypt(maxSize, (unsigned char *) plainkey, (unsigned char *) cipherkey, rsa, RSA_NO_PADDING);
unsigned long err = ERR_get_error();
free(cipherkey);
free(plainkey);
}
/* Free */
if (rsa)
RSA_free(rsa);
}
У нас есть простой ключ, который состоит из 309 символов, но maxSize составляет 128 байтов (RSA_NO_PADDING, поэтому ввод должен быть равен размеру модуля), поэтому только первые 128 символов зашифрованы (не совсем уверен, правильно ли это?), Что вероятно, поэтому наш зашифрованный текст не такой, каким должен быть. Или есть еще что-то, что мы делаем неправильно? Каким же тогда является правильный способ преобразования нашего простого текста так, чтобы все данные 'plainkey' были зашифрованы?
Мы также попробовали это с шестнадцатеричной строкой «9603cab ...» длиной 256 символов, но безуспешно. Итак, если правильно преобразовать в байты (128), можно ли это использовать, и если да, то как это преобразование будет работать?
Любая помощь приветствуется, спасибо!