AES使用OpenSSL进行加密,使用C#.Net进行解密

我需要知道如何在AES-OpenSSL中加密消息并在.NET中解密(C#或VB)或者知道AES-OPENSSL和AES-.NET之间的区别

谢谢!

VB.NET中的CODE

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 

在您的评论中,您要求在OpenSSL中使用C#和Decrypt进行加密。 这是C#中EVP_BytesToKey的一个很好的实现 。

现在你只需要在C#中生成一个随机字节数组,然后在你的公共随机字节数组的两侧使用这些函数(在openSSL一侧的EVP和在C#中的第二个)。

请注意, 你必须使用相同的哈希算法 :在给定的链接中,使用MD5。 您可能必须将其更改为SHA1,具体取决于EVP_BytesToKey使用的一个(或反之)。 同样,你必须根据你的需要调整post中给出的Derive算法中的key和iv大小,这里是32和32。

希望有所帮助。

编辑1:我忘记了。 正如owlstead在他的评论中所说,Rijndael允许你使用256位的块大小。 但是, AES块大小始终固定为128位 ,因此您的块大小必须是128位,而您的iv 16字节。

如果您想使用盐,还有一个问题。 OpenSSL在您的加密字节数组之前加上“Salt__”的base64加密和实际的salt数组。 你可以在这篇文章中找到一个例子。

编辑2: OpenSSL 1.1.0c改变了一些内部组件中使用的摘要算法 。 以前使用MD5,1.1.0切换到SHA256。 请注意,在EVP_BytesToKeyopenssl enc等命令中,更改不会影响您。

AES是AES。 有NIST测试向量可确保实现兼容,并且还指定了字节顺序。 因此,它归结为选择正确的模式(例如CBC或经过validation的GCM模式)和填充模式(CCS的PKCS#7和GCM的“无”)。 选择正确的钥匙和IV,你就在路上。 请特别注意理解AES的输入,尤其要确保您了解编码和字符编码以及随机数生成。