Encryption AES加密协助
我有一个116个字符的十六进制字符串,需要对其进行AES加密,然后转换为Base64。我在StackOverflow这里发现了以下AES加密代码,通过测试,它可以正常工作,至少我得到了与供应商相同的结果。根据供应商的说明,我遇到的问题是“生成的字符串应该是88个字符长,以两个填充字符结尾。”我以172个字符的Base64字符串结尾,我不知道问题出在哪里。任何帮助都将不胜感激Encryption AES加密协助,encryption,aes,Encryption,Aes,我有一个116个字符的十六进制字符串,需要对其进行AES加密,然后转换为Base64。我在StackOverflow这里发现了以下AES加密代码,通过测试,它可以正常工作,至少我得到了与供应商相同的结果。根据供应商的说明,我遇到的问题是“生成的字符串应该是88个字符长,以两个填充字符结尾。”我以172个字符的Base64字符串结尾,我不知道问题出在哪里。任何帮助都将不胜感激 Function EncryptFromStringToBytes(ByVal plainText As String)
Function EncryptFromStringToBytes(ByVal plainText As String) As Byte()
Dim encrypted As Byte()
'Create AES object
Using AES As RijndaelManaged = New RijndaelManaged()
AES.Padding = PaddingMode.PKCS7
AES.KeySize = 256
AES.Mode = CipherMode.CBC
AES.Key = StringToByteArray(strSharedKey)
AES.IV = StringToByteArray(strIV)
'create an encryptor to perform stream transform
Dim encryptor As ICryptoTransform = AES.CreateEncryptor(AES.Key, AES.IV)
'create the streams used for encryption
Using msEncrypt As MemoryStream = New MemoryStream()
Using csEncrypt As CryptoStream = New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
'write all data to the stream. Streamwriter will use the default UTF8 encoding if not specified.
Using swEncrypt As StreamWriter = New StreamWriter(csEncrypt) ', System.Text.Encoding.ASCII)
swEncrypt.Write(plainText)
End Using
encrypted = msEncrypt.ToArray()
End Using
End Using
End Using
'return encrypted bytes from the memory stream and convert to Base64
Return Convert.ToBase64String(encrypted)
'TextBox3.Text = Len(encrypted)
'Return encrypted
End Function
@卢克·约书亚·帕克:
IV、SharedKey和SharedSecret以Hx表示法提供给我。
供应商说明如下:
1.将UTC日期/时间从UTF8转换为Hx表示法
(结果字符串的长度为50个Hx字符。)-这是正确的
2.连接步骤1+“7c”+共享机密
(结果字符串长度为116 Hx个字符)-这是正确的
3.AES加密步骤2-我认为这就是问题所在,但我得到的测试结果值与供应商得到的值相同
4.将步骤3转换为Base64
这是StringToByteArray()函数:
Function StringToByteArray(text As String) As Byte()
Dim bytes As Byte() = New Byte(text.Length \ 2 - 1) {}
For i As Integer = 0 To text.Length - 1 Step 2
bytes(i \ 2) = Convert.ToByte(text.Substring(i, 2), 16)
Next
Return bytes
End Function
作为旁注,如何在文本框中查看加密字符串?如果我使用EncryptFromStringToBytes(CVr2.Text).ToString,它将返回system.byte[]而不是实际值。不加密116个字符的十六进制字符串,而是加密它们所代表的58个字节。
然后,58个字节将提供64个字节的加密数据。64字节等于512位,由于base64对每个字符编码6位,因此需要512/6~86个字符对其进行编码。。由于base64以4个字符的块进行编码,您将需要2个填充字符,最终得到一个88个字符的base64编码字符串。您能否提供从“供应商”处收到的确切说明集?您是否也可以确保您提供了一个-我们看不到您如何定义
strIV
或类似的内容。我提前表示歉意,但您如何加密它们所代表的58个字节?如果我理解正确,请使用StringToByteArray然后加密该结果?谢谢!我做了以下操作,得到了带有2个填充“==”的88个字符的字符串。我按照您的建议做了,将起始字符串转换为字节数组,加密字节数组,然后转换为Base 64字符串,然后POOF!