使用 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
中,它应该会始终如一地工作。
我正在为一些敏感信息开发一个半内部加密过程。电子邮件地址等。我正在与一些姊妹公司的其他一些开发人员合作该项目,要求是每个人的加密都可以与其他人的加密通信。我们使用全球密码,现场加密解密信息,仅此而已。
我的问题是,我的加密程序虽然与他们的相匹配,但却给我可变的结果。我目前正在轮询我们的 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
中,它应该会始终如一地工作。