2011-12-19 10 views
-2

暗号化されたデータを送信するJavaクライアントがあります 1.ランダムな文字列は、RSAと公開鍵を使用してオフラインで暗号化されます。 2.手順1で生成されたキーを使用して、データを暗号化します。alg_tripleDES_CBC = http://www.w3.org/2001/04/xmlenc#tripledes-cbcJavaで暗号化された.NETのTripleDESを使用して解読できない

このように第1ステップからキーを復号化できました。

public static string DecryptKey(string encryptedKey) 
    { 
     X509Certificate2 cert = new X509Certificate2("c:\\test.pfx", "test"); 
     RSACryptoServiceProvider privateKeyProvider = (RSACryptoServiceProvider)cert.PrivateKey; 

     string decryptedKey = System.Text.Encoding.UTF8.GetString(privateKeyProvider.Decrypt(Convert.FromBase64String(encryptedKey), false)); 

     return decryptedKey; 

    } 

私はこのコードを使って、第1ステップから生成されたキーを使用してデータを復号化します。

public static string DecryptString(string Message, string Passphrase) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 

     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase)); 

     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 

     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 

     byte[] DataToDecrypt = Convert.FromBase64String(Message); 

     try 
     { 
      ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
      Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); 
     } 
     finally 
     { 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 

     return UTF8.GetString(Results); 
    } 

そして、この例外は2番目の手順では失敗します。

System.Security.Cryptography.CryptographicException: Bad Data. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) 
    at System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
    at ConsoleApplication3.Program.DecryptString(String Message, String Passphrase) in C:\Documents and Settings\rjaladi\Desktop\ConsoleApplication3\ConsoleApplication3\Program.cs:line 66 
    at ConsoleApplication3.Program.Main(String[] args) in C:\Documents and Settings\rjaladi\Desktop\ConsoleApplication3\ConsoleApplication3\Program.cs:line 22 

私のクライアントと確認する必要があるのは何ですか?私はTDESに渡すパラメータに何か問題があることを知っています。どんな助け?

EDIT:メッセージを暗号化する対応するJavaコード。

public String encryptText(String plainText) throws Exception{ 

    byte[] plaintext = plainText.getBytes(); 
    byte[] tdesKeyData = key; 
    byte[] myIV = initializationVector; 

    Cipher c3des = Cipher.getInstance(""DESede/CBC/NoPadding""); 
    SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede"); 
    IvParameterSpec ivspec = new IvParameterSpec(myIV); 
    c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec); 
    byte[] cipherText = c3des.doFinal(plaintext); 
    sun.misc.BASE64Encoder obj64=new sun.misc.BASE64Encoder(); 
    return obj64.encode(cipherText); 
} 
+1

TransformFinalBlockでデータの長さが間違っていることを示しています。 –

+0

'ECB' =>' OMG'。 – CodesInChaos

+1

パラメータをデバッグするために何をしましたか?例外をスローするという事実に基づいて、同じ値であることを確認しましたか? –

答えて

1

あなたの例外は、私が気付いた_DecryptData(...)にスローされました。PaddingModeパラメータが含まれています。その最後のブロックの末尾にあるパディングがチェックされ、正しくないパディングが見つかるとエラーがスローされます。私はあなたがどのパディングモードを使用しているかを見るためにデータを送信している人にチェックすることをお勧めします。解読するときに同じパディングモードを使用する必要があります。

@klartrexによると、ECBモードは使用しないでください。情報が漏れます。 (リテラル)イラストについてはhereを参照してください。もう一方の端を説得できる場合は、代わりにCBCまたはCTRモードを使用します。

+0

私はCBCモードも試しましたが、それは動作しません。メッセージを暗号化する対応するJavaコードを追加しました。 –

+0

私はちょうど受け取ったjavaコードがパディングを指定していないので、実際にはパディングモードをnoneに変更しました。とchipermodeにcbc ..今すぐ例外はありません。しかし、それはガベージを与える、私はおそらくエンコーディングが正しくないと思う。 –

+0

@壊れたリンク:CBCモードでIVが必要です。間違ったIVは最初のブロックにゴミを与えます。 **同じキー、モード、パディング、IV(使用されている場合)を送信者として使用する必要があります。すべてのメッセージが迷惑メールである場合は、正確に一致するようにバイトごとに鍵をチェックします。 – rossum

2

おそらく、これは失敗します。

TDESAlgorithm.Mode = CipherMode.ECB; 

は、Javaを暗号化するためにCBCを使用した場合は、CBCのciphermodeを使用する必要があります。とにかくECBを使用することはお勧めできません。なぜなら、セキュリティ上の欠陥があるからです。

+0

私はCBCもやってみました。このメッセージを暗号化するJavaコードを取得できました。これが役立つ場合。 –

+0

私はちょうど受け取ったjavaコードがパディングを指定していないので、実際にはパディングモードをnoneに変更しました。とchipermodeにcbc ..今すぐ例外はありません。しかし、それはガベージを与える、私はおそらくエンコーディングが正しくないと思う。 –

関連する問題