c 库的openssl签名结果与openssl命令行的签名结果不一致

使用openssl命令行签名数据方式如下:

生成公私钥
Generate key pair:
openssl genrsa -out private.pem 1024

通过私钥导出公钥
Extract public key:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

生成签名
openssl dgst -sha256 -sign private.pem < data.txt > sign2

该签名结果为二进制,可以通过notepad++的查看十六进制插件进行查看。插件名称HEX-Editor, 非常好用的插件。

使用RSA_sign方法,得到的值与该结果不一致。
更换了如下方法后,可以正常签名、验签。请注意,我这边的私钥和公钥,不是通过读取文件获取的,是通过读取内存中的字符串获取,且格式是固定的,不能删除换行符和首行、尾行。如果想通过文件读取,网上的技术文章也比较多,公私钥格式如下:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCwhe6xy1m5dEbtjbCEJUjUMjC05zXctPxYynGl3jeko3jfAe/k
dSAuQ44EbZWRCdRJt61th2jouREdrQsQpiTkIxyrqKQISeAa4wFQwAyxosZ3fKI5
sag7wo/w6uBAdi7DVXMra7oTrN4Ostaf9PU7RsWcJ/jblyQDfSIj8vCOnwIBAwKB
gHWunyEyO9D4L0kJIFgY2zghdc3veT3N/ZCG9m6UJRhs+z9Wn+2jasmCXq2eY7YG
jYZ6c55aRfB7YL5zXLXEGJb7mmwhVetMiV69bKI3DXRPy8vySxgy2jc5lPLVZtmt
XYiwgnsY1MmqwFHTIJXPNvfLH3wkDfvfCtWdpmoxVL2bAkEA36g8ew0ODhk4FOcc
G55rCMaX4fQWlwOfLH7hrCDADQZYrVotOYdKMrFeXZ3y0yZ6QOJQ/CrIoFT/IriO
BVL2NQJBAMoMzPuWGUj41LH3QVHaGCJOLa89fs5dSb+xov6lOeUcHZ9VRYzzmvoM
NZiHzGr8TVU0EPW5GSg+w+3v9qOefAMCQQCVGtL8s160ENAN72gSaZywhGVBTWRk
rRTIVJZywIAIruXI5sjRBNwhy5Q+aUyMxFGAluCoHIXAOKoXJbQDjKQjAkEAhrMz
UmQQ21CNy/ori+a6wYlzyij/ND4xKnZsqcN77hK+ajjZCKJnUV15EFqIR1LeOM1g
o9C7cCnX8/VPF779VwJBAMegnSQ3sl/U86Iec2LxQ44NWhwWVTcBm2nyjtxmJTBD
0vh3KeuQHMDMsw3ziMCiRt5D4KExRGCYlfXVfyDlzxk=
-----END RSA PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCwhe6xy1m5dEbtjbCEJUjUMjC0
5zXctPxYynGl3jeko3jfAe/kdSAuQ44EbZWRCdRJt61th2jouREdrQsQpiTkIxyr
qKQISeAa4wFQwAyxosZ3fKI5sag7wo/w6uBAdi7DVXMra7oTrN4Ostaf9PU7RsWc
J/jblyQDfSIj8vCOnwIBAw==
-----END PUBLIC KEY-----
int rsa_prikey_sign(const char *strprikey, unsigned char *data, int data_len, unsigned char *signtext, int *signtext_len)
{
    int ret = RSA_CRYPTO_OK;

    RSA *rsa = NULL; 
    BIO *keybio = NULL; 

    int len;

    EVP_PKEY *evpKey = NULL; 
    EVP_MD_CTX ctx;


    if(NULL == strprikey || NULL == data || NULL == signtext || NULL == signtext_len)
    {
        return RSA_PRAGMA_ERROR;
    }

    if('\0' == *strprikey || data_len <= 0)
    {
        return RSA_PRAGMA_ERROR;
    }

    do{
        rsa = RSA_new();
        keybio = BIO_new_mem_buf((unsigned char *)strprikey, -1); 

        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); 
        if(NULL == rsa)
        {
           ret = RSA_READ_PRIKEY_ERROR;
           break;
        }
  
        evpKey = EVP_PKEY_new();
        if (evpKey == NULL) {
            ret = RSA_MALLOC_ERROR;
            break;
        }

        if (EVP_PKEY_set1_RSA(evpKey, rsa) != 1) {
            ret =  RSA_READ_PRIKEY_ERROR;
            break;
        }

        EVP_MD_CTX_init(&ctx);

        if (EVP_SignInit_ex(&ctx, 
                        EVP_sha256(), NULL) != 1) {
            ret = RSA_SIGN_ERROR;
            break;
        }

        if (EVP_SignUpdate(&ctx, 
                        data, data_len) != 1) {
            ret = RSA_SIGN_ERROR;
            break;
        }   
    
        if (EVP_SignFinal(&ctx, 
                        (unsigned char*)signtext,
                        signtext_len, evpKey) != 1) {
            ret = RSA_SIGN_ERROR;
            break;
        }
        printf("RSA_sign len = %d\n", *signtext_len);
        printHex(signtext, *signtext_len);

        ret = RSA_CRYPTO_OK;
        EVP_MD_CTX_cleanup(&ctx);

    }while(0);
    
    
    if (rsa != NULL) {
        RSA_free(rsa);
        rsa = NULL;
    }

    if (evpKey != NULL) {
        EVP_PKEY_free(evpKey);
        evpKey = NULL;
    }

    if (keybio != NULL) {
        BIO_free_all(keybio);
        keybio = NULL;
    }

    return ret;
}

int rsa_pubkey_verify(const char *strpubkey, unsigned char *data, int data_len,
        unsigned char *signtext, int signtext_len)
{
    int ret = RSA_CRYPTO_OK;

    RSA *rsa = NULL; 
    BIO *keybio = NULL; 
    EVP_PKEY *evpKey = NULL; 
    EVP_MD_CTX ctx;
    int len;

    if(NULL == strpubkey || NULL == signtext || NULL == data)
    {
        return RSA_PRAGMA_ERROR;
    }

    if('\0' == *strpubkey || signtext_len <= 0 || data_len <= 0 )
    {
        return RSA_PRAGMA_ERROR;
    }

  

    do{

        rsa = RSA_new();
        keybio = BIO_new_mem_buf((unsigned char *)strpubkey, -1); 

        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);
        if(NULL == rsa)
        {
            ret = RSA_READ_PUBKEY_ERROR;
            break;
        }
  
        evpKey = EVP_PKEY_new();
        if (evpKey == NULL) {
            ret = RSA_MALLOC_ERROR;
            break;
        }

        if (EVP_PKEY_set1_RSA(evpKey, rsa) != 1) {
            ret =  RSA_READ_PRIKEY_ERROR;
            break;
        }

        EVP_MD_CTX_init(&ctx);

        if (EVP_SignInit_ex(&ctx, 
                        EVP_sha256(), NULL) != 1) {
            ret = RSA_SIGN_ERROR;
            break;
        }

        if (EVP_VerifyUpdate(&ctx, 
                        data, data_len) != 1) {
            ret = RSA_SIGN_ERROR;
            break;
        }   
    
        if (EVP_VerifyFinal(&ctx, 
                        (unsigned char*)signtext,
                        signtext_len, evpKey) != 1) {
            ret = RSA_VERIFY_ERROR;
            break;
        }

        ret = RSA_CRYPTO_OK;
        EVP_MD_CTX_cleanup(&ctx);

    }while(0);
    
    
    if (rsa != NULL) {
        RSA_free(rsa);
        rsa = NULL;
    }

    if (evpKey != NULL) {
        EVP_PKEY_free(evpKey);
        evpKey = NULL;
    }

    if (keybio != NULL) {
        BIO_free_all(keybio);
        keybio = NULL;
    }

    return ret;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容