2012-02-13 4 views
4

이 질문이 건설적이지는 않았기를 바랍니다. 나는이 문제를 해결하기 위해 내 머리를 벽에 부딪 히고 아무데도 가지 않았다. 그래서, 이것이 나의 마지막 희망입니다 :
질문은 기본적으로 ISO 8583-Rev 93 메시지의 MAC 필드를 생성하는 것에 관한 것입니다.
유효한 메시지 덤프가 있는데 올바른 MAC을 생성하려고합니다. 데이터 암호화로 MAC 생성하기

  • 데이터 암호화하는 new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 } 인 (메시지) (길이 208 바이트) :
  •  
    new byte[] { 49, 50, 48, 48, 70, 54, 51, 52, 56, 52, 48, 49, 56, 56, 69, 49, 49, 48, 48, 48, 48, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 22, 54, 50, 56, 48, 50, 51, 49, 49, 49, 48, 48, 48, 48, 54, 52, 50, 51, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 54, 48, 56, 48, 56, 52, 53, 51, 57, 55, 57, 56, 54, 49, 50, 48, 49, 49, 54, 49, 49, 51, 56, 52, 53, 48, 48, 48, 48, 48, 49, 49, 54, 54, 49, 48, 53, 48, 48, 54, 49, 51, 49, 55, 67, 6, 54, 50, 56, 48, 50, 51, 6, 54, 50, 56, 48, 50, 51, 53, 49, 52, 50, 52, 49, 52, 51, 50, 53, 52, 51, 48, 57, 57, 57, 57, 52, 48, 50, 48, 48, 48, 48, 48, 57, 57, 57, 57, 52, 48, 50, 32, 32, 32, 7, 84, 101, 108, 66, 97, 110, 107, 0, 0, 51, 55, 54, 69, 55, 49, 67, 68, 69, 49, 68, 56, 54, 54, 51, 54, 0, 0 };
      • 암호화 알고리즘 DES, Mode=CBC, IV = new byte[] {0, 0, 0, 0, 0, 0, 0, 0}
      • 암호화 키이다 데이터를 암호화하고 (아마도 결과를 16 진수로 변환 한 후) 유효한 0으로 가져와야합니다.메시지의 128 번째 필드로 들어가는 값. 여기

      내가 (더 많은 구현에 따라) 시도 내용은 다음과 같습니다

      짧은에서
      var mac = Encrypt(dataToEncrypt); 
      // Convert to hex representation. 
      var hexMac = IsoUtils.ByteArrayToHex(mac); 
      // No BF327C0CED48F26B is in hexMac! something is probably wrong! 
      
      
      /// <summary> 
      /// Encrypts the input data. Tried many other ways with the same result. 
      /// </summary>  
      public byte[] Encrypt(byte[] input) 
      { 
          DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); 
          desProvider.Padding = PaddingMode.None; 
          desProvider.Mode = CipherMode.CBC; 
          ICryptoTransform cryptoTransform = desProvider.CreateEncryptor(this._key, this._iv); 
          MemoryStream encryptedStream = new MemoryStream(); 
          CryptoStream cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write); 
      
          cryptStream.Write(input, 0, input.Length); 
          cryptStream.FlushFinalBlock(); 
          encryptedStream.Position = 0; 
          byte[] result = new byte[encryptedStream.Length]; 
          encryptedStream.Read(result, 0, (int)encryptedStream.Length); 
          cryptStream.Close(); 
          return result; 
      } 
      
      
      /// <summary> 
      /// Gets the hex representation of the byte array. The length is 2xdata.Length 
      /// </summary>  
      public static string ByteArrayToHex(byte[] data) 
      { 
          string result = string.Empty; 
          foreach (byte ascii in data) 
          { 
           var n = (int)ascii; 
           result += n.ToString("X").PadLeft(2, '0'); 
          } 
      
          return result; 
      } 
      

      , 어떻게 dataToEncrypt 변수를 암호화하여 BF327C0CED48F26B을 달성 할 수있다?

      정말 감사드립니다.

      UPDATE : 여기가 어떤 도움이 될 수있는 경우에 메시지 세부 사항을이다 :

      ------------------------------------------------------------------------ 
                Data For Encryption       
      ------------------------------------------------------------------------ 
              HEX         NORMAL 
      31 32 30 30 46 36 33 34 38 34 30 31 38 38 45 31  1200F634840188E1 
      31 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30  1000010000000000 
      30 30 30 30 16 36 32 38 30 32 33 31 31 31 30 30  000062802311100 
      30 30 36 34 32 33 31 30 30 30 30 30 30 30 30 30  0064231000000000 
      30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0000000000000000 
      30 30 30 30 31 31 36 30 38 30 38 34 35 33 39 37  0000116080845397 
      39 38 36 31 32 30 31 31 36 31 31 33 38 34 35 30  9861201161138450 
      30 30 30 30 31 31 36 36 31 30 35 30 30 36 31 33  0000116610500613 
      31 37 43 60 36 32 38 30 32 33 60 36 32 38 30 32  17C62802362802 
      33 35 31 34 32 34 31 34 33 32 35 34 33 30 39 39  3514241432543099 
      39 39 34 30 32 30 30 30 30 30 39 39 39 39 34 30  9940200000999940 
      32 20 20 20 70 54 65 6C 42 61 6E 6B 00 00 33 37  2 TelBank 37 
      36 45 37 31 43 44 45 31 44 38 36 36 33 36 00 00  6E71CDE1D86636 
      ------------------------------------------------------------------------ 
               Message ready to be sent       
      ------------------------------------------------------------------------ 
              HEX         NORMAL 
      30 32 32 34 31 32 30 30 46 36 33 34 38 34 30 31  02241200F6348401 
      38 38 45 31 31 30 30 30 30 31 30 30 30 30 30 30  88E1100001000000 
      30 30 30 30 30 30 30 31 16 36 32 38 30 32 33 31  000000016280231 
      31 31 30 30 30 30 36 34 32 33 31 30 30 30 30 30  1100006423100000 
      30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0000000000000000 
      30 30 30 30 30 30 30 30 31 31 36 30 38 30 38 34  0000000011608084 
      35 33 39 37 39 38 36 31 32 30 31 31 36 31 31 33  5397986120116113 
      38 34 35 30 30 30 30 30 31 31 36 36 31 30 35 30  8450000011661050 
      30 36 31 33 31 37 43 60 36 32 38 30 32 33 60 36  061317C6280236 
      32 38 30 32 33 35 31 34 32 34 31 34 33 32 35 34  2802351424143254 
      33 30 39 39 39 39 34 30 32 30 30 30 30 30 39 39  3099994020000099 
      39 39 34 30 32 20 20 20 70 54 65 6C 42 61 6E 6B  99402 TelBank 
      00 00 33 37 36 45 37 31 43 44 45 31 44 38 36 36  376E71CDE1D866 
      33 36 00 00 42 46 33 32 37 43 30 43 45 44 34 38  36 BF327C0CED48 
      46 32 36 42 00 00 00 00       F26B  
      ------------------------------------------------------------------------ 
                 Fields         
      ------------------------------------------------------------------------ 
      [LLVar n  ..19 0016] 002 [6280231110000642] 
      [Fixed n   6 0006] 003 [310000] 
      [Fixed n  12 0012] 004 [000000000000] 
      [Fixed n  12 0012] 006 [000000000000] 
      [Fixed n  10 0010] 007 [0116080845] 
      [Fixed n   6 0006] 011 [397986] 
      [Fixed n  12 0012] 012 [120116113845] 
      [Fixed n   4 0004] 014 [0000] 
      [Fixed n   4 0004] 017 [0116] 
      [Fixed an  12 0012] 022 [61050061317C] 
      [LLVar n  ..11 0006] 032 [628023] 
      [LLVar n  ..11 0006] 033 [628023] 
      [Fixed an  12 0012] 037 [514241432543] 
      [Fixed an  8 0008] 041 [09999402] 
      [Fixed ans  15 0015] 042 [000009999402 ] 
      [LLVar ans ..40 0007] 043 [TelBank] 
      [LLLVar ans ..999 0000] 048 [] 
      [Fixed an  16 0016] 052 [376E71CDE1D86636] 
      [LLLVar ans ..999 0000] 072 [] 
      [Fixed an  16 0016] 128 [BF327C0CED48F26B] 
      

      업데이트 2 : 글쎄, 그 바보 (128)가 채워 져야 필드 자신의 문서에서 언급하는 것을 잊었다 0이면을 암호화하여 전송해야합니다. 시도하고 잘못해서 이것을 발견했습니다!

    답변

    3
    1. MAC은 CBC 암호화의 마지막 8 바이트에 불과합니다.

    2. 메시지의 일부에 대해서만 MAC을 계산해야합니다. 나는 ISO 8583이 어느 부분을 지정했는지 믿지 않는다. 그래서 당신은 은행이 제공 했어야하는 명세서를 볼 필요가있다.

    +0

    응답 해 주셔서 감사합니다. 1 - 나는 일반적으로 그런 경우가 있음을 알고 있지만,이 경우 마지막 8 바이트 인 것처럼 보이지 않습니다. 2 - 맞습니다. 코드의 다른 부분이 정확하다면 문제가있는 것 같습니다. 그러나 그들은 비트 맵과 함께 전체 메시지 (예외 메시지 길이)가 암호화를위한 입력 데이터라고 말했습니다. – Kamyar

    1

    CBC Mac의 경우 CBC Mac은 일반적으로 길이가 길어집니다. 메시지 || 연결입니다. 그래서 당신은 단순히 desEncrypt (length || message, key, cbcmode) 또는 비슷한 것을 부를 필요가 있습니다.