2012-08-09 38 views
0

我生成一个公共/私人密钥对使用Java。由于我想将密钥添加到我的代码(不是文件)我使用使用私有密钥从本地代码与openssl

byte[] priv = private_key.getEncoded() 

将其作为字节数组。 要返回从字节数组私钥我使用

PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(priv); 

解密工作正常。 但是现在我想在使用openssl的c应用程序中使用该密钥。 所以我复制字节数组从java到c作为char []。 但我不能够这样的char []转换成私有密钥通过RSA_public_decrypt使用它进行解密(...) 我试图

RSA *r = d2i_RSAPrivateKey(NULL,&priv, len); 

但这总是返回NULL指针

任何人都可以请给我一个关于如何在c语言中做到这一点的提示?

编辑:同时我检查从OpenSSL的错误代码,它说

error:0D0680A8:lib(13):func(104):reason(168)

但我不知道磨这些错误代码的事情。在网上搜索并没有帮助。

非常感谢提前。 Greetings,-chris-

回答

0

感谢srikanth yaradla的提示,我找到了正确的方向。 我是这样做的:

const unsigned char private_key[] = {0x30,...}; 
size_t private_key_len = sizeof(private_key); 
char* buf = (char*)malloc(private_key_len); 
memcpy(buf, private_key, private_key_len); 
BIO* mem=BIO_new_mem_buf(buf, private_key_len); 
PKCS8_PRIV_KEY_INFO* p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(mem, NULL); 
EVP_PKEY* pkey = EVP_PKCS82PKEY(p8inf); 
RSA* r = EVP_PKEY_get1_RSA(pkey); 

这样做,我现在可以很容易地解密数据我从Java部分得到后。

+1

不要忘记通过callint''RSA_free'''释放'''RSA *'''! – 2015-06-29 16:08:51

0

您是在复制编码的二进制数据还是从文件中读取二进制数据? 看到这个How to load an RSA key from binary data to an RSA structure using the OpenSSL C Library?

+0

是的,我早先遇到过这个帖子。这就是为什么我发布我的代码上面。 – Chris 2012-08-09 18:14:28

+0

我只是将我的java源中的byte []作为unsigned char []复制到c源文件中。 – Chris 2012-08-09 18:20:16

+1

看起来像这是你应该使用的一个d2i_PKCS8_PRIV_KEY_INFO。你说它使用PKCS8EncodedKeySpec.But d2i_RSAPrivateKey是为pkcs1.see这个http://www.mail-archive.com/[email protected]/msg02730 .html – 2012-08-09 18:50:55