2012-12-29 66 views
2

我已經生成了一對私鑰/公鑰,並且我設法加載私鑰來簽署一些字節。當我嘗試從內存加載公鑰來驗證簽名時,問題就會出現。無法將公鑰加載到內存

下面是一些代碼:

privateKey := BIO_new(BIO_s_mem); 
    PEM_write_bio_RSAPrivateKey(privateKey,rsa,enc,nil,0,nil,PChar('1234567890')); 
    publicKey := BIO_new(BIO_s_mem); 
    PEM_write_bio_RSAPublicKey(publicKey,rsa); 
    WriteLn(GetErrorMessage); 
    //No error so far 
    Writeln('Keys generated!'); 
    pKey := nil; 
    PEM_read_bio_PrivateKey(privateKey,pKey,nil,PChar('1234567890')); 
    // pKey is ok 
    mKey := nil; 
    PEM_read_bio_PUBKEY(publicKey,mKey,nil,nil); 
    WriteLn(GetErrorMessage); 

由最後一行的錯誤輸出消息

PEM routines : PEM_read_bio : no start line 

我在做什麼錯?

+0

我會建議看看Indy是如何做到的...... – ComputerSaysNo

+1

如果你不能使用OpenSSL,那麼也許使用其他庫? LovkBox3,Spring4Delphi等? –

+0

openssl非常快,我想明白我在做什麼錯,而不是切換到其他東西 – opc0de

回答

4

問題是你在混合PEM_write_bio_RSAPublicKey()PEM_read_bio_PUBKEY()。前者編寫一個PKCS#1 RSAPublicKey結構,而後者需要一個SubjectPublicKeyInfo結構。這兩種結構不可互換,因此在閱讀時會出現錯誤。

要解決此錯誤,請在將公鑰寫入BIO時使用PEM_write_bio_RSA_PUBKEY()

+0

我會嘗試你的建議,並在今天晚些時候回覆一個答案。謝謝! – opc0de

+0

PEM_write_bio_RSA_PUBKEY未在我使用的單元中定義。您能否提供它的定義?謝謝 – opc0de

+0

@ opc0de來自http://stackoverflow.com/questions/9723963/delphi-pascal-example-for-calling-openssl-evp-functions:'函數PEM_write_bio_RSA_PUBKEY(bp:PBIO; x:PRSA):integer; cdecl;'我實際上沒有做Delphi,但我幾乎每天都在使用OpenSSL。本來這裏有錯誤的功能;剛剛醒來> _> – atomicinf