我试图对数据进行加密的密码和存储内ASN。1编码CMS消息(使用C#和BouncyCastle1.4)

代码,我们似乎有两个问题:

  • 数据似乎并不是已签署与HMAC,所以当我篡改encodedData(由能够说出线),解密仍然成功。

  • 当我数据进行解密,我们被篡改,我得到贝克损坏的纯文本。然而 只有两个街区的文数据 损坏。这似乎表明,密实际上不使用CBC模式。

    (编辑:无视第二点, 这是究竟如何CBC应该是工作)

这是我的测试有:

public void TestMethod1()
{
    byte[] data = new byte[1024]; // plaintext: a list of zeroes

    CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();
    CmsPbeKey encryptionKey = new Pkcs5Scheme2PbeKey("foo", new byte[] { 1, 2, 3 }, 2048);
    generator.AddPasswordRecipient(encryptionKey, CmsEnvelopedDataGenerator.Aes256Cbc);
    CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(data);
    CmsEnvelopedData envelopeData = generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

    byte[] encodedData = envelopeData.GetEncoded();

    // encodedData[500] = 10; // tamper with the data

    RecipientID recipientID = new RecipientID();
    CmsEnvelopedData decodedEnvelopeData = new CmsEnvelopedData(encodedData);
    RecipientInformation recipient = decodedEnvelopeData.GetRecipientInfos().GetFirstRecipient(recipientID);

    byte[] data2 = recipient.GetContent(encryptionKey);

    CollectionAssert.AreEqual(data, data2);
}

我做错了什么?什么是正确的方式写这个?

有帮助吗?

解决方案

增加一个HMAC到CMS消息,你会有用 AuthenticatedData-结构。

我不是特别熟悉的充气城堡,但是从一个粗略地看,我会说,它不支持AuthenticatedData.事实上,它看起来像它只支持SignedData进行认证。

所以你的选项似乎是:

  1. 使用的另一个图书馆(或编写自己的代码),以处理AuthenticatedData结构。
  2. 计算HMAC和提供它在非标准的方式,(在一个专有的属性或out-of-band)。
  3. 使用SignedData与RSA密钥对替代。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top