Я использую некоторые функции шифрования в C# и Java, выход которых не соответствует. Я кормлюсь одним и тем же ключом и строкой IV в качестве теста.AES/CBC/NoPadding между C# и Java
Входная строка: "& APP_VERSION = 1.0.0.0"
Java:
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));
// Then I convert encrypted to hex by building a string of encrypted[i] & 0xFF
Выход:
60f73a575b647263d75011bb974a90e85201b8dfeec6ec8ffba04c75ab5649b3
C#:
SymmetricKeyAlgorithmProvider alg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbc);
BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
// Create key and IV buffers
IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(key, encoding);
CryptographicKey cKey = alg.CreateSymmetricKey(keyBuffer);
IBuffer ivBuffer = CryptographicBuffer.ConvertStringToBinary(iv, encoding);
// Create input text buffer
IBuffer inputBuffer = CryptographicBuffer.ConvertStringToBinary(input, encoding);
// Do the encryption
IBuffer encryptedBuffer = CryptographicEngine.Encrypt(cKey, inputBuffer, ivBuffer);
// Convert encrypted back to hex
string encryptedStr = CryptographicBuffer.EncodeToHexString(encryptedBuffer);
Выход:
4b6fd83c35565fc30a9ce56134c277cbea74d14886cf99e11f4951075d4f4505
Я использую Java Decrypter, чтобы проверить и расшифровывает Java-зашифрованную строку правильно, но строка C# читается как «& APP_VERSION = 1Q0.0.0», так что, кажется, близко, но немного прочь.
Я проверил, что байты ключа, ввода и соответствия IV соответствуют шагу шифрования. Существуют ли какие-либо другие различия, которые могут вызвать несоответствие?
EDIT При всем нул ключ «00000000000000000000000000000000» и IV «0000000000000000» я получил тот же результат, как для Java и C#:
081821ab6599650b4a31e29994cb130203e0d396a1d375c7d1c05af73b44a86f
Так что, возможно, есть что-то не так с ключом или IV что один читает ...
Не могли бы вы вывести выходные данные для вашего кода Java и вашего кода на C#? – initramfs
Добавлен вывод и ожидаемое значение vs фактическое при расшифровке – nicobatu
AES в режиме CBC без заполнения только работает, когда размер ввода кратен размеру блока (16 байт, 128 бит). Можете ли вы проверить правильность размера данных? Поведение шифров может быть неожиданным, если предлагаются нестандартные входные данные. Кроме того, попробуйте найти нулевой IV для устранения неполадок. – initramfs