2012-02-13 23 views
4

我希望这个问题不会因为不具有建设性而关闭。我一直盯着墙壁解决这个问题,但仍然无处可寻。所以,这是我的最后希望:
问题基本上是关于生成ISO 8583-Rev 93消息的MAC字段。
我有一些有效的消息转储,我试图产生正确的MAC。通过加密数据生成MAC地址

  • 加密算法是DESMode=CBCIV = new byte[] {0, 0, 0, 0, 0, 0, 0, 0}
  • 加密密钥是: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 };
  • 我应该加密数据和(可能在将结果转换为十六进制)到有效的BF327C0CED48F26B值进入消息的第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 2012-02-13 15:23:29

1

CBC-MAC,如果这是他们在做什么,通常是在长度做||消息在哪里||是串联。所以你只需要调用desEncrypt(长度||消息,密钥,cbcmode)或类似的东西