我有一些签名数据(以signdata 及其签名[base64 编码] 分隔),应通过提供的公钥进行验证以进行匹配。数据由外部函数提供,这些函数将数据存储在如下结构中。
typedef struct {
char * signature;
char * signedData; // base64 encoded --> decoding required
} data;
我需要将其转换为适合 openssl 函数,并假设某处存在错误。它可以编译,但崩溃(SIGSEGV)。这是一个 Android 库,我正在使用 NDK。有什么想法/提示吗?可能是某种转换问题?
//base64函数源码:How do I base64 encode (decode) in C?
//根据http://fm4dd.com/openssl/manual-crypto/EVP_PKEY_verify.htm检查签名
size_t sdlen, siglen;
char *tmp = malloc(1000);
char *signature = malloc(1000);
char *signData = malloc(1000);
sprintf(tmp, "%s", data.signature);
signature = base64decode(&tmp, strlen(tmp));
siglen = strlen(signature);
sprintf(signData, "%s", data.signedData);
sdlen = strlen(signData);
EVP_PKEY_CTX *ctx = malloc(1000);
unsigned char *md, *sig;
char publickeybase64[] = "MIIBIjANBgkqhk.....";
char *publickey = base64decode(&publickeybase64, strlen(publickeybase64));
EVP_PKEY *verify_key = malloc(1000);
sprintf((char *) verify_key, "%s", publickey);
ctx = EVP_PKEY_CTX_new(verify_key, 0);
if (!ctx) {
printf("E1\n");
}
if (EVP_PKEY_verify_init(ctx) <= 0) {
printf("E2\n");
}
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) {
printf("E3\n");
}
if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256() <= 0)) {
printf("E4\n");
}
int ret = EVP_PKEY_verify(ctx, signature, siglen, signData, sdlen);
printf("RESULTVERIFY %d \n", ret);
/* ret == 1 indicates success, 0 verify failure and < 0 for some
* other error.
*/
最佳答案
我不知道“publickeybase64”中到底编码了什么,但创建公钥的整个过程对我来说似乎有点奇怪。
首先,我会替换
EVP_PKEY *verify_key = malloc(1000);
通过类似
EVP_PKEY *verify_key = malloc(sizeof(EVP_PKEY));
或者,如果您使用最新版本的 OpenSSL,
EVP_PKEY *verify_key = EVP_PKEY_new();
然后您需要为 verify_key 设置 RSA key 。请参阅https://www.openssl.org/docs/manmaster/crypto/EVP_PKEY_set1_RSA.html
因此,我认为您首先需要创建 RSA key ( https://www.openssl.org/docs/manmaster/crypto/RSA_new.html )并设置其模数和公共(public)指数(请参阅 https://www.openssl.org/docs/manmaster/crypto/RSA_set0_key.html )。
关于android - 使用 openssl 使用公钥检查数据签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37333684/