[英]AES encrypt with OpenSSL, decrypt with C# .Net
我需要知道如何在 AES-OpenSSL 中加密消息并在 .NET(C# 或 VB)中解密或知道 AES-OPENSSL 和 AES-.NET 之间有什么区别
谢谢!
VB.NET 中的代码:
Public Function AES_Decrypt(ByVal prm_key As String, ByVal prm_iv As String, ByVal prm_text_to_decrypt As String)
Dim sEncryptedString As String = prm_text_to_decrypt
Dim myRijndael As New RijndaelManaged
myRijndael.Padding = PaddingMode.Zeros
myRijndael.Mode = CipherMode.CBC
myRijndael.KeySize = 256
myRijndael.BlockSize = 256
Dim key() As Byte
Dim IV() As Byte
key = System.Text.Encoding.ASCII.GetBytes(prm_key)
IV = System.Text.Encoding.ASCII.GetBytes(prm_iv)
Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)
Dim sEncrypted As Byte() = Convert.FromBase64String(sEncryptedString)
Dim fromEncrypt() As Byte = New Byte(sEncrypted.Length) {}
Dim msDecrypt As New MemoryStream(sEncrypted)
Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)
Return (System.Text.Encoding.ASCII.GetString(fromEncrypt))
End Function
在您的评论中,您要求一种在 C# 中加密和在 OpenSSL 中解密的方法。 这是 EVP_BytesToKey 在 C# 中的一个很好的实现。
现在您只需要在 C# 中生成一个随机字节数组,然后在两侧使用这些函数(OpenSSL 端的 EVP 和 C# 中的第二个)与您的公共随机字节数组。
但请注意,您必须使用相同的哈希算法:在给定的链接中,使用 MD5。 您可能必须根据 EVP_BytesToKey 正在使用的一个(或相反)将其更改为 SHA1。 同样的方式,你必须根据你的需要调整帖子中给出的 Derive 算法中的 key 和 iv 大小,这里是 32 和 32。
希望有所帮助。
编辑1:我忘了。 正如 owlstead 在他的评论中所说,Rijndael 允许您使用 256 位的块大小。 但是, AES 块大小始终固定为 128 位,因此您的块大小必须为 128 位,而您的 iv必须为 16 字节。
当你想使用盐时,还有一个问题。 OpenSSL 使用 base64 加密的“Salt__”和实际的 salt 数组预先加密字节数组。 你可以在这篇文章中找到一个例子。
编辑 2: OpenSSL 1.1.0c 更改了一些内部组件中使用的摘要算法。 以前用的是MD5,1.1.0改用SHA256。 请注意,此更改不会影响您对EVP_BytesToKey
和openssl enc
等命令的影响。
AES 是 AES。 有 NIST 测试向量可确保实现兼容,并且还指定了字节顺序。 所以它归结为选择正确的模式(例如 CBC 或经过身份验证的 GCM 模式)和填充模式(PKCS#7 用于 CBC,“无”用于 GCM)。 选择正确的密钥和 IV,您就可以开始了。 要特别注意理解 AES 的输入,尤其要确保你理解编码和字符编码以及随机数生成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.