Я создаю подпись на 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