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

时间:2013-02-21 15:59:56

标签: c# openssl aes

我需要知道如何在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

2 个答案:

答案 0 :(得分:2)

在您的评论中,您要求在OpenSSL中使用C#和Decrypt进行加密。这是a good implementation of EVP_BytesToKey in C#

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

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

希望有所帮助。

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

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

编辑2:OpenSSL 1.1.0c changed the digest algorithm用于某些内部组件。以前使用MD5,1.1.0切换到SHA256。请注意,更改不会影响EVP_BytesToKeyopenssl enc等命令。

答案 1 :(得分:1)

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