java - RSA_verify 中预期的数据类型是什么,无法验证从 Java 生成的签名

标签 java c++ openssl digital-signature

我使用以下方法在 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 获得的十六进制,但我不知 Prop 体是什么。

更新

按照 Pras 的建议使用摘要后,我在使用 ERR_get_error 时收到此消息错误: 错误:04091068:rsa 例程:INT_RSA_VERIFY:签名错误

最佳答案

来自 RSA_verify() 手册页:

RSA_verify() verifies that the signature sigbuf of size siglen matches a given message digest m of size m_len. type denotes the message digest algorithm that was used to generate the signature. rsa is the signer's public key.

所以第二个和第三个参数应该是消息摘要和摘要长度而不是实际消息和已签名的消息长度

关于java - RSA_verify 中预期的数据类型是什么,无法验证从 Java 生成的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50700226/

相关文章:

java - DateUtils.parseDate 异常

c++ - 检查二维井字数组位置 C++

c++ - 如何使用 gMock 创建模拟对象?

c++ - .c 文件是否应该包含 .h 文件已经包含的内容?

c++ - 使用 C++、Openssl 和 aes 加密和解密字符串

openssl - OpenSSL 09.8z* 和 1.0.1* 之间的差异

java - 返回 WebService 中的泛型类型

java - EntityManager persist() 没有将任何内容保存到数据库

java - MigLayout 使用 JScrollPane 调整大小

java - 使用 X.509 公共(public)证书进行加密和解密