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;
}
}
JavaクラスとC#メソッドを投稿したので、正しいパラメータをC#メソッドに渡しているとは言えません。間違って見えるキーのバイトを取得するために、C#でASCIIを、JavaからUTF-8を使用しています。まず、GetBytesの呼び出し結果を互いに照合して確認します。 –
**今日はトリプルDESを使用しないでください。** 192ビットの最大キーサイズを使用しても、最高で112ビットのセキュリティしか提供しません。より短い鍵サイズが使用される場合、それは56または57ビットのセキュリティしか提供しません。 AESはより速く(プロセッサには特別なAES-NI命令セットがあります)、128ビットの最小キーサイズでさらに安全です。また、3DESの最大暗号文サイズには実際的な制限があります。 [3DESとAESのセキュリティ比較](http://security.stackexchange.com/q/26179/45523)を参照してください。 –
** [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)スキームで行うことができます。 –