gpt4 book ai didi

c# - 使用 OpenSSL 的 AES-256/CBC 加密和 C# 中的解密

转载 作者:行者123 更新时间:2023-11-30 17:55:00 28 4
gpt4 key购买 nike

我是密码学的新手。我的要求是解密/加密使用 openssl 加密/解密的文本。我们使用的算法是 Openssl 中的 aes-256-cbc。因此,我试图在我的应用程序中实现相同的功能。到目前为止,经过大量谷歌搜索,我所能做的就是..

private static string Encryptor(string TextToEncrypt)
{
//Turn the plaintext into a byte array.
byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);

//Setup the AES providor for our purposes.
AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();

aesProvider.BlockSize = 128;
aesProvider.KeySize = 256;
//My key and iv that i have used in openssl
aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
aesProvider.Padding = PaddingMode.PKCS7;
aesProvider.Mode = CipherMode.CBC;

ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);
byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length);
return Convert.ToBase64String(EncryptedBytes);
}

private static string Decryptor(string TextToDecrypt)
{
byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt);

//Setup the AES provider for decrypting.
AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
//aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
//aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
aesProvider.BlockSize = 128;
aesProvider.KeySize = 256;
//My key and iv that i have used in openssl
aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
aesProvider.Padding = PaddingMode.PKCS7;
aesProvider.Mode = CipherMode.CBC;


ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);
byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length);
return System.Text.Encoding.ASCII.GetString(DecryptedBytes);
}

我的openssl命令是

openssl aes-256-cbc -e -nosalt -a -in  inputfile.txt -out  output.txt -k key -iv ivkey

我的 key 长度是32位,iv是16位

谢谢...

最佳答案

首先,阅读 openssl 的 man enc-iv 在使用 -k 时被忽略。您可能需要大写 -K。其次,当与 openssl 工具一起使用时,key 和 iv 值是十六进制的,如果您的 C# 使用与命令行相同的字符串,那么您需要执行 appropriate conversions而不是 Encoding.ASCII.GetBytes(7 位编码永远不是正确的答案)。

对于纯文本,您不妨使用 Encoding.UTF8.GetBytes/GetString,因为它向后兼容 ASCII。

如果出于某种原因你真的想使用小写的 -k,一个密码来生成 key 和 iv,这要困难得多,因为 openssl 使用它自己的 key 派生方案。此外,与 -nosalt 标志一起使用是危险的。

-nosalt: doesn't use a salt in the key derivation routines. This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL and SSLeay.

这是危险的原因之一,是因为 IV 不应该被预测或重复用于 AES-CBC,如果您不使用盐,密码短语将始终生成具有相同 IV 的相同 key 这会让你面临多次攻击,并可能泄露有关明文的信息。

您可以从这篇博文 Decrypting OpenSSL AES files in C# 中了解如何从密码短语、与 openssl 相同的 key 和 IV 派生。尽管它是专门针对 AES-128 的,但评论会引导您了解如何针对 aes-256 进行修改,来自 man EVP_BytesToKey:

Hash0 = ''
Hash1 = MD5(Hash0 + Password + Salt)
Hash2 = MD5(Hash1 + Password + Salt)
Hash3 = MD5(Hash2 + Password + Salt)

Key = Hash1 + Hash2
IV = Hash3

关于c# - 使用 OpenSSL 的 AES-256/CBC 加密和 C# 中的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15470190/

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