使用OpenSSL进行AES-256 / CBC加密并使用C#进行解密
我是密码学的新手。 我的要求是使用openssl解密/加密加密/解密的文本。 我们使用的算法是Openssl中的aes-256-cbc。 所以,我试图在我的应用程序中实现相同的function。 到目前为止,经过大量的谷歌搜索,我所能做的就是……
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 ……
首先,阅读open forl的man enc
。 使用-k
时忽略-iv
。 你可能想要资本-K
。 其次,当使用openssl工具时,key和iv值是hex的,如果你的C#使用与命令行相同的字符串,那么你需要进行适当的转换而不是Encoding.ASCII.GetBytes
(7位编码永远不会是无论如何正确答案)。
对于纯文本,您可以使用Encoding.UTF8.GetBytes/GetString
因为它向后兼容ASCII。
如果由于某种原因你实际上想要使用小写-k
,密码来生成密钥和iv,那就更难了,因为openssl使用它自己的密钥派生方案。 此外,使用-nosalt
标志也很危险。
-nosalt :在密钥派生例程中不使用salt。 除了测试目的或与古老版本的OpenSSL和SSLeay的兼容性之外,不应该使用此选项。
这是危险的原因之一是由于IV不应该是可预测的或重复用于AES-CBC,如果你不使用盐,密码短语将始终产生相同的密钥与相同的IV打开你多达几次攻击,可以泄露有关明文的信息。
你可以在这篇博文中找到如何从密码中导出密码,与openssl相同的密钥和IV 在C#中解密OpenSSL AES文件,尽管它专门针对AES-128,评论将引导您如何修改aes-256,来自man EVP_BytesToKey
:
上述就是C#学习教程:使用OpenSSL进行AES-256 / CBC加密并使用C#进行解密分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Hash0 = '' Hash1 = MD5(Hash0 + Password + Salt) Hash2 = MD5(Hash1 + Password + Salt) Hash3 = MD5(Hash2 + Password + Salt) Key = Hash1 + Hash2 IV = Hash3
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/992444.html