0

我们正在使用ASCIIEncoding来保存数据我们有支持 Unicode 值的新要求(区域语言,如(印地语,古吉拉特语)所以我们修改代码如下我们没有做大的改变只是将ASCIIEncoding更改为 UnicodeEncoding。问题是我们无法使用UnicodeEncoding解密旧记录

有没有办法从存储在数据库中的加密字符串中识别加密方法

我们正在使用下面的代码

Public Function DESEncrypt(ByVal PlainText As String) As String
    Dim KeyBArray As Byte()
    Dim IVBArray As Byte()
    Dim Encryptor As ICryptoTransform
    Dim PlainTextBArray As Byte()
    'Dim Ascii As New ASCIIEncoding 
    Dim Ascii As New UnicodeEncoding 
    Dim I As Integer
    Dim Result As String

    PlainTextBArray = Ascii.GetBytes(PlainText)
    KeyBArray = Convert.FromBase64String(desKey)
    IVBArray = Convert.FromBase64String(desIV)

    Dim TDES As New TripleDESCryptoServiceProvider
    Encryptor = TDES.CreateEncryptor(KeyBArray, IVBArray)      

    Dim CypherTextBArray(Encryptor.OutputBlockSize - 1) As Byte
    CypherTextBArray = Encryptor.TransformFinalBlock(PlainTextBArray, I, PlainTextBArray.Length)
    Dim TempBArray(CypherTextBArray.Length - 1) As Byte
    For I = 0 To CypherTextBArray.Length - 1
        TempBArray(I) = CypherTextBArray(I)
    Next
    Result = Convert.ToBase64String(TempBArray)
    KeyBArray = Nothing
    IVBArray = Nothing
    Encryptor = Nothing
    PlainTextBArray = Nothing
    Ascii = Nothing
    Return Result
End Function

Public Function DESDecrypt(ByVal CypherText As String) As String
    Dim KeyBArray As Byte()
    Dim IVBArray As Byte()       
    Dim CypherTextBArray As Byte()
    Dim Decryptor As ICryptoTransform
    Dim PlainText As New StringBuilder("")
    Dim I As Integer
    Dim Result As String = String.Empty

    If CypherText <> "" Then
        CypherTextBArray = Convert.FromBase64String(CypherText)
        KeyBArray = Convert.FromBase64String(desKey)
        IVBArray = Convert.FromBase64String(desIV)

        If cryptoPrivider = "TripleDES" Or cryptoPrivider = "CITripleDES" Then
            Dim TDES As New TripleDESCryptoServiceProvider
            Decryptor = TDES.CreateDecryptor(KeyBArray, IVBArray)
        Else
            Dim DES As New DESCryptoServiceProvider
            Decryptor = DES.CreateDecryptor(KeyBArray, IVBArray)
        End If

        Dim PlainTextBArray(Decryptor.OutputBlockSize - 1) As Byte

        PlainTextBArray = Decryptor.TransformFinalBlock(CypherTextBArray, I, CypherTextBArray.Length)
        'Result = System.Text.Encoding.ASCII.GetString(PlainTextBArray) 
        Result = System.Text.Encoding.Unicode.GetString(PlainTextBArray) 

    End If        
    KeyBArray = Nothing
    IVBArray = Nothing
    CypherTextBArray = Nothing
    Decryptor = Nothing
    PlainText = Nothing
    Return Result
End Function
4

1 回答 1

0

您应该使用UTF8Encoding而不是UnicodeEncoding。后者使用 UTF16 编码,因此不兼容 ASCII 字节。相反,UTF8 与 ASCII 字节兼容。两者都支持所有 Unicode 代码,因此不会丢失信息。

但拥有超集编码器的人通常并不那么幸运。因此,一般来说,您应该跟踪编码(例如在新字段中),或者只使用一种编码(以便转换所有数据库)。

于 2018-07-13T11:08:49.603 回答