我正在尝试使用密码加密数据并将其存储在 ASN.1 编码的 CMS 消息中(使用 C# 和 BouncyCastle 1.4)
我的代码似乎有两个问题:
数据似乎没有用 HMAC 签名,所以当我篡改编码数据(通过启用注释掉的行)时,解密仍然成功。
当我解密我篡改的数据时,我得到了损坏的纯文本。然而,只有两个纯文本数据块被破坏。这似乎表明加密实际上并未使用 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);
}
我究竟做错了什么?写这个的正确方法是什么?