AES 128 CFB, Java / BouncyCastle против Ruby / OpenSSL - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь сопоставить шифрование 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.

Я сухой. Есть идеи?

1 Ответ

0 голосов
/ 11 сентября 2018

Итак, как указал Джеймс, размер блока на рубине был неправильным.Я должен использовать 8-битный размер блока для CFB, но вместо этого использовал 128-битный по умолчанию.

Это решило это:

cipher = OpenSSL::Cipher.new("AES-128-CFB8")
...