Encryption Go相当于OpenSSL EVP对称EVP_aes_256_cbc

Encryption Go相当于OpenSSL EVP对称EVP_aes_256_cbc,encryption,go,openssl,aes,evp-cipher,Encryption,Go,Openssl,Aes,Evp Cipher,我正在编写一个Go脚本,它将解密一些使用EVP_aes_256_cbc和RSA公钥加密的遗留数据 在C中,这类似于: key_size = EVP_OpenInit(&ctx, EVP_aes_256_cbc(), evp_key, eklen, iv, pkey); //... EVP_OpenUpdate(&ctx, destination, &len_out, buffer_in, buffer_size) //... EVP_OpenFinal(&ctx,

我正在编写一个Go脚本,它将解密一些使用EVP_aes_256_cbc和RSA公钥加密的遗留数据

在C中,这类似于:

key_size = EVP_OpenInit(&ctx, EVP_aes_256_cbc(), evp_key, eklen, iv, pkey);
//...
EVP_OpenUpdate(&ctx, destination, &len_out, buffer_in, buffer_size)
//...
EVP_OpenFinal(&ctx, destination+len_out, &len_out);
// pseudo-code: don't copypasta and expect amazing
EVP_PKEY_assign_RSA(pkey, public_key);
EVP_CIPHER_CTX_init(&ctx);
EVP_SealInit(&ctx, EVP_aes_256_cbc(), &evp_key, &evp_key_len, iv, &pkey, 1);
EVP_SealUpdate(&ctx, buffer_out, &encrypt_len, (unsigned char*)buffer_in, len);
EVP_SealFinal(&ctx, buffer_out+encrypt_len, &encrypt_len);
我在Go中有
evp_密钥
iv
字节数组等价物,但我必须承认,我无法理解evp在OpenSSL中的工作顺序(我在C方面相当有能力,但通过查看OpenSSL源代码,我无法掌握解密过程)

在Go中,我可以做到这一点:

pKey := //rsa.PrivateKey
eklen := 32
evpKey := "// hidden 32 byte array"
iv := "// hidden 16 byte array"

c, err := aes.NewCipher(iv)
cbc := cipher.NewCBCDecrypter(c, iv)
这就是我迷路的地方。我有一个
evpKey
pKey
,但我不知道如何从这里解密数据。OpenSSL使用的是
RSA\u decrypt\u old
或类似的东西,但我无法确定这到底意味着什么

是否有类似的围棋,或者我是否需要拿出太贵的
cgo
套餐,卷起袖子

更新(决议): 对于任何希望在Go中复制EVP行为或只是想知道EVP到底是如何工作的人,下面是分解。 如果您知道C(或Java或任何OpenSSL实现)正在使用以下内容进行加密:

key_size = EVP_OpenInit(&ctx, EVP_aes_256_cbc(), evp_key, eklen, iv, pkey);
//...
EVP_OpenUpdate(&ctx, destination, &len_out, buffer_in, buffer_size)
//...
EVP_OpenFinal(&ctx, destination+len_out, &len_out);
// pseudo-code: don't copypasta and expect amazing
EVP_PKEY_assign_RSA(pkey, public_key);
EVP_CIPHER_CTX_init(&ctx);
EVP_SealInit(&ctx, EVP_aes_256_cbc(), &evp_key, &evp_key_len, iv, &pkey, 1);
EVP_SealUpdate(&ctx, buffer_out, &encrypt_len, (unsigned char*)buffer_in, len);
EVP_SealFinal(&ctx, buffer_out+encrypt_len, &encrypt_len);
“密封”实际上只是用RSA公钥加密密钥

在中,要解密类似的内容:

evpKeyBytes := "// the rsa.PublicKey encoded evpKey"
evpKey, err := rsa.DecryptPKCS1v15(rand.Reader, PrivateKeyRSA, evpKeyBytes)
c, err := aes.NewCipher(evpKey)
cbc := cipher.NewCBCDecrypter(c, iv)
decryptedDataBytes := make([]bytes, 2048) // some message size
cbc.CryptBlocks(decryptedDataBytes, encryptedDataBytes)
data = string(decryptedDataBytes)
// data should have the expected decrypted result.

NewCipher
需要的是密钥而不是iv,因为您要传递128位iv,所以它可以作为aes128cbc使用。

我拥有的密钥肯定是256位。iv绝对是128位的。而NewCypher除了16字节的
iv
之外,对任何东西都感到恐慌。这可能是Go的
加密
库的一个限制,这使得整个事情变得徒劳无益。@oliverseal如果它对一个256位的密钥感到恐慌,那么您的设置就出了问题。检查