![](/img/trans.png)
[英]Using If-Statement as test condition for For-Loop in Vb.net
[英]Using AesCryptoServiceProvider in VB.NET
我的问题实际上比在VB.NET中如何使用AES要复杂得多,因为我真正想要做的是在JACOB中的Java应用程序中使用VB.NET中的AES。 但就目前而言,我需要关注的是AES实现本身。
这是我的加密代码
Public Function EncryptAES(ByVal toEncrypt As String, ByVal key As String) As Byte()
Dim keyArray = Convert.FromBase64String(key)
Dim toEncryptArray = Encoding.Unicode.GetBytes(toEncrypt)
Dim aes = New AesCryptoServiceProvider
aes.Key = keyArray
aes.Mode = CipherMode.ECB
aes.Padding = PaddingMode.ISO10126
Dim encryptor = aes.CreateEncryptor()
Dim encrypted = encryptor.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length)
aes.Clear()
Return encrypted
End Function
回到Java代码后,我将字节数组转换为十六进制字符串。
现在,为了扭转这个过程,这是我的解密代码
Public Function DecryptAES(ByVal toDecrypt As String, ByVal key As String) As Byte()
Dim keyArray = Convert.FromBase64String(key)
Dim toDecryptArray = Convert.FromBase64String(toDecrypt)
Dim aes = New AesCryptoServiceProvider
aes.Key = keyArray
aes.Mode = CipherMode.ECB
aes.Padding = PaddingMode.ISO10126
Dim decryptor = aes.CreateDecryptor()
Dim decrypted = decryptor.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length)
aes.Clear()
Return decrypted
End Function
当我运行解密代码时,我收到以下错误消息
填充无效,无法删除。
好的,所以原始代码有一些问题。
一个,没有调试。 我必须添加一个内部测试来验证我的代码在用Java包装之前可以加密和解密。 这对我来说很愚蠢。
二:加密器和解密器对象的TransformFinalBlock方法似乎没有像宣传的那样执行。
足够的谈话。 这是代码
Public Function EncryptAES(ByVal clearText As String, ByVal key As String) As String
' prepare input
Dim keyBytes = Convert.FromBase64String(key)
Dim sourceBytes = Encoding.Unicode.GetBytes(clearText)
' prepare encryption provider
Dim aes = New AesCryptoServiceProvider
aes.Key = keyBytes
aes.Mode = CipherMode.ECB
aes.Padding = PaddingMode.ISO10126
Dim encryptor = aes.CreateEncryptor()
Dim ms = New MemoryStream
Dim cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
cs.Write(sourceBytes, 0, sourceBytes.Length)
cs.FlushFinalBlock()
Dim encrypted = Convert.ToBase64String(ms.ToArray())
'Dim decrypted = DecryptAES(encrypted, key)
'If Not EventLog.SourceExists("CryptoBridge") Then
' EventLog.CreateEventSource("CryptoBridge", "CryptoBridge")
'End If
'Dim log As New EventLog
'log.Source = "CryptoBridge"
'log.WriteEntry(clearText & ":" & decrypted)
aes.Clear()
cs.Dispose()
ms.Dispose()
Return encrypted
End Function
Public Function DecryptAES(ByVal base64Cipher As String, ByVal key As String) As String
Dim keyBytes = Convert.FromBase64String(key)
Dim cipherBytes = Convert.FromBase64String(base64Cipher)
' prepare decryption provider
Dim aes = New AesCryptoServiceProvider
aes.Key = keyBytes
aes.Mode = CipherMode.ECB
aes.Padding = PaddingMode.ISO10126
Dim decryptor = aes.CreateDecryptor()
Dim ms = New MemoryStream(cipherBytes)
Dim cs = New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
Dim decryptedBytes As Byte()
ReDim decryptedBytes(cipherBytes.Length)
Dim readByteCount = cs.Read(decryptedBytes, 0, decryptedBytes.Length)
Dim decrypted = Encoding.Unicode.GetString(decryptedBytes, 0, readByteCount)
aes.Clear()
cs.Dispose()
ms.Dispose()
Return decrypted
End Function
接下来,我将修改此代码以将AES算法提升到256位和CBC密码模式,这需要初始向量(IV)值。 这增加了实现的复杂程度,我还没有准备好添加,直到其余部分100%的时间工作。
感谢所有对我的问题发表评论的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.