我正在尝试使用密码加密数据并将其存储在ASN.1编码的CMS消息中(使用C#和BouncyCastle 1.4)
我的代码似乎有两个问题:
数据似乎没有用HMAC签名,因此当我篡改encodedData(通过启用注释掉的行)时,解密仍然成功。
当我解密我篡改的数据时,我得到了损坏的纯文本。但是只有两个明文数据块被破坏。这似乎表明加密实际上并不使用CBC模式。
(编辑:忽略第二点,this is exactly how CBC is supposed to work)
这是我正在测试的:
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);
}
我做错了什么?写这个的正确方法是什么?
答案 0 :(得分:1)
要将HMAC添加到CMS消息,您必须使用AuthenticatedData - 结构。
我对Bouncy Castle并不是特别熟悉,但是从粗略看看API,我会说它不支持AuthenticatedData。事实上,它看起来只支持SignedData进行身份验证。
所以你的选择似乎是: