我已经生成了一对私钥/公钥,我设法加载私钥来签署一些字节。当我尝试从内存加载公钥以验证签名时,问题就出现了。
以下是一些代码:
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 :(得分:4)
问题在于您正在混合PEM_write_bio_RSAPublicKey()
和PEM_read_bio_PUBKEY()
。前者编写PKCS#1 RSAPublicKey结构,而后者需要SubjectPublicKeyInfo结构。这两种结构不可互换,因此在阅读时会出现错误。
要解决此错误,请在将公钥写入BIO时使用PEM_write_bio_RSA_PUBKEY()
。