У меня очень любопытная проблема при расшифровке строк с использованием алгоритма AES. Приложение C# отправляет зашифрованные данные (строки) в приложение Java. Даже я использую ту же строку ключа, дешифрования приводит в Exception:Любопытное поведение с помощью C# для шифрования/дешифрования Java с использованием AES
javax.crypto.BadPaddingException: Учитывая последний блок не правильно проложенный на com.sun.crypto.provider.CipherCore.doFinal (CipherCore.java:810)
Однако, только если длина открытого текста ввода для шифрования (на стороне C#) превышает 1393 символа ... Но если длина равна 1393 символам или составляет менее 1393 символов, она работает нормально.
Вот C# codefor шифрования:
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");
}
Я попытался заменить BASE64Decoder на Base64 кодек от апача, но результат был тот же ... Буду благодарен за любые советы или идеи. Благодарю.
Получает ли Java-код зашифрованную строку через веб-запрос? Если это так, убедитесь, что вы выполняете декодирование html, если оно закодировано между сообщением. –
В .net вы указали PaddingMode.PKCS7 для заполнения, а в вашем Java-коде вы указали PKCS5Padding. Неужели? –
Прокладка PKCS5 и дополнение PKCS7 эквивалентны в этом контексте. –