암호화 알고리즘에 대한 정보가있는 C#의 MAC-CBC 생성 메서드를 구현해야합니다. 다음은 내가 가지고있는 것입니다.어떻게 DES로 CBC-MAC을 구현할 수 있습니까?
- 나는 DES를 사용해야합니다.
- 키는
byte[] {11, 11, 11, 11, 11, 11, 11, 11}
- 입니다. 데이터 (16 바이트)는 8 바이트 부분으로 암호화해야합니다. 처음 8 바이트는
Instance Vector = new byte[8]
(0 값의 8 바이트)을 사용하여 암호화됩니다. (CBC?) - 암호화 된 값의 마지막 8 바이트는 16 진수 문자열로 변환되어야합니다. 이것이 제가 보내야 할 결과입니다.
public static string Encrypt(byte[] data) { var IV = new byte[8]; var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 }; var result = new byte[16]; // Create DES and encrypt. var des = DES.Create(); des.Key = key; des.IV = IV; des.Padding = PaddingMode.None; des.Mode = CipherMode.CBC; ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV); cryptoTransform.TransformBlock(data, 0, 16, result, 0); // Get the last eight bytes of the encrypted data. var lastEightBytes = new byte[8]; Array.Copy(result, 8, lastEightBytes, 0, 8); // Convert to hex. var hexResult = string.Empty; foreach (byte ascii in lastEightBytes) { int n = (int)ascii; hexResult += n.ToString("X").PadLeft(2, '0'); } return hexResult; }
그들이 나 제공 한 샘플 원시 데이터가 :
input=byte[] {0, 6, 4, 1, 6, 4, 1, 7, E, E, F, F, F, F, B, B)
값의 출력을 리턴한다 :A7CBFB3C730B059C
을이 정보
는, I는 다음의 방법을 구현 하였다. 즉, 암호화 된 데이터의 마지막 8 바이트는 byte[] {167, 203, 251, 60, 115, 11, 05, 156}
이어야합니다.
하지만 불행히도 위의 방법을 사용하면 다음과 같이 나타납니다. 32D91200D0007632
. 내 암호화 된 데이터가 올바르지 않음을 의미합니다. (내 메서드의 생성 된 암호화 된 값의 마지막 8 바이트는 byte[] {50, 207, 18, 0, 208, 0, 118, 50}
입니다.
A7CB에 도달하기 위해해야 할 일이 무엇인지 알아낼 수있는 방법이 있습니까? 내가 뭔가 잘못하고 있는거야?
CBC-MAC은 패딩이 적용된 메시지에 대해 보안되지 않습니다. 이는 메시지가 DES 블록의 크기 여야하거나 상당한 보안을 잃어 버렸음을 의미합니다. CMAC 또는 HMAC를 사용해야합니다. CMAC는 CBC-MAC을 올바르게 마쳤습니다. 그리고 DES는 안전하지 못하기 때문에 몇 년 전에 사용되지 않았습니다. 아마도 3-key Triple DES, AES 또는 Cameilla와 같은 현대적인 블록 암호로 전환해야합니다. – jww