Порт функции с Golang на C++
В моих интересах портировать программу написанную на языке Go на C++. Все шло хорошо, пока не встретил данную функцию...
import (
"crypto/aes"
"crypto/cipher"
)
func AesGCMDecrypt(crypted, key, nounce []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockMode, _ := cipher.NewGCM(block)
origData, err := blockMode.Open(nil, nounce, crypted, nil)
if err != nil{
return nil, err
}
return origData, nil
}
Из названия функции все понятно, она производит расшифровку данных ключем AES методом GCM (не ругайтесь если не правильно сказал =) ). Я попытался реализовать это используя OpenSSL
std::string aes_gcm_decrypt(std::string crypted, std::string key, std::string nounce)
{
int len;
unsigned char output[128];
EVP_CIPHER_CTX* ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, nounce.size(), NULL);
EVP_DecryptInit_ex(ctx, NULL, NULL, (unsigned char*)key.c_str(), (unsigned char*)nounce.c_str());
EVP_DecryptUpdate(ctx, output, &len, (unsigned char*)crypted.c_str(), crypted.size());
if (EVP_DecryptFinal_ex(ctx, output + len, &len) <= 0)
{
return "fail";
}
return "success?";
}
Я не стал даже дописывать, EVP_DecryptFinal_ex кидает ошибку и делается return "fail".