【问题标题】:Using AesCryptoServiceProvider in VB.NET在 VB.NET 中使用 AesCryptoServiceProvider
【发布时间】:2009-04-06 20:41:15
【问题描述】:

我的问题实际上比如何在 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 传递后对您的解密函数的调用进行比较?
  • 还有:什么版本的 vb.net/visual studio?
  • Visual Studio 2008 Pro 我无法进行您建议的测试,因为我还没有达到从解密到测试的返回值的地步。该错误是由我的 VB 解密函数引发的。
  • 你能否在不发送到 Java 的情况下往返传输一段数据? IE。 DecryptAES(EncryptAES("text", "key"), "key")
  • 请注意,ECB 很少是一个好的模式。因此,如果您想在 VB.net 中加密某些内容,请不要复制粘贴此代码。

标签: java vb.net aes encryption


【解决方案1】:

好的,所以我的原始代码有一些问题。

首先,没有调试。我必须添加一个内部测试来验证我的代码在用 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% 工作时,我才准备好添加。

感谢所有对我的问题发表评论的人。

【讨论】:

  • 很好奇 - 为什么不直接使用 Java 中包含的 AES 密码?而不是通过 JACOB?
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2012-11-09
  • 1970-01-01
相关资源
最近更新 更多