В коде Java вы не используете IV.
Я недостаточно разбираюсь в C #, чтобы помочь вам напрямую, но могу дать некоторую информацию.
Rijndael, он же "AES", шифрует блоки по 16 байт. Чтобы зашифровать длинное сообщение (например, ваше тестовое сообщение при кодировании имеет длину 20 байт), Rijndael должен быть вызван несколько раз, с некоторым способом объединить вызовы вместе (также, есть некоторая «заполненность», чтобы убедиться, что длина кратна 16). Режим CBC выполняет такую цепочку.
В CBC каждый блок данных объединяется (поразрядно XOR) с предыдущим зашифрованным блоком до того, как сам будет зашифрован. Поскольку первый блок данных не имеет предыдущего блока, мы добавляем новый условный «нулевой блок», называемый IV. IV должен быть выбран как 16 случайных байтов. Расшифровывающей стороне понадобится IV. IV не должен быть секретным (в этом разница между IV и ключом), поэтому он часто передается вместе с сообщением.
В вашем Java-коде вы не указываете IV, вы просто создаете переменную с именем iv
и не используете ее. Так что реализация Rijndael сама по себе для этого. Скорее всего, это породило случайный IV. Точно так же вы не даете IV для реализации Rijndael в коде C #. Так что вполне вероятно, что снова был выбран случайный IV. Но не такой, как в коде Java, отсюда и отличные результаты.
(Примечание: ваша 20-байтовая строка ввода дополняется до 32 байтов. Вы даете два «результата» в шестнадцатеричном формате длиной 32 байта каждый. Это согласованно, но означает, что эти результаты не включают IV - иначе они будет длиной 48 байт.)