2014-03-26 64 views
0

我正在做一些工作查詢使用由另一個(大型,跨國公司)提供的API。其中一個參數需要使用DES進行加密(我知道,它並不被認爲是安全的,但a API已經開發出來並且b。加密的數據很容易被公衆獲得)。我已經到了要求我運行的5個查詢中有2個正在工作,但其他3個不是。C#DES加密輸出不總是匹配預期

這是事情開始混淆我的地方。工作正常的2顯然是正確加密號碼。但是,有關公司已經建議加密輸出與3個失敗的輸出不匹配。我真的不明白這是怎麼回事,但他們告訴我,例如,一個預期的加密輸出應該是「9B2653BF0C348D8BA8643266BEBF329FDD643D2E4F432062」,但我的輸出是「9B2653BF0C348D8B710BCAF2B3DBFCBFDD643D2E4F432062」 - 似乎每個中間有16個字符實例不匹配它們的輸出。

我的代碼加密的數據是這樣的:

public string GetEncryptedValue(string baseValue) 
{ 
    using (var desProvider = new DESCryptoServiceProvider 
      { 
      Mode = CipherMode.ECB, 
      Padding = PaddingMode.PKCS7, 
      Key = Encoding.UTF8.GetBytes(Key) 
      }) 
    using (var memoryStream = new MemoryStream()) 
    using (var cryptoStream = new CryptoStream(memoryStream, 
      desProvider.CreateEncryptor(), CryptoStreamMode.Write)) 
    { 
     var data = Encoding.UTF8.GetBytes(baseValue); 
     cryptoStream.Write(data, 0, data.Length); 
     cryptoStream.FlushFinalBlock(); 

     return ByteArrayToString(memoryStream.ToArray()); 
    } 
} 

private static string ByteArrayToString(ICollection<byte> byteArray) 
{ 
    var hex = new StringBuilder(byteArray.Count * 2); 
    foreach (var singleByte in byteArray) 
    hex.AppendFormat("{0:x2}", singleByte); 
    return hex.ToString().ToUpper(); 
} 

任何人都可以提出建議,至於什麼原因可能是什麼?我試過不同的編碼類型。我知道填充模式是PKCS#5,但按照this SO answer算法是相同的。這家公司規模很大,往往需要幾天的時間才能在幾個國家之間得到一個往往不相關的答案。

謝謝。

+0

您可能有不同的'ByteArrayToString'實現。 – Jodrell

+1

加密輸出爲3 * 8 = 24個字節,表示初始值爲16-23字節長。 DES的塊大小爲8個字節,這意味着8個輸入字節對應8個輸出字節,而ECB模式意味着8個字節塊是獨立的。這和輸出僅由第二個8字節塊產生差異的事實導致*輸入在* 8-16的位置上至少有一個字節不同*。你能檢查你的加密輸入是否與你遇到的問題相同? –

+0

你可能是正確的Oleg,但任何其他編碼類型我用於獲取字節結果在所有輸出不同於預期的輸出。這絕對是基於字符串字段用於加密的相同方法。 – MrShoes

回答

0

事實證明問題出在另一家公司的最後,並準確地備份了Oleg Estekhin的評論:「加密輸出是3 * 8 = 24字節,這意味着初始值是16-23字節長。塊大小爲8個字節,這意味着8個輸入字節對應8個輸出字節,而ECB模式意味着8個字節塊是獨立的,這和輸出只有第二個8字節塊不同的事實導致了結論輸入在位置8-16中至少有一個字節不同。「

添加到他們的系統(這是VIN號碼)的值添加了字母O在他們的數字0應該被使用;有趣的是,字母「O」在VIN中是非法字符,人們會認爲製造汽車的公司會知道!