2012-08-09 101 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