我是加密的新手。我的要求是使用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
我的密钥长度为32位,iv为16位
Thnx ......
答案 0 :(得分:1)
首先,请阅读man enc
以获取openssl。使用-iv
时会忽略-k
。您可能需要大写-K
。其次,当与openssl工具一起使用时,key和iv值是十六进制的,如果你的C#使用与命令行相同的字符串,那么你需要appropriate conversions而不是Encoding.ASCII.GetBytes
(7位编码)反正永远不是正确的答案。)
对于纯文本,您也可以使用Encoding.UTF8.GetBytes/GetString
,因为它向后兼容ASCII。
如果由于某种原因你实际上想要使用小写-k
,密码来生成密钥和iv,这比openssl使用它自己的密钥派生方案要困难得多。此外,使用-nosalt
标志也很危险。
<强> -nosalt 强>: 在密钥派生例程中不使用salt。这个选项应该 除测试目的或与古代兼容外,不得使用 OpenSSL和SSLeay的版本。
这是危险的原因之一是由于IV不应该可预测或重复用于AES-CBC,如果你不使用盐,密码短语将始终使用相同的IV生成相同的密钥这可以打开你的几个攻击,并可以泄漏有关明文的信息。
你可以从这篇博客文章Decrypting OpenSSL AES files in C#中找到如何从密码短语,与openssl相同的密钥和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