2011-04-23 55 views
1

所有,加密在Java中(AES),解密C++(OpenSSL的)

我试图加密使用AES 256在Java中的字符串,并使用OpenSSL的解密在C++中。在java中我:

  1. 生成SecretKey的一个JCEKS
  2. 加密字符串
  3. 编码都用base64字符串,并从SecretKey的的getEncoded()

现在,我想使用OpenSSL在C++中解密:

string encoded = string("LtANvfmnb5zj+4+g6I7hC53eHMIRa4BOkzMpXYLlA9DRnRWjQjO9uMot6hR7zzTIOtdmkRJ16aVZRfIT3sYn17jYEJjvAN9/N7FbblLplCtOuHatGffH0pSf8lu76SUzDIZU+EXgTnK1SsEa4sndcXvg5jaElxr4GCHq+F2aL7t+LVjbqWg4kpYkYbKdrKQgOsMCbBBG2aMFTmQ/cxnVyH8juC/ZTSrPMyjZ7KxS0P9PzfmxkeSi3VsBIjXL6Q4pneZeemP+1JdG02yQWhruJUuH5aRE0piQ776lxt6g0wU="); 
string encodedKey = string("1rE2AM4Xf0ItxN/s1oDvaNmXhXlVF3hE+vSkyMPzDl4="); 

string decodedEnc = base64_decode(encoded); 
string decodedKey = base64_decode(encodedKey); 

const unsigned char *keyBytes = reinterpret_cast<const unsigned char*>(decodedKey.c_str()); 
const unsigned char *in = reinterpret_cast<const unsigned char*>(decodedEnc.c_str()); 



cout << "initializing" << endl; 
AES_KEY key; 
/* set the encryption key */ 
AES_set_encrypt_key(keyBytes, 256, &key); 

unsigned char *out = (unsigned char*) malloc(1024); 

cout << "Decrypting" << endl; 

AES_ecb_encrypt(in,out,&key,AES_DECRYPT); 

cout << "decrypted " << out << endl; 
char* dec = reinterpret_cast< char*>(out); 

string decrypted = std::string(dec); 

cout << "Decrypted String : '" << decrypted << "'" << endl; 

我得到的所有内容都是垃圾邮件打印到终端。我觉得我很近,所以任何帮助将不胜感激。

感谢 马克

回答

-1

相信Java框架的一个或OpenSSL的支持128个密钥,而不是256字节的密钥。

< Referenced bug report>

0

除了检查密钥长度,确保两个Java和C/OpenSSL的使用相同的初始化向量(IV)。有些框架会为您初始化,其他框架则不会。这是初始块将与XOR进行异或(至少在一种编码模式下)的数据向量,其中AES将每个块对先前块异或。如果没有这个(IIRC它是CBC /循环块编码),最后的块可以被检查,因为它通常具有易于以强力方式验证的填充。

+0

除这是欧洲央行,所以没有IV(我知道它并不安全,但我只是试图找到一些工作) – mlbiam 2011-04-24 13:50:17

1

根据我的理解,尝试解密密钥,然后AES_decrypt应叫如下:

cout << "Decrypting" << endl; 

从该行开始......使用的代码如下:

AES_KEY k 
AES_set_decrypt_key(keyBytes, 256, &k); 

unsigned char* outdecrypt = new unsigned char[1024]; 
AES_decrypt(out, outdecrypt, &k);