如何在.Net中使用PKCS7和BouncyCastle Rijndael

时间:2014-06-03 21:13:00

标签: .net vb.net cryptography bouncycastle rijndael

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

我有一些例子向我展示了应用Rijndael后我应该得到的初始数据和结果......我尝试使用.Net RijndaelManaged类,但没有得到任何与预期值类似的东西,我相信它是因为将我的Byte数组转换为String ...时的一些问题

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

这是我的加密功能的一个非常简化的版本,请注意我在此处包含了我的密钥和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

1 个答案:

答案 0 :(得分:0)

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