Я пытаюсь выполнить шифрование AES с использованием JAVA, я сделал несколько попыток, перепробовал много кодов и внес много изменений, чтобы наконец добраться до места, где мой зашифрованный текст совпадает с зашифрованным текстом, созданным с использованием кода C #, НО ЧАСТИЧНО.Последний блок из 32 бит отличается.У меня нет доступа к коду C #, так как это сторонняя служба.Кто-нибудь может подсказать, что мне не хватает?
Упомянутые условия должны использовать:
Использовать 256-битное шифрование AES в режиме CBC и с PKCS5заполнение для шифрования всей строки запроса с использованием вашего первичного ключа и вектора инициализации.(Не включайте дайджест сообщения в строку запроса.) Первичный ключ - это шестнадцатеричная строка из 64 цифр, а вектор инициализации - шестнадцатеричная строка из 32 цифр.
Используемые мной примеры значений:
Aes_IV = 50B666AADBAEDC14C3401E82CD6696D4
Aes_Key = D4612601EDAF9B0852FC0641DC2F273E030FFFFFFDFFDFFFFFFFFBFBFFFFFBBFBBFXBXXXXXXXXXXXXXXXXXXXXXXXXXXF IDF0606105BF
Plain_Text = ss = brock & pw = 123456 & ts = 20190304234431 ( input )
Encrypted_Text = 7643C7B400B9A6A2AD0FCFC40AC1B11E51A038A32C84E5560D92C0C49B3B7E0 A072AF44AADB62FA66F047EACA5C6A018 ( выход )
Мой выход = 7643C7B400B9A6A2AD0FCFC40AC1B11E51A038A32C84E5560D92C0C49B3B7E0 A38E71E5C846BAA6C31F996AB05AFD089
public static String encrypt( String keyMaterial, String unencryptedString, String ivString ) {
String encryptedString = "";
Cipher cipher;
try {
byte[] secretKey = hexStrToByteArray( keyMaterial );
SecretKey key = new SecretKeySpec( secretKey, "AES" );
cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" );
IvParameterSpec iv;
iv = new IvParameterSpec( hexStrToByteArray( ivString ) );
cipher.init( Cipher.ENCRYPT_MODE, key, iv );
byte[] plainText = unencryptedString.getBytes( "UTF-8") ;
byte[] encryptedText = cipher.doFinal( plainText );
encryptedString = URLEncoder.encode(byteArrayToHexString( encryptedText ),"UTF-8");
}
catch( InvalidKeyException | InvalidAlgorithmParameterException | UnsupportedEncodingException | IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException | NoSuchPaddingException e ) {
System.out.println( "Exception=" +e.toString() );
}
return encryptedString;
}
Я использовал это для преобразования.
public static byte[] hexStrToByteArray ( String input) {
if (input == null) return null;
if (input.length() == 0) return new byte[0];
if ((input.length() % 2) != 0)
input = input + "0";
byte[] result = new byte[input.length() / 2];
for (int i = 0; i < result.length; i++) {
String byteStr = input.substring(2*i, 2*i+2);
result[i] = (byte) Integer.parseInt("0" + byteStr, 16);
}
return result;
}
public static String byteArrayToHexString(byte[] ba) {
String build = "";
for (int i = 0; i < ba.length; i++) {
build += bytesToHexString(ba[i]);
}
return build;
}
public static String bytesToHexString ( byte bt) {
String hexStr ="0123456789ABCDEF";
char ch[] = new char[2];
int value = (int) bt;
ch[0] = hexStr.charAt((value >> 4) & 0x000F);
ch[1] = hexStr.charAt(value & 0x000F);
String str = new String(ch);
return str;
}
Есть предложения, что мне делать, чтобы соответствовать выводам?