猿问

等效于 OpenSSL EVP 对称 EVP_aes_256_cbc

我正在编写一个 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);

我在 Go 中有evp_key和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_decrypt_old或类似的东西,但我无法追踪它的实际含义。


是否有 Go 等价物,或者我是否需要淘汰太贵的cgo包并卷起袖子?


更新(分辨率):

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


// 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 公钥加密密钥。


在 Go 中解密类似的东西:


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.


守着星空守着你
浏览 188回答 1
1回答

慕的地10843

NewCipher 期望密钥而不是 iv,并且由于您将 128 位 iv 传递给它,因此它可以作为 aes128cbc 工作。
随时随地看视频慕课网APP

相关分类

Go
我要回答