使用 VB.Net 和 DES 获取可变加密结果

Getting variable encryption results with VB.Net and DES

我正在为一些敏感信息开发一个半内部加密过程。电子邮件地址等。我正在与一些姊妹公司的其他一些开发人员合作该项目,要求是每个人的加密都可以与其他人的加密通信。我们使用全球密码,现场加密解密信息,仅此而已。

我的问题是,我的加密程序虽然与他们的相匹配,但却给我可变的结果。我目前正在轮询我们的 SQL 服务器以查找有问题的要加密的字符串,遍历结果数组,并使用加密的字符串更新服务器。

问题是第一个字符串总是不同于所有后续字符串,并且不被我们应该基于我们的解决方案的测试软件识别为有效。第二个和所有后续字符串都很好。

示例:

test@test.com - BrPURPlWW7+VYrR5puJ/JHXoIp/MV5WR
test@test.com - BrPURPlWW79h+n4Tgot0xRmM7SdWQQsy
test@test.com - BrPURPlWW79h+n4Tgot0xRmM7SdWQQsy

我不太明白发生了什么,因为我可以在我自己的机器上来回加密和解密,没有任何问题。任何建议都会很好。

我的加密函数如下:

Private TripleDES As New DESCryptoServiceProvider     
Sub New(ByVal key As String)        
    Dim ivHash(), keyHash() As Byte

    keyHash = System.Text.Encoding.UTF8.GetBytes(key)
    ReDim Preserve keyHash(7)
    TripleDES.Key = keyHash

    ivHash = System.Text.Encoding.UTF8.GetBytes(String.Empty)
    ReDim Preserve ivHash(7)
    TripleDES.IV = ivHash
End Sub

Public Function EncryptData(ByVal Plaintext As String) As String
    Dim PlaintextBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(Plaintext)
    Dim ms As New System.IO.MemoryStream
    Dim encStream As New CryptoStream(ms, TripleDES.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)

    TripleDES.Mode = CipherMode.ECB

    encStream.Write(PlaintextBytes, 0, PlaintextBytes.Length)
    encStream.FlushFinalBlock()

    Return Convert.ToBase64String(ms.ToArray)
End Function

Public Function DecryptData(ByVal EncryptedText As String) As String
    Dim EncryptedBytes() As Byte = Convert.FromBase64String(EncryptedText)
    Dim ms As New System.IO.MemoryStream
    Dim decStream As New CryptoStream(ms, TripleDES.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write)

    TripleDES.Mode = CipherMode.ECB

    decStream.Write(EncryptedBytes, 0, EncryptedBytes.Length)
    decStream.FlushFinalBlock()

    Return System.Text.Encoding.UTF8.GetString(ms.ToArray)

End Function

您在调用 TripleDES.CreateEncryptor() 后设置 TripleDES.Mode = CipherMode.ECB,因此第一次加密使用默认值 CipherMode.CBC。由于 TripleDES 被重用,在第一次调用 EncryptData 后,它的 Mode 被正确设置。

TripleDES.Mode = CipherMode.ECB 移到 New 中,它应该会始终如一地工作。