4

AESアルゴリズムを使用した文字列の復号化により、非常に興味深い問題が発生しました。私の C# アプリケーションは、暗号化されたデータ (文字列) を Java アプリケーションに送信します。同じキー文字列を使用しても、復号化により例外が発生します。

javax.crypto.BadPaddingException: com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:810) で適切にパディングされていない最終ブロックが指定されました

ただし、(C# 側で) 暗号化するプレーン入力テキストの長さが 1393 文字を超える場合のみ...ただし、長さが 1393 文字に等しい場合、または 1393 文字未満の場合は、正常に動作します。

暗号化の C# コードは次のとおりです。

    private static string Encrypt(string textToEncrypt, string key)
    {
        try
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7;

            rijndaelCipher.KeySize = 0x80; // 256bit key
            rijndaelCipher.BlockSize = 0x80;
            byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
            byte[] keyBytes = new byte[0x10];
            int len = pwdBytes.Length;
            if (len > keyBytes.Length)
            {
                len = keyBytes.Length;
            }
            Array.Copy(pwdBytes, keyBytes, len);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
            byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
            return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

そして、復号化のための Java コード:

public static String Decrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes = new byte[16];
    byte[] b = key.getBytes("UTF-8");
    int len = b.length;
    if (len > keyBytes.length) {
        len = keyBytes.length;
    }
    System.arraycopy(b, 0, keyBytes, 0, len);

    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

    BASE64Decoder decoder = new BASE64Decoder();
    byte[] results = cipher.doFinal(decoder.decodeBuffer(text));
    return new String(results, "UTF-8");
}

Apache の BASE64Decoder を Base64 コーデックに置き換えてみましたが、結果は同じでした...アドバイスやアイデアをいただければ幸いです。ありがとう。

4

1 に答える 1