android - 使用 openssl 使用公钥检查数据签名

标签 android c android-ndk openssl

我有一些签名数据(以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/

相关文章:

Android ViewPager 内存泄漏

c - 重新协商 SSL 握手

c - 保存简单的 XML 文件

c++ - 如何在 Cuda 中使用 struct inside struct

android - 从静态库 *.a 文件构建共享库

android - 由于频繁断网,repo 同步卡在 99%

Android Studio 即时运行问题

android - 放大 KitKat WebView 后不再有文本重排

java - 为什么我的 native C++ 代码在 Android 上的运行速度比 Java 慢得多?

android - NDK错误-无法进行ndk-build