2012-12-29 39 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