gpt4 book ai didi

encryption - Go 相当于 OpenSSL EVP 对称 EVP_aes_256_cbc

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:24 28 4
gpt4 key购买 nike

我正在编写一个 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_keyiv 字节数组等价物,但我必须承认我无法理解 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)

这就是我迷路的地方。我有一个 evpKeypKey,但我不确定如何从这里解密数据。 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 公钥加密 key 。

在 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.

最佳答案

NewCipher 需要 key 而不是 iv,因为您传递给它的是 128 位 iv,所以它作为 aes128cbc 工作。

关于encryption - Go 相当于 OpenSSL EVP 对称 EVP_aes_256_cbc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25655229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com