0

異なるプラットフォームで AES 暗号化を使用して文字列を暗号化しようとしています。PHPとJavaを正常に実行できます。しかし、ASP .NET で試してみると、別の値が返されます。Java コード

String input="Text";
String key="1234567891234567";
    byte[] crypted = null;
            try {
                SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, skey);
                crypted = cipher.doFinal(input.getBytes());
            } catch (Exception exception) {
                throw exception;
            }
            return new String(Base64.encodeBase64(crypted));

ASP コード:

AesManaged tdes = new AesManaged();
 tdes.Key = Encoding.UTF8.GetBytes("1234567891234567");
                    tdes.Mode = CipherMode.ECB;
                    tdes.Padding = PaddingMode.PKCS7;
                    ICryptoTransform crypt = tdes.CreateEncryptor();
                    byte[] plain = Encoding.UTF8.GetBytes(Text);
                    byte[] cipher = crypt.TransformFinalBlock(plain, 0,plain.Length);
                    encryptedText = Convert.ToBase64String(cipher);

2番目の部分で何が間違っていますか? ありがとう

4

2 に答える 2

1

コード例で考えられる 2 つの問題。現在、ASP コードをテストできないため、これは現時点での理論です。

  1. Java コードgetBytes()で 2 回呼び出し、文字セットの提供に失敗しました。これは、デフォルトのプラットフォーム文字セットを使用することを意味します。逆に、ASP コードでは UTF-8 を指定します。getBytes("UTF-8")Java コードをに変更して、強制的に一致させることを強くお勧めします。

  2. 同様に、次のコードを使用して base64 の結果を返します。

    return new String(Base64.encodeBase64(crypted));
    

    これは commons-codeだと思いますBase64か?その場合、encodeBase64メソッドは UTF-8 バイトを返しますが、バイトを文字列に解釈するときに、デフォルトのプラットフォーム文字セットに再び依存しています。これを次のように変更します。

    return new String(Base64.encodeBase64(crypted), "UTF-8");
    

    または便利な方法を使用します。

    return Base64.encodeBase64String(crypted);
    

プラットフォームのデフォルトのエンコーディングが UTF-8 でない場合、上記のエラーが原因で問題が発生している可能性があります。デフォルトのエンコーディングUTF-8 の場合、上記の変更により、コードの移植性が向上します (ただし、おそらく問題は解決されません)。

于 2013-07-04T07:00:41.783 に答える
0

以下のコードを使用して、コードとまったく同じ結果を得ることができますJAVA

Visual Basic コード:

Imports System.Security.Cryptography

Public Shared Function encrypt(data As String, key As String)
    Dim tdes As AesManaged = New AesManaged()
    tdes.Key = Encoding.UTF8.GetBytes(key)
    tdes.Mode = CipherMode.ECB
    tdes.Padding = PaddingMode.PKCS7
    Dim crypt As ICryptoTransform = tdes.CreateEncryptor()
    Dim plain As Byte() = Encoding.UTF8.GetBytes(data)
    Dim cipher As Byte() = crypt.TransformFinalBlock(plain, 0, plain.Length)
    Dim encryptedText As String = Convert.ToBase64String(cipher)
    Return encryptedText
End Function
于 2015-09-24T07:54:49.463 に答える