日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openssl 学习之从证书中提取RSA公钥N 和 E

發布時間:2023/12/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openssl 学习之从证书中提取RSA公钥N 和 E 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

原文鏈接:?http://blog.csdn.net/kkxgx/article/details/19850509

通常數字證書包含很多信息,其中N和E值即我們稱為的公鑰。如何從PEM 或者DER格式的證書中提出證書呢?下面給出代碼實現從PEM和DER編碼的證書中提出N、E。

?

[cpp]?view plaincopy ?
  • #include?<openssl/evp.h>??
  • #include?<openssl/x509.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • void?PrintHex(unsigned?char?*str,?unsigned?int?len)??
  • {??
  • ????int?i?=?0;??
  • ????for(i?=0;i<?len;?i++)??
  • ????{??
  • ????????if(i%4?==?0)??
  • ????{??
  • ???????printf("0x");??
  • ????}??
  • ????????printf("%02x",str[i]);??
  • ????if(i%4?==?3)??
  • ????????{??
  • ???????????printf("?");??
  • ????????}??
  • ????????if(i%16?==?15)??
  • ????????{??
  • ????????printf("\n");??
  • ????????}??
  • ????}??
  • ????printf("\n");??
  • }??
  • void?GetPukfromPEM()??
  • {??
  • ????X509?*x;??
  • ????BIO?*b;??
  • ????EVP_PKEY?*k;??
  • ????RSA?*rsa;??
  • ????unsigned?char?n[300]?={0x0};??
  • ????unsigned?char?e[300]?={0x0};??
  • ????unsigned?int?len;??
  • ????/*www.google.com1為PEM格式的數字證書,從firefox中導出?*/???????
  • ????b=BIO_new_file("www.google.com1","r");??
  • ????x=PEM_read_bio_X509(b,NULL,NULL,NULL);??
  • ????k=X509_get_pubkey(x);??
  • ????rsa=EVP_PKEY_get1_RSA(k);??
  • ????if(rsa->n?!=?NULL)??
  • ????{??
  • ????????BN_bn2bin(rsa->n,?n);??
  • ????????len=?BN_num_bytes(rsa->n);??
  • ????????printf("N:\n");??
  • ????????PrintHex(n,len);??
  • ????}??
  • ????else??
  • ????{??
  • ????????printf("PEM?error?\n");??
  • ????}??
  • ????if(rsa->e?!=?NULL)??
  • ????{??
  • ????????BN_bn2bin(rsa->e,?e);??
  • ????????len=?BN_num_bytes(rsa->e);????
  • ????????printf("E:\n");??
  • ????????PrintHex(e,len);??
  • ????}??
  • ????else??
  • ????{??
  • ????????printf("PEM?error?\n");??
  • ????}??
  • ????BIO_free(b);??
  • ????X509_free(x);??
  • }??
  • void?GetPukfromDER()??
  • {??
  • ????X509?*x;??
  • ????FILE?*fp;??
  • ????unsigned?char???buf[5000],*p;??
  • ????int?ret;??
  • ? ??
  • ????EVP_PKEY?*k;??
  • ????RSA?*rsa;??
  • ????unsigned?char?n[300]?={0x0};??
  • ????unsigned?char?e[300]?={0x0};??
  • ????unsigned?int?len;??
  • ????/*?www.google.com2為DER編碼的數字證書?,從firefox中導出?
  • ????*/??
  • ????fp=fopen("www.google.com2","rb");??
  • ????if(!fp)?return?;??
  • ????len=fread(buf,1,5000,fp);??
  • ????fclose(fp);??
  • ????p=buf;??
  • ????x=X509_new();??
  • ????d2i_X509(&x,(const?unsigned?char?**)&p,len);??
  • ????k=X509_get_pubkey(x);??
  • ????rsa=EVP_PKEY_get1_RSA(k);??
  • ????if(rsa->n?!=?NULL)??
  • ????{??
  • ????????BN_bn2bin(rsa->n,?n);??
  • ????????len=?BN_num_bytes(rsa->n);??
  • ????printf("N:\n");??
  • ????PrintHex(n,len);??
  • ????}??
  • ????else??
  • ????{??
  • ????????printf("DER?error?\n");??
  • ????}??
  • ????if(rsa->e?!=?NULL)??
  • ????{??
  • ????????BN_bn2bin(rsa->e,?e);??
  • ????????len=?BN_num_bytes(rsa->e);??
  • ????????printf("E:\n");??
  • ????????PrintHex(e,len);??
  • ????}??
  • ????else??
  • ????{??
  • ????????printf("DER?error?\n");??
  • ????}??
  • ? ? ??
  • ????X509_free(x);?????
  • }??
  • int?main()??
  • {??
  • ????GetPukfromPEM();??
  • ????GetPukfromDER();??
  • ????return?0;??
  • }??
  • 程序執行結果如下:

    ?

    ?

    [plain]?view plaincopy ?
  • N:??
  • 0xb073f0f2?0x04eec2a2?0x46ca342a?0xaabb6023???
  • 0xd111761f?0x1f3ad065?0x834e9a45?0xa8437085???
  • 0x76f01f87?0x00021f6e?0x3b1717c4?0xb5e91946???
  • 0xa292258d?0x622ab463?0x301fb985?0xf835e116???
  • 0x5a7649cc?0x50485339?0x5989d684?0x02fb9aec???
  • 0x1bc751d5?0x769590d4?0x3a2ab8a6?0xde024d06???
  • 0xfbcdeda5?0x46415f55?0x74e5ec7e?0x40dc509c???
  • 0xb5e4355d?0x1e6820f8?0xe9dea36a?0x28bf41d2???
  • 0xa1b3e225?0x8d0c1bca?0x3d930c18?0xaedfc5bc???
  • 0xfdbc82ba?0x6800d716?0x32719f65?0xb511da68???
  • 0x59d0a657?0x641bc9fe?0x98e5f5a5?0x65eae1db???
  • 0xeef4b39d?0xb38eea87?0xae16d21e?0xa07c7c69???
  • 0x3f291685?0x0153a76c?0xf160abdd?0xa2fc2547???
  • 0xd432d112?0xddf74812?0xe0fc9ca2?0x7798e989???
  • 0x99b8f838?0xf18c06c2?0x7a23366d?0x9b9dcd30???
  • 0xc8c73417?0x1ebb7d42?0xc8abe715?0x16f673b5???
  • ??
  • E:??
  • 0x010001??
  • N:??
  • 0xb073f0f2?0x04eec2a2?0x46ca342a?0xaabb6023???
  • 0xd111761f?0x1f3ad065?0x834e9a45?0xa8437085???
  • 0x76f01f87?0x00021f6e?0x3b1717c4?0xb5e91946???
  • 0xa292258d?0x622ab463?0x301fb985?0xf835e116???
  • 0x5a7649cc?0x50485339?0x5989d684?0x02fb9aec???
  • 0x1bc751d5?0x769590d4?0x3a2ab8a6?0xde024d06???
  • 0xfbcdeda5?0x46415f55?0x74e5ec7e?0x40dc509c???
  • 0xb5e4355d?0x1e6820f8?0xe9dea36a?0x28bf41d2???
  • 0xa1b3e225?0x8d0c1bca?0x3d930c18?0xaedfc5bc???
  • 0xfdbc82ba?0x6800d716?0x32719f65?0xb511da68???
  • 0x59d0a657?0x641bc9fe?0x98e5f5a5?0x65eae1db???
  • 0xeef4b39d?0xb38eea87?0xae16d21e?0xa07c7c69???
  • 0x3f291685?0x0153a76c?0xf160abdd?0xa2fc2547???
  • 0xd432d112?0xddf74812?0xe0fc9ca2?0x7798e989???
  • 0x99b8f838?0xf18c06c2?0x7a23366d?0x9b9dcd30???
  • 0xc8c73417?0x1ebb7d42?0xc8abe715?0x16f673b5???
  • ??
  • E:??
  • 0x010001 ?
  • ?

    轉載于:https://www.cnblogs.com/huhu0013/p/4794613.html

    總結

    以上是生活随笔為你收集整理的openssl 学习之从证书中提取RSA公钥N 和 E的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。