C# 通过加密数据生成MAC

C# 通过加密数据生成MAC,c#,cryptography,iso,des,iso8583,C#,Cryptography,Iso,Des,Iso8583,我希望这个问题不会因为没有建设性而结束。我一直拼命想解决这个问题,但还是一事无成。所以,这是我最后的希望: 问题基本上是关于生成ISO 8583 Rev 93消息的MAC字段。 我有一些有效消息转储,我正在尝试生成正确的MAC 加密算法是DES,Mode=CBC,IV=newbyte[]{0,0,0,0,0,0} 加密密钥是:newbyte[]{0x11、0x11、0x11、0x11、0x11、0x11、0x11、0x11、0x11} 要加密的数据是(消息)(208字节长): 简而言之,如何

我希望这个问题不会因为没有建设性而结束。我一直拼命想解决这个问题,但还是一事无成。所以,这是我最后的希望:
问题基本上是关于生成ISO 8583 Rev 93消息的MAC字段。
我有一些有效消息转储,我正在尝试生成正确的MAC

  • 加密算法是
    DES
    Mode=CBC
    IV=newbyte[]{0,0,0,0,0,0}
  • 加密密钥是:
    newbyte[]{0x11、0x11、0x11、0x11、0x11、0x11、0x11、0x11、0x11}
  • 要加密的数据是(消息)(208字节长):
简而言之,如何通过加密
dataToEncrypt
变量来实现
BF327C0CED48F26B

我真的很感激任何帮助

更新:以下是消息的详细信息,以防对您有所帮助:

------------------------------------------------------------------------
                           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
填充,然后发送加密。通过尝试和错误发现了这一点

  • MAC仅为CBC加密的最后8个字节

  • 您应该只计算部分消息的MAC。我不相信ISO 8583规定了哪些零件,因此您需要查看银行应提供的规格


  • CBC Mac,如果这是他们正在做的,通常是在长度为| |的消息上完成的,其中| |是串联。因此,您只需调用desEncrypt(长度| |消息、密钥、cbcmode)或类似的功能

    谢谢您的响应。1-我知道通常情况是这样的,但它似乎不是本例中的最后8个字节。2-这是正确的,我怀疑如果我的代码的其他部分是正确的,那就是问题所在。但他们表示,整个带有位图的消息(异常消息长度)aalong是加密的输入数据。
    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;
    }
    
    ------------------------------------------------------------------------
                               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]