2011-10-03 4 views
2

암호화 알고리즘에 대한 정보가있는 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에 도달하기 위해해야 ​​할 일이 무엇인지 알아낼 수있는 방법이 있습니까? 내가 뭔가 잘못하고 있는거야?

+0

CBC-MAC은 패딩이 적용된 메시지에 대해 보안되지 않습니다. 이는 메시지가 DES 블록의 크기 여야하거나 상당한 보안을 잃어 버렸음을 의미합니다. CMAC 또는 HMAC를 사용해야합니다. CMAC는 CBC-MAC을 올바르게 마쳤습니다. 그리고 DES는 안전하지 못하기 때문에 몇 년 전에 사용되지 않았습니다. 아마도 3-key Triple DES, AES 또는 Cameilla와 같은 현대적인 블록 암호로 전환해야합니다. – jww

답변

4

CBC-MAC에는 0 초기화 벡터가 필요합니다.

var IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }; 

당신은 키가 byte[] { 11, 11, 11, 11, 11, 11, 11, 11 } 16 진수 또는 10 진수 (기수 10) 그 바이트라고 : 훨씬 더 명시 적 IV를 지정하려면?

var key = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }; 

을하고 더 나은 작동하는지 확인 : 당신이 시도 할 수 있습니다. 이 사용되는 경우에도 내부적으로 만 MACTripleDES을 구현하기 -

+0

감사합니다. 나는 정확한 결과를 얻을 수는 없지만. 그러나 이것은 제가 시도하지 않은 한 가지 방법이었습니다. – Kamyar

+0

@Kaymar : 질문을 다시 살펴보면 평문 '{0, 6, 4, 1, 7, E, E, F, F, F, F, B, B} '16 진수 또는 10 진수로? 이 값이 16 이하의 모든 값을 가진 올바른 일반 텍스트라고 확신합니까? – rossum

+0

이 bytearray는 사용자 정의 알고리즘을 사용하여 PAN 번호와 PIN 코드를 XOR하여 계산합니다. 이 bytearray는 은행에서 제공 한 것입니다. '{0, 6, 4, 1, ...}'이 올바른 배열이라고 확신합니다. 'Encoding.ASCII.GetBytes'를 사용하여 "06416417EEFFFFBB' 문자열의 바이트 배열을 가져 왔습니다.다른 방법을 사용하여 바이트 배열로 변환해야한다고 제안합니까? – Kamyar

2

Mono 프로젝트는 SymmetricAlgorithm에서 작동해야하는 일반 MAC-CBC 구현을 가지고있다.

MIT.X11 라이선스가있는 소스 코드 here을 찾을 수 있습니다. 을 그대로 사용하십시오. 또는 자신의 코드와 비교하십시오.

관련 문제