2016-08-04 9 views
0

Javaと.Netの文字列を暗号化しようとしています。しかし問題は、両方のアルゴリズムが異なる結果を生み出すことです。私はトリプルDES暗号化アルゴリズムを使用しています。 同じ結果が得られるはずです。.NETとJavaでTriple DES暗号化の結果が異なる

私の.Net方法:

Public Function EncryptTripleDES(ByVal sIn As String, ByVal sKey As String) As String 
    Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider 
    Dim hashMD5 As New System.Security.Cryptography.MD5CryptoServiceProvider 
    ' scramble the key 
      ' Compute the MD5 hash. 
    DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(sKey)) 
    ' Set the cipher mode. 
    DES.Mode = System.Security.Cryptography.CipherMode.ECB 
    ' Create the encryptor. 
    Dim DESEncrypt As System.Security.Cryptography.ICryptoTransform = DES.CreateEncryptor() 
    ' Get a byte array of the string. 
    Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(sIn) 
    ' Transform and return the string. 
    Return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)) 
End Function 

私のJavaクラス:あなたのために誰もがサポート

public class TrippleDESEncryption { 
    private static final String UNICODE_FORMAT = "UTF8"; 
    public static final String DESEDE_ENCRYPTION_SCHEME = "DESede"; 
    private KeySpec keySpec; 
    private SecretKeyFactory secretKeyFactory; 
    private Cipher cipher; 
    byte[] keyAsBytes; 
    private String encryptionKey; 
    private String encryptionScheme; 
    SecretKey key; 

    public TrippleDESEncryption() throws Exception { 
      encryptionKey = "234342343423434234342343"; 
      encryptionScheme = DESEDE_ENCRYPTION_SCHEME; 
      keyAsBytes = encryptionKey.getBytes(UNICODE_FORMAT); 
      keySpec = new DESedeKeySpec(keyAsBytes); 
      secretKeyFactory = SecretKeyFactory.getInstance(encryptionScheme); 
      cipher = Cipher.getInstance(encryptionScheme); 
      key = secretKeyFactory.generateSecret(keySpec); 

    } 

    /** 
    * Method To Encrypt The String 
    */ 
    public String encrypt(String unencryptedString) { 
      String encryptedString = null; 
      try { 
       cipher.init(Cipher.ENCRYPT_MODE, key); 
       byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT); 
       byte[] encryptedText = cipher.doFinal(plainText); 
       BASE64Encoder base64encoder = new BASE64Encoder(); 
       encryptedString = base64encoder.encode(encryptedText); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return encryptedString; 
    } 
} 
+0

JavaクラスとC#メソッドを投稿したので、正しいパラメータをC#メソッドに渡しているとは言えません。間違って見えるキーのバイトを取得するために、C#でASCIIを、JavaからUTF-8を使用しています。まず、GetBytesの呼び出し結果を互いに照合して確認します。 –

+1

**今日はトリプルDESを使用しないでください。** 192ビットの最大キーサイズを使用しても、最高で112ビットのセキュリティしか提供しません。より短い鍵サイズが使用される場合、それは56または57ビットのセキュリティしか提供しません。 AESはより速く(プロセッサには特別なAES-NI命令セットがあります)、128ビットの最小キーサイズでさらに安全です。また、3DESの最大暗号文サイズには実際的な制限があります。 [3DESとAESのセキュリティ比較](http://security.stackexchange.com/q/26179/45523)を参照してください。 –

+1

** [ECBモード](http://crypto.stackexchange.com/q/14487/13022)**を絶対に使用しないでください。それは決定論的であり、したがって意味的に安全ではありません。少なくとも、[CBC](http://crypto.stackexchange.com/q/22260/13022)や[CTR](http://crypto.stackexchange.com/a/2378/)のようなランダム化モードを使用する必要があります13022)。 [パディング・オラクル攻撃](http://crypto.stackexchange.com/q/18185/13022)のような攻撃が不可能になるように、あなたの暗号文を認証する方が良いです。これは、GCMやEAXなどの認証モードや[暗号化MAC](http://crypto.stackexchange.com/q/202/13022)スキームで行うことができます。 –

答えて

-1

感謝。私は解決策を見つける、ここに私の解決策です。このVB.NETメソッドは正常に動作しています。私の間違いは、VB.NETメソッドがANSIEncodingを使用していて、JavaクラスがUTF8を使用していたことだけでした。

Public Function DecryptTripleDES(ByVal sOut As String, ByVal sKey As String) As String 
    Try 
     Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider 
     DES.Key = UTF8Encoding.UTF8.GetBytes(sKey) 
     ' Set the cipher mode. 
     DES.Mode = System.Security.Cryptography.CipherMode.ECB 
     ' Create the decryptor. 
     Dim DESDecrypt As System.Security.Cryptography.ICryptoTransform = DES.CreateDecryptor() 
     Dim Buffer As Byte() = Convert.FromBase64String(sOut) 
     ' Transform and return the string. 
     Return System.Text.UTF8Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)) 
    Catch ex As Exception 
     Throw New Exception() 
    End Try 
End Function 
+0

暗号化にのみ関心があり、セキュリティではない場合はOKです。安全でないために3DESを使用しないようにする必要がある場合は、AESを使用し、ECBモードを使用しないでください。安全でないためCBCをランダムに使用してください。 Artjom B.のコメントを参照してください。ECBモードを使用しないでください。安全ではありません。[ECBモード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)を参照して、ペンギンまでスクロールしてください。 – zaph

+0

貴重なコメントをいただき、ありがとうございます。将来私はそれを世話するでしょう。私の問題は、クライアント(Java)によって暗号化ロジックが決定され、同等の暗号化ロジックを作成しなければならないということでした。 – Ajeet

+0

悪い理由でセキュリティが悪くなったもう一つのケースは、明らかに専門家ではありません。 – zaph

関連する問題