Я пытаюсь сопоставить шифрование AES из Java-реализации BouncyCastle с Ruby. Почему-то, даже с одним и тем же ключом, IV и полезной нагрузкой, я не могу получить одинаковые результаты на обоих языках.
В этом примере я использую ruby для генерации ключа и IV, а затем повторно использую этот ключ и IV в коде Java.
Может кто-нибудь определить, что не так?
Вот код рубина:
require 'openssl'
cipher = OpenSSL::Cipher::AES.new(128, "CFB")
cipher.encrypt
payload = "\x01\x02\x03\x04".b
puts "key"
puts cipher.random_key.unpack("H*")
puts "iv"
puts cipher.random_iv.unpack("H*")
puts (cipher.update(payload) + cipher.final).unpack("H*")
И его вывод:
key
19900205760f9b9696b34cacdbf0189d
iv
b549f3bb806c4bce9c949f61185f2c38
303dc6e6
И (не так) соответствующий код Java
byte[] key = hexStringToByteArray("19900205760f9b9696b34cacdbf0189d");
byte[] iv = hexStringToByteArray("b549f3bb806c4bce9c949f61185f2c38");
byte[] payload = new byte[] { 1, 2, 3, 4};
AESEngine aesEngine = new AESEngine();
CFBBlockCipher cipher = new CFBBlockCipher(aesEngine, 8);
ParametersWithIV params = new ParametersWithIV(new KeyParameter(key), iv);
BufferedBlockCipher bbc = new BufferedBlockCipher(cipher);
bbc.init(true, params);
byte[] output = new byte[payload.length];
int result = bbc.processBytes(payload, 0, payload.length, output, 0);
bbc.doFinal(output, result);
System.out.println("With BC: " + bytesToHex(output));
Результат Java
305F1C09
Для любой полезной нагрузки первый байт всегда идентичен обеим реализациям, но затем остальные изменяются. Может ли быть так, что цикл обратной связи шифра не работает так же?
Редактировать: Как указал Джеймс в комментариях, это проблема размера блока. В приведенном выше коде ruby, похоже, использует по умолчанию размер блока 128 бит, тогда как в коде java используется блок 8 бит. В моем случае я должен сопоставить код ruby с java, поэтому теперь мне нужно найти способ использовать 8-битный размер блока с ruby.
Я сухой. Есть идеи?