bouncycastle을 사용하여 인증된 CMSEnvelopedData 메시지 생성
-
11-09-2019 - |
문제
비밀번호로 데이터를 암호화하고 이를 ASN.1로 인코딩된 CMS 메시지(C# 및 BouncyCastle 1.4 사용)에 저장하려고 합니다.
내가 가지고 있는 코드에는 두 가지 문제가 있는 것 같습니다.
데이터가 HMAC로 서명되지 않은 것 같으므로 내가 encodeData를 조작해도(주석 처리된 행을 활성화하여) 암호 해독이 여전히 성공합니다.
내가 변조한 데이터의 암호를 해독하면 손상된 일반 텍스트가 표시됩니다.하지만 단 두 블록의 일반 텍스트 데이터 손상되었습니다.이는 암호화가 실제로 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);
}
내가 도대체 뭘 잘못하고있는 겁니까?이것을 쓰는 올바른 방법은 무엇입니까?
해결책
CMS 메시지에 HMAC를 추가하려면 인증된 데이터-구조.
저는 Bouncy Castle에 대해 특별히 잘 알지는 못하지만, API를 대략적으로 살펴보면 AuthenticatedData를 지원하지 않는 것으로 보입니다.실제로 인증을 위해 SignedData만 지원하는 것처럼 보입니다.
따라서 귀하의 옵션은 다음과 같습니다.
- AuthenticatedData 구조를 처리하려면 다른 라이브러리를 사용하거나 자체 코드를 작성하세요.
- HMAC를 계산하고 이를 비표준 방식(고유 속성 또는 대역 외)으로 제공합니다.
- 대신 RSA 키 쌍과 함께 SignedData를 사용하세요.
제휴하지 않습니다 StackOverflow