2016-11-27 6 views
-1

にJavaコードsipnetを変換相談が必要です:約私はJavaコード次ている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についてよくわかりません。しかし、私が検索するものから、私はエラー以下の持っているかもしれないと思う:

  • keyKEY_STRING.getBytes()アプリ(またはシステム?)文字セットに依存して、同じではないことがあります。
  • 変換された文字は、文字と同じではない場合があります。

また、エラーThe specificed key is not valid sizeも発生します。

私はステップバイステップ変換を行っていますので、サンプルの入出力データはありません。申し訳ありません。エラーがどこにあるのか、それを修正する方法を教えてください。

+1

ようこそ!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

+0

@JoeC私は既にデバッガを使用していますが、私はそれをどのように(中間レベルのプログラマとして)使用するのか知っています。問題は私がJavaを知らないことです。質問をよくお読みください。 – Sakura

答えて

0

検索と読書の時間がたってから、解決策が見つかりました。 Javaのデフォルト暗号モードはECBで、C#はCBCです。 Bellowingは作業コードです。

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

関連する問題