문제

비밀번호로 데이터를 암호화하고 이를 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만 지원하는 것처럼 보입니다.

따라서 귀하의 옵션은 다음과 같습니다.

  1. AuthenticatedData 구조를 처리하려면 다른 라이브러리를 사용하거나 자체 코드를 작성하세요.
  2. HMAC를 계산하고 이를 비표준 방식(고유 속성 또는 대역 외)으로 제공합니다.
  3. 대신 RSA 키 쌍과 함께 SignedData를 사용하세요.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top