2016-04-10 9 views
1

3DES(DESEDE) - C#で(JAVAで行う)暗号化されたテキストを復号化暗号化されたテキストは、(私たちはまったくJAVAのバックグラウンドを持っていない)JAVAで行われ

解読がある、ここでC#であること、そしてだろうコード暗号化されたJavaコードは、しかし、解読しようとしたとき、エラーメッセージ

public String encryptData(String privateKey, String rawData) 
{ 

    Cipher cipher = null; 
    try 
    { 
     cipher = Cipher.getInstance(DESEDE_ENCRYPTION_SCHEME); 
     cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(privateKey)); 
     byte[] plainText = rawData.getBytes(UNICODE_FORMAT); 
     byte[] encryptedText = cipher.doFinal(plainText); 
     return new String(Base64.encodeBase64(encryptedText)); 
    } 
} 

なっている

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

    MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase)); 
    // byte[] TDESKey = UTF8.GetBytes(Passphrase); 
    TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
    TDESAlgorithm.Key = TDESKey; 
    // TDESAlgorithm.Mode = CipherMode.CTS; 
    TDESAlgorithm.Padding = PaddingMode.Zeros; 

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

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

:BAD DATA

ここで私はどこに行方不明ですか?

+0

AFAIK、 'DESEDE_ENCRYPTION_SCHEME'は3DESインスタンスを' ECB'モードで返しますが、.NETの 'TripleDESCryptoServiceProvider()'はデフォルトで 'CBC'モードを返します。 'TDESAlgorithm.Mode = CipherMode.ECB'を設定してください –

+3

' DESEDE_ENCRYPTION_SCHEME'はどのように定義されていますか?その他の問題:a)Oracle JCEプロバイダは、「PaddingMode.Zeros」をサポートしていません。 BouncyCastleを使用する必要があります。 b)あなたはJavaでMD5キーの派生をしていません。また、MD5を1回呼び出すだけでキーを派生させないでください。パスワードをお持ちの場合は、PBKDF2やArgon2などの適切なスキームを使用する必要があります。 –

答えて

0

JavaでMD5を使用していないため、.NETでハッシュを計算するためにMD5を使用しないでください。

キーは、.NETで使用する特定のエンコーディングと同じものを使用して生成されている必要があります。

TripleDESCryptoServiceProviderには、KeySpecとKeyの基本的な違いがあります。 Microsfot https://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx

で述べたように、トリプルDESはあなたが割り当てる前に、適切にあなたの鍵を変換する必要が「64ビット単位で192ビットの128ビットのキーの長さ」

をサポートしています。これを行うには、Array.Resizeメソッドを次のように使用します。

byte[] TDESKey = Encoding.UTF8.GetBytes(Passphrase); 
System.Array.Resize(ref TDESKey , 192/8); 

希望すると、これが役に立ちます。

関連する問題