какой тип данных ожидается в RSA_verify, не может проверить подпись, сгенерированную из Java - PullRequest
0 голосов
/ 05 июня 2018

Я создаю подпись на Java, используя:

String message = "my message";
byte[] data = message.getBytes();
byte[] result;
Signature sig = Signature.getInstance("SHA512withRSA");
sig.initSign(this.privateKey);
sig.update(data);
result = sig.sign();

Затем я сохраняю результат в виде шестнадцатеричной строки в текстовом файле, и с помощью openssl я пытаюсь проверить:

string signature//read hex string in the text file 
string message = "my message";
RSA *rsaPkey = NULL;

FILE *pemFile;
fopen_s(&pemFile, publicKeyFile, "r");
rsaPkey = PEM_read_RSA_PUBKEY(pemFile, &rsaPkey, NULL, NULL);
fclose(pemFile);

if(rsaPkey == NULL)
{
    RSA_free(rsaPkey);
    return 0;
}

int type                = NID_sha512;
const char *m           = message.c_str();
unsigned int m_len      = message.length();
int size                = RSA_size(rsaPkey);
unsigned char *sigret   = (unsigned char*) signature.c_str();
unsigned int siglen     = signature.length();

unsigned char digest[SHA512_DIGEST_LENGTH];

SHA512_CTX ctx;
SHA512_Init(&ctx);
SHA512_Update(&ctx, m, m_len);
SHA512_Final(digest, &ctx);

int r = RSA_verify(type, digest, SHA512_DIGEST_LENGTH, sigret, siglen, rsaPkey);

r всегда равно 0, что означает, что проверка не удалась.Я думаю, это потому, что он ожидает сообщения или подписи в определенном формате, а не в шестнадцатеричном виде, который я получил от Java, но я не знаю, что именно.

ОБНОВЛЕНИЕ

После использования дайджеста, как предложено Pras, я получаю сообщение об ошибке, когда использую ERR_get_error: error:04091068:rsa routines:INT_RSA_VERIFY:bad signature

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Из справочной страницы RSA_verify ():

RSA_verify () проверяет, что сигнатура sigbuf размера siglen соответствует данному дайджесту сообщения m размера m_len.тип обозначает алгоритм дайджеста сообщения, который использовался для генерации подписи.rsa - открытый ключ подписавшего.

Таким образом, вторым и третьим аргументами должны быть дайджест и длина дайджеста, а не фактическое сообщение и длина сообщения, которое было подписано

0 голосов
/ 05 июня 2018

Возможно, byte[] data = message.getBytes(); может не давать ту же последовательность байтов, что и message.c_str().Я предлагаю вам проверить это с помощью отладчика.

...