【发布时间】:2021-08-14 16:44:50
【问题描述】:
我有一个用 C 编写的 AES/CBC 加密代码。我必须在 C# 中转换此代码
C 代码:
EVP_CIPHER_CTX_init(&e_ctx);
err = EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, NULL);
err = EVP_CIPHER_CTX_set_padding(&e_ctx,EVP_CIPH_NO_PADDING);
err = EVP_EncryptUpdate(&e_ctx,cipher,&cipher_len,plain,plain_len);
err = EVP_EncryptFinal_ex(&e_ctx, cipher+cipher_len, &f_len);
C# 代码:
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = key;
//aesAlg.IV = IV;
// Create an encryptor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{ using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{ using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(data);
}
byte[] encrypted = msEncrypt.ToArray();
}
}
}
但在这两种情况下,我都会得到不同的密文。虽然钥匙是一样的。 虽然 IV 未在 C 代码中使用。所以也不要在 c# 代码中使用。但我怀疑 OpenSSL 和 .net API 使用了一些默认的 IV。
【问题讨论】:
-
这能回答你的问题吗? AES-256-CBC in .NET Core (C#)
-
您需要像 C 代码一样将模式设置为 CBC,并将填充设置为 None。
-
无填充将不起作用。将返回错误,例如输入数据必须在块大小中
-
有公钥和私钥。公钥与数据一起发送。如果您要发送串行数据,公钥有时是消息的开头。
-
@jdweng 这是关于 AES 的,AES 只有一个密钥。请不要混淆问题。
标签: c# c .net-core openssl cryptography