//java版本
try{
byte[] salt = {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1};
PBEKeySpec keySpec = new PBEKeySpec("@@@@".toCharArray(), salt, 10, 128); //(基础key, salt, 运算次数, 生成hmackey长度)
byte[] bJs = new SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(keySpec).getEncoded(), "AES").getEncoded();
SecretKeySpec newKey = new SecretKeySpec(bJs, "AES"); //默认cbc128
Cipher localCipher = Cipher.getInstance("AES");
localCipher.init(2, newKey);
String newstr = new String(localCipher.doFinal(StringUtil.hex2Byte("密文Value")));
}catch(Exception e){
e.printStackTrace();
}
//C++版本
//1. 利用key和salt,生成hmacKey
unsigned char hmacKey[16] = { 0 };
unsigned char salt[16] = { 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1 };
PKCS5_PBKDF2_HMAC_SHA1("@@@@", 4, salt, 16, 10, 16, hmacKey); //(基础key, 基础key长度, salt, salt长度, 运算次数, hmackey的字节数)
//3. 利用hmacKey进行解密
EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit(ctx, EVP_aes_128_cbc(), hmacKey, NULL);
EVP_DecryptUpdate(ctx, (unsigned char *)out, &outLen, (unsigned char *)putStr, 16);
EVP_CIPHER_CTX_cleanup(ctx);
就是java和C++长度单位不一样,是个坑