2013-08-08 2 views
4

Я использую некоторые функции шифрования в 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 что один читает ...

+0

Не могли бы вы вывести выходные данные для вашего кода Java и вашего кода на C#? – initramfs

+0

Добавлен вывод и ожидаемое значение vs фактическое при расшифровке – nicobatu

+0

AES в режиме CBC без заполнения только работает, когда размер ввода кратен размеру блока (16 байт, 128 бит). Можете ли вы проверить правильность размера данных? Поведение шифров может быть неожиданным, если предлагаются нестандартные входные данные. Кроме того, попробуйте найти нулевой IV для устранения неполадок. – initramfs

ответ

0

Я чувствую себя дураком ... мой IV содержал нуль в одном и капитал O в другом !! Ну, по крайней мере, я знаю, что этот код эквивалентен.

+0

LOL! По крайней мере, вы нашли свою проблему. К тому времени, когда вы сказали, что ключи были в порядке, я подозревал, что проблема с реализацией AES IV или C# была нарушена. – initramfs

Смежные вопросы