【问题标题】:How to use PKCS7 with BouncyCastle Rijndael in .Net如何在 .Net 中将 PKCS7 与 BouncyCastle Rijndael 一起使用
【发布时间】:2014-06-03 21:13:00
【问题描述】:

我正在开展一个项目,该项目需要我使用 Rijndael、CBC 和 PKCS7 加密一些数据...

我有一些示例向我展示了初始数据和应用 Rijndael 后我应该得到的结果...我尝试使用 .Net RijndaelManaged 类但没有得到与预期值相似的结果,我相信这是因为转换时出现了一些问题我的字节数组到字符串...

另一方面,使用 BouncyCastle 的 Rijndael 实现,我设法得到了与预期值非常相似的东西,不同之处在于我无法设置 PKCS7 填充模式......而我最大的问题是我找不到任何地方的文档!

这是我的 Encrypt 函数的一个非常简化的版本,请注意我在此处包含我的密钥和 IV 定义只是为了测试。

Public Shared Function Encrypt(data As Byte()) As Byte()
    Dim theCipher As New Org.BouncyCastle.Crypto.Engines.RijndaelEngine()
    Dim ciphr As New PaddedBufferedBlockCipher(New CbcBlockCipher(theCipher), new Pkcs7Padding())

    Dim key As New KeyParameter(System.Text.Encoding.UTF8.GetBytes("---exampleKey---"))
    Dim iv As Byte() = System.Text.Encoding.UTF8.GetBytes("---example-IV---")

    Dim IVKey As New ParametersWithIV(key, iv)
    ciphr.Init(True, IVKey)

    Dim size As Integer = ciphr.GetOutputSize(data.Length)
    Dim result(size) As Byte

    Dim oLen As Integer = ciphr.ProcessBytes(data, 0, data.Length, result, 0)
    oLen += ciphr.DoFinal(result, oLen)

    If oLen < size Then
        Dim tmp(oLen) As Byte
        Array.Copy(result, 0, tmp, 0, oLen)
        result = tmp
    End If

    Return result
End Function

【问题讨论】:

  • 我编辑了函数,我找到了将PKCS7Padding设置为PaddedBufferedBlockCipher的方法,但结果没有改变!
  • 请向我们展示您期望的输出和输出。如果您认为 byte[] / string 转换是问题,请也表明这一点。请注意,“类似的东西”不是一个很好的描述,并且通过加密,“类似的东西”可能会很遥远:)
  • @owlstead 感谢您的评论,这是实际数据:输入:5400863131313334383030313030303634363835303030323031303130303236313230393131303130333233303130303030303030300A0A0A0A0A0A0A0A0A0A 其中0A0A0A0A0A0A0A0A0A0A 是填充。键:1x3oxy8pl0ri3jmh iv:X543a1K9mb6j4lP1 预期结果是953EA291E9B2BFB1394C1571AB7D1923A456C516313143A8ADA21C81CAC14483F6E59EC916CBE5D6CEAD307BFB4D131DF03813E887BBF380F12877FBA647B157,这是正确的,因为我可以在 [aes.online-domain-tools.com] 中复制操作
  • 好的,我看不出你的代码有什么特别的错误。如果你有完整的比赛,你还有问题吗?我无法修复 bouncy 的文档作为答案,这需要 100 万个左右的答案,这太可怕了 :)
  • 好吧,我仍然认为我的代码中缺少某些内容或错误,这是我得到的输出:953EA291E9B2BFB1394C1571AB7D1923A456C516313143A8ADA21C81CAC14483F6E59EC916CBE5D6CEAD307BFB4D131DF03813E887BBF380F12877FBA647B1570767DEACC0F3BFF64A1DD113EF54CBB600

标签: .net vb.net cryptography bouncycastle rijndael


【解决方案1】:

基本上,您的纯文本正好是块大小的 N 倍。这意味着在加密之前添加了一个完整的填充块,从而产生了一个额外的密文块。此外,由于VB创建数组的方式,需要使用Dim varName(size - 1) as Byte

【讨论】:

  • 我没想到……是的,VB 对任何事情都不是很合理……但这不是我的选择!
  • 您对数组定义完全正确,它有帮助!现在我想我必须解决额外的填充块问题......如果我从初始数据中删除它,假设 PKCS7Padding 将添加 10 字节填充是否可以?
  • 它是正确的,更正数组定义并从数据输​​入中排除填充就可以了!谢谢!
  • 呃,抱歉,我无法解析第二条评论。在 CBC 加密之前,明文中添加了一个 16 字节的填充块。如果从明文中删除 10 个字节,那么将添加 10 个字节的填充,是的,并且会少一个块。填充始终至少为 1 和最大。块大小 (16) 字节。
  • 这能解决你的问题吗,巴勃罗?还是需要代码?我的 VB 非常生锈(或焕然一新,这取决于您如何看待它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多