生成身份验证CMSEnvelopedData消息bouncycastle
-
11-09-2019 - |
题
我试图对数据进行加密的密码和存储内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进行认证。
所以你的选项似乎是:
- 使用的另一个图书馆(或编写自己的代码),以处理AuthenticatedData结构。
- 计算HMAC和提供它在非标准的方式,(在一个专有的属性或out-of-band)。
- 使用SignedData与RSA密钥对替代。
不隶属于 StackOverflow