我们如何通过加密字符串识别ASCII或Unicode编码?
我们正在使用asciencoding来保存数据,我们有了支持Unicode值的新要求(区域语言,如(印地语、古吉拉特语),因此我们修改了代码,如下所示,我们没有做太大的更改,只是将asciencoding更改为Unicodeincoding。 问题是我们无法使用Unicode对旧记录进行解密 有没有办法从数据库中存储的加密字符串中识别加密方法 我们正在使用下面的代码我们如何通过加密字符串识别ASCII或Unicode编码?,unicode,encoding,asciiencoding,Unicode,Encoding,Asciiencoding,我们正在使用asciencoding来保存数据,我们有了支持Unicode值的新要求(区域语言,如(印地语、古吉拉特语),因此我们修改了代码,如下所示,我们没有做太大的更改,只是将asciencoding更改为Unicodeincoding。 问题是我们无法使用Unicode对旧记录进行解密 有没有办法从数据库中存储的加密字符串中识别加密方法 我们正在使用下面的代码 Public Function DESEncrypt(ByVal PlainText As String) As String
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编码,因此不会丢失信息
但通常情况下,拥有一个超集编码器就没那么幸运了。因此,一般来说,您应该跟踪编码(例如,在一个新字段中),或者只使用一种编码(因此您可以转换所有数据库)