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

本文关键字:使用 Net 解密 加密 OpenSSL AES | 更新日期: 2023-09-27 18:00:37

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

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

在您的评论中,您询问了在C#中加密和在OpenSSL中解密的方法。下面是EVP_BytesToKey在C#中的一个很好的实现。

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

不过,请注意,您必须使用相同的哈希算法:在给定的链接中,使用MD5。您可能需要将其更改为SHA1,具体取决于EVP_BytesToKey正在使用的EVP_BytetToKey(或反过来)。同样,你必须根据你的需要调整帖子中给出的Derive算法中的密钥和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,"none"表示GCM)。选择正确的钥匙和IV,你就在路上了。要特别注意理解AES的输入,特别是要确保您理解编码、字符编码和随机数生成。