2016-11-27 49 views
-1

我有以下的Java代碼:需要諮詢有關Java代碼sipnet轉換爲C#

static final String KEY_STRING = "MOGO_APP"; 

public static byte[] decrypt(byte[] encrypt) 
{ 
    byte[] bArr = null; 
    Key key = new SecretKeySpec(KEY_STRING.getBytes(), "DES"); 
    Cipher cipher = Cipher.getInstance("DES"); 
    cipher.init(2, key); 
    bArr = cipher.doFinal(encrypt); 
    return bArr; 
} 

我想它翻譯成C#。這是我做的:

const string KEY_STRING = "MOGO_APP"; 

public static byte[] decrypt(byte[] encrypt) 
{ 
    byte[] key = Encoding.ASCII.GetBytes(KEY_STRING); 

    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); 
    cryptoProvider.Key = key; 

    using (MemoryStream mm = new MemoryStream()) 
    { 
     using (CryptoStream cs = new CryptoStream(mm, 
      cryptoProvider.CreateDecryptor(), CryptoStreamMode.Write)) 
     { 
      cs.Write(encrypt, 0, encrypt.Length); 
     } 
     return mm.ToArray(); 
    } 
} 

但它沒有給出與Java代碼相同的結果。

我不知道的Java。但是,從我搜索,我想可能有以下錯誤:

  • key可能不一樣,因爲KEY_STRING.getBytes()依賴於應用程序(或系統?)字符集。
  • 轉換後alogrithm可以不與一部開拓創新相同。

我也得到錯誤The specificed key is not valid size

我做的一步一步的轉換,所以我沒有樣品輸入和輸出數據,對不起。你會建議錯誤在哪裏以及如何解決?

+1

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然有問題,請隨時返回更多詳情。 –

+0

@JoeC我已經使用調試器,我知道如何使用它(作爲中級程序員)。問題是我不知道Java。請仔細閱讀問題。 – Sakura

回答

0

後的搜索和閱讀的時間,我找到了解決辦法。 Java中的默認密碼模式是ECB,而在C#是CBC。笛聲是工作代碼:

const string KEY_STRING = "MOGO_APP"; 

public static byte[] decrypt(byte[] encrypt) 
{ 
    byte[] key = Encoding.ASCII.GetBytes(KEY_STRING); 

    DESCryptoServiceProvider cp = new DESCryptoServiceProvider(); 
    cp.Mode = CipherMode.ECB; 
    cp.Key = bytes; 
    ICryptoTransform i = cp.CreateDecryptor(); 
    return i.TransformFinalBlock(encrypt, 0, encrypt.Length); 
} 
1

你已經找到了解決方案,它是getBytes()/GetBytes()電話。您需要明確指定要使用的字節編碼,並確保C#和Java都使用相同的字節編碼。使用系統默認值在跨平臺編寫時通常是一個錯誤。選擇一種編碼:ASCII,UTF-8或其他,並明確指定它在兩側都是相同的。

+0

找到解決方案。看到我的答案。感謝您的幫助! – Sakura