1. 程式人生 > >ZZ:OpenSSL中產生RSA KEY以及讀取PEM檔案的問題

ZZ:OpenSSL中產生RSA KEY以及讀取PEM檔案的問題

原文搬家了,就算從這裡轉的吧:

ZZ from: http://blog.csdn.net/lazyclough/article/details/7646696

產生openssl RSA Key的命令:

openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key

        BIO *key= NULL;
        RSA
*r= NULL;
        key
= BIO_new(BIO_s_file());
        BIO_read_filename(key,
"c:\\private.key");
        r
= PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);
        BIO_free_all(key);

讀取 private key 讀取正常,r 並不返回空
使用同樣方法讀取 public key

        BIO *key= NULL;
        RSA
*r= NULL;
        key
= BIO_new(BIO_s_file());
        BIO_read_filename(key,
"c:\\public.key");
        r
= PEM_read_bio_RSAPublicKey(key, NULL, NULL, NULL);
        BIO_free_all(key);

不正常, r 總是返回 NULL,將函式改一下 PEM_read_bio_RSA_PUBKEY
  r1 = PEM_read_bio_RSA_PUBKEY(key1, NULL,NULL,NULL);
  openssl_to_keys(r, 1024, priv, pub);
r1 讀取成功

附:

openssl之PEM系列之8---PEM物件讀寫IO函式(二)
    ---根據openssl原始碼、SSLeay Documents以及其它相關材料寫成
    (作者:DragonKing, Mail:

[email protected] ,釋出於:http://openssl.126.com之openssl專業論壇,版本:openssl-0.9.7)
    本文繼續介紹PEM物件的讀寫IO函式,請參看《openssl之PEM系列之7》以便更好理解本文。
    【符合PKCS#8和PKCS#5 v2.0標準的私鑰物件PKCS8PrivateKey的IO】
    int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,char *kstr, int klen,pem_password_cb *cb, void *u);
    這兩個函式使用PKCS#8標準儲存EVP_PKEY裡面的私鑰到檔案或者BIO中,並採用PKCS#5
v2.0的標準加密私鑰。enc引數定義了使用的加密演算法。跟其他PEM的IO函式不一樣的是,本函式的加密是基於PKCS#8層次上的,而不是基於PEM資訊欄位的,所以這兩個函式也是單獨實現的函式,而不是巨集定義函式。如果enc引數為NULL,那麼就不會執行加密操作,只是使用PKCS#8私鑰 資訊
結構。成功執行返回大於0 的數,否則返回0。
    使用這兩個函式儲存的PEM物件可以使用上篇文章介紹的PEM_read_bio_PrivateKey或PEM_read_PrivateKey讀出來。
    下面是一個將私鑰儲存為PKCS#8格式,並使用3DES演算法進行加密,使用的口令是"hello"的例子
    if (!PEM_write_bio_PKCS8PrivateKey(bp, key, EVP_des_ede3_cbc(), NULL, 0, 0, "hello"))
    {
     /*出錯處理程式碼*/
    }
    【符合PKCS#8和PKCS#5 v1.5或PKCS#12標準的私鑰物件PKCS8PrivateKey的IO】
    int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,char *kstr, int klen,pem_password_cb *cb, void *u);
    這兩個函式也是單獨實現的函式,而不是巨集定義函式。他們也是將私鑰儲存成PKCS#8格式,但是採用的方式是PKCS#5 v1.5或者PKCS#12進行私鑰的加密。nid引數指定了相應的加密演算法,其值應該為相應物件的NID。成功執行返回大於0 的數,否則返回0。
    使用這兩個函式儲存的PEM物件可以使用上篇文章介紹的PEM_read_bio_PrivateKey或PEM_read_PrivateKey讀出來。
    【公鑰物件PUBKEY的IO】
    EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);
    EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
    int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x);
    這四個函式對EVP_PKEY結構的公鑰進行PEM格式的讀寫處理。公鑰是作為SubjectPublicKeyInfo儲存結構進行編碼的。
    【RSA私鑰物件RSAPrivateKey的IO】
    RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
    int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
    這四個函式對RSA結構的RSA私鑰進行PEM格式的讀寫處理。它使用跟PrivateKey相同的函式進行處理,但如果私鑰型別不是RSA,就會返回錯誤資訊。
    【RSA公鑰物件RSAPublicKey的IO】
    RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
    int PEM_write_RSAPublicKey(FILE *fp, RSA *x);
    這四個函式是對RSA結構的公鑰進行PEM格式的讀寫處理。本函式使用PKCS#1 RSAPublicKey結構標準對RSA公鑰進行編碼操作。
    【RSA公鑰物件RSA_PUBKEY的IO】
    RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
    RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
    int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);
    int PEM_write_RSA_PUBKEY(FILE *fp, RSA *x);
    這四個函式也是對RSA結構的公鑰進行PEM格式的讀寫處理。但是本函式使用SubjectPublicKeyInfo結構標準對RSA公鑰進行編碼操作,如果公鑰型別不是RSA,就出錯返回失敗資訊。


相關推薦

ZZ:OpenSSL產生RSA KEY以及讀取PEM檔案的問題

原文搬家了,就算從這裡轉的吧: ZZ from: http://blog.csdn.net/lazyclough/article/details/7646696 產生openssl RSA Key的命令: openssl genrsa -out private.key 1

putty新增RSA key

一般我們會在putty 中新增rsa key, 我們首先需要用gitbash(當然也可以用其它的)去生成rsa的公鑰和私鑰,生成後,將公鑰上傳到遠端服務端。如下操作: 第一步:我們先輸入ssh-keygen -t rsa 然後會要求我們確定 路徑我們直接回車會

C#常用的幾種讀取XML檔案的方法

 XML檔案是一種常用的檔案格式,例如WinForm裡面的app.config以及Web程式中的web.config檔案,還有許多重要的場所都有它的身影。Xml是Internet環境中跨平臺的,依賴於內容的技術,是當

XPath在QT的使用(QXmlQuery讀取XML檔案

  最近一段時間和Xml檔案算是幹上了,先後用了QXmlStream、Dom、Dhtmlxtree、DhtmlXform方式讀寫Xml檔案。昨天接到任務讓用Xpath方式實現Xml讀取。經過了解在QT中有QxmlQuery類用來實現XPath,接下來就說說這個東東! 1.

在QT使用tinyxml庫來讀取XML檔案失敗的經歷

增加了一個配置項,XML節點名稱用的數字開頭的,如<11aa>0</11aa> 結果在儲存的時候能成功,但是讀取的時候一直load xml failed。 將其修改成<aa11>0</aa11>之後就好了 特此記錄!

JAVA通過poi和pdfbox讀取office檔案和pdf檔案內容

xlsx* @param file* @return* @throws IOException*/public static String readEXCEL2007(String file) throws IOException {StringBuilder content = new StringBuil

wangeditor使用以及讀取本地檔案錯誤解決(思想教訓深刻啊)

由於專案需要富文字編輯器來設計網站後臺,所以選擇了wangeditor富文字編輯器。 一、生成富文字編輯器 <div class="formDiv"><h3>內容</h3> <div style="width: 100%;max-w

關於tensorflowDataset圖片的批量讀取以及維度的操作

三維的讀取圖片(w, h, c): import tensorflow as tf import glob import os def _parse_function(filename): # print(filename) image_string = tf.re

Random在for以及foreach迴圈產生相同隨機數問題

在Random生成隨機數的時候,他是根據當前毫秒值來進行隨機生成,如果短時間內連續生成隨機數,就會導致生成的隨機數相同。下面我們介紹如何解決在 短時間內生成隨機數的時候,如何避免隨機數不一樣的問題。 利用Lock鎖住random引數 Random rand = new Random(); pub

java讀取配置檔案的一些方法 getResourceAsStream 和 直接 FileInputStream 以及 配置System.getProperty("user.dir")所得的工作目錄

配置檔案位於 /src/ 下的情況已經由上述博主列出,需要的可以移步檢視,即以下幾個情況 1.路徑:src/aa.xml 2.位於src下同一個包下 3.位於src下不同包 不過本博主的專案是web專案,而配置檔案放在src檔案下容易因為快取導致更新不及時,

CTF密碼學RSA學習以及總結

關於CTF中RSA學習筆記 RSA簡介 為了方便理解,先對RSA金鑰體制做個簡略的介紹。 選擇兩個大的引數,計算出模數 N = p * q 計算尤拉函式 φ = (p-1) * (q-1),然後選擇一個e(1<e<φ),並且e和φ互質(互質:公約

golang產生RSA的公鑰以及私鑰

package main import ( "crypto/rsa" "crypto/rand" "fmt" "crypto/x509" "encoding/pem" "os" ) func main() { key, err := rsa.G

使用OpenSSL生成私鑰(Private Key)以及根據Private Key建立證書

                公鑰和私鑰通常是成對出現的,有了公鑰那就存在對應的私鑰,通常OpenSSL,公鑰是很容易從私鑰中得到的,因而我們要建立證書,那我們首先要做的就是建立私鑰。1、使用OpenSSL生成私鑰常用的生成演算法有RSA及DSA,RSA生成的私鑰可以用來加密以及簽名,而DSA生成的私鑰只可

Java使用OpenSSL生成的RSA公私鑰對資料進行加解密

Java基於OpenSSL的公私鑰對資料進行加解密 使用OpenSSL來生成私鑰和公鑰 RSA加密解密工具類 簽名及校驗類 測試類 使用OpenSSL來生成私鑰和公鑰

python 在excel檔案寫入date日期資料,以及讀取excel日期資料,如何在python正確顯示date日期。

如何通過python寫入date資料了? 寫入還是很簡單的。 import xlwt3 import  datetime as dt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Sheet1') wo

JAVA以及JSP讀取XML檔案(解析及路徑問題)

    在系統開發過程中,從配置檔案中讀取配置資訊是每一個系統必須具備的功能,例如,我們要配置讀取資料庫配置資訊,包括驅動程式名、連線字串,使用者名稱,口令等資訊,由於這些資訊會隨著使用者的不同而發生

OPENSSLRSA私鑰檔案PEM格式)解析

在PKCS#1 RSA演算法標準中定義RSA私鑰語法為:  RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e priv

Spark載入本地(或者hdfs)檔案以及 spark使用SparkContext例項的textFile讀取多個資料夾(巢狀)下的多個數據檔案

Spark中載入本地(或者hdfs)檔案以及 spark使用SparkContext例項的textFile讀取多個資料夾(巢狀)下的多個數據檔案 在正常呼叫過程中,難免需要對多個資料夾下的多個檔案進行讀取,然而之前只是明確了spark具備讀取多個檔案的能力。針對多個資料夾下

openssl生成ca證書,以及過程遇到的問題總結

相關說明:轉載於:http://www.cnblogs.com/yangyquin/p/5284530.html在原有的基礎上總結了一些本人安裝過程中的一些問題參考資料:http://blog.sina.com.cn/s/blog_7ea5cb4d0100xfce.html 

OpenSSLHMAC,MD5以及對稱加密演算法的應用

HMAC和MD5: HMAC的使用:#include <openssl/hmac.h> unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,