我们如何通过加密字符串识别ASCII或Unicode编码?

我们如何通过加密字符串识别ASCII或Unicode编码?,unicode,encoding,asciiencoding,Unicode,Encoding,Asciiencoding,我们正在使用asciencoding来保存数据,我们有了支持Unicode值的新要求(区域语言,如(印地语、古吉拉特语),因此我们修改了代码,如下所示,我们没有做太大的更改,只是将asciencoding更改为Unicodeincoding。 问题是我们无法使用Unicode对旧记录进行解密 有没有办法从数据库中存储的加密字符串中识别加密方法 我们正在使用下面的代码 Public Function DESEncrypt(ByVal PlainText As String) As String

我们正在使用asciencoding来保存数据,我们有了支持Unicode值的新要求(区域语言,如(印地语、古吉拉特语),因此我们修改了代码,如下所示,我们没有做太大的更改,只是将asciencoding更改为Unicodeincoding。 问题是我们无法使用Unicode对旧记录进行解密

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

我们正在使用下面的代码

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
公共函数DESEncrypt(ByVal明文作为字符串)作为字符串
作为字节()的Dim KeyBArray
Dim IVBArray作为字节()
作为ICryptoTransform的Dim加密机
Dim PlainTextBArray作为字节()
'将Ascii设置为新的Ascii编码
Dim Ascii作为新的Unicode编码
作为整数的Dim I
将结果变暗为字符串
明文Barray=Ascii.GetBytes(明文)
KeyBArray=Convert.FromBase64String(desKey)
IVBArray=Convert.FromBase64String(desIV)
Dim TDES作为新的TripleDescriptionServiceProvider
Encryptor=TDES.CreateEncryptor(KeyBArray、IVBArray)
Dim CypherTextBArray(Encryptor.OutputBlockSize-1)作为字节
cyphertextbaray=Encryptor.TransformFinalBlock(plaintextbaray,I,plaintextbaray.Length)
Dim TempBArray(CypherTextBArray.Length-1)作为字节
对于I=0到cyphertextbaray.Length-1
TempBArray(I)=CypherTextBArray(I)
下一个
结果=Convert.tobase64字符串(TempBArray)
凯巴拉=什么都没有
伊夫巴雷=什么都没有
加密器=无
纯文本baray=无
Ascii=无
返回结果
端函数
公共函数DESDecrypt(ByVal-CypherText作为字符串)作为字符串
作为字节()的Dim KeyBArray
Dim IVBArray作为字节()
Dim CypherTextBArray作为字节()
Dim解密器作为ICryptoTransform
将纯文本调暗为新的StringBuilder(“”)
作为整数的Dim I
Dim结果为String=String.Empty
如果是CypherText“”,则
cyphertextbaray=Convert.FromBase64String(CypherText)
KeyBArray=Convert.FromBase64String(desKey)
IVBArray=Convert.FromBase64String(desIV)
如果cryptoPrivider=“TripleDES”或cryptoPrivider=“CITripleDES”,则
Dim TDES作为新的TripleDescriptionServiceProvider
Decryptor=TDES.CreateDecryptor(KeyBArray,IVBArray)
其他的
Dim DES作为新的描述服务提供者
Decryptor=DES.CreateDecryptor(KeyBArray,IVBArray)
如果结束
Dim PlainTextBArray(Decryptor.OutputBlockSize-1)作为字节
PlainTextBArray=Decryptor.TransformFinalBlock(CypherTextBArray,I,CypherTextBArray.Length)
'Result=System.Text.Encoding.ASCII.GetString(plainTextBaray)
结果=System.Text.Encoding.Unicode.GetString(PlainTextBArray)
如果结束
凯巴拉=什么都没有
伊夫巴雷=什么都没有
cyphertextbaray=无
解密器=无
纯文本=无
返回结果
端函数

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

但通常情况下,拥有一个超集编码器就没那么幸运了。因此,一般来说,您应该跟踪编码(例如,在一个新字段中),或者只使用一种编码(因此您可以转换所有数据库)