1

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

2 回答 2

2

在您的评论中,您要求一种在 C# 中加密和在 OpenSSL 中解密的方法。这是C# 中 EVP_BytesToKey 的一个很好的实现

现在您只需要在 C# 中生成一个随机字节数组,然后将这些函数(OpenSSL 端的 EVP 和 C# 中的第二个)与您的通用随机字节数组一起使用。

但请注意,您必须使用相同的哈希算法:在给定的链接中,使用了 MD5。您可能必须将其更改为 SHA1,具体取决于 EVP_BytesToKey 正在使用的一个(或相反)。同样,您必须根据需要调整帖子中给出的 Derive 算法中的密钥和 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.

于 2013-08-20T14:03:47.247 回答
1

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

于 2013-02-21T20:54:49.087 回答