Почему разные реализации AES дают разные результаты?

Я чувствую, что довольно хорошо понимаю хэш-функции и контракты, которые они влекут за собой.

SHA1 на входе X ВСЕГДА выдает одинаковый выход. Вы можете использовать библиотеку Python, библиотеку Java или ручку и бумагу. Это функция, она детерминированная. Мой SHA1 делает то же самое, что и у вас, у Алисы и Боба.

Насколько я понимаю, AES - это тоже функция. Вы вводите некоторые значения, это выплевывает зашифрованный текст.

Почему же тогда могут быть опасения, что Трюкрипт (например) «сломан»? Они не говорят, что AES сломан, они говорят, что программа, которая реализует это, может быть. AES, в теории, твердый. Так почему же вы не можете просто запустить файл через Truecrypt, запустить его через функцию «эталонной AES» и убедиться, что результаты совпадают? Я знаю, что это абсолютно не работает, но я не знаю почему.

Чем AES отличается от SHA1 таким образом? Почему Truecrypt AES мог выплевывать файл, отличный от Schneier-Ifier * AES, когда им обоим давались одинаковые данные?

В конце концов, мой вопрос сводится к:

My_SHA1 (X) == Bobs_SHA1 (X) == ... и т. Д.

Но TrueCrypt_AES (X)! = HyperCrypt_AES (X)! = VeraCrypt_AES (X) и т. Д. Почему это так? У всех этих программ есть AES, но есть разные способы определения таких вещей, как вектор инициализации или что-то еще?

* это будет название моей программы шифрования файлов, если я когда-либо написал

Ответы на вопрос(2)

Ваш ответ на вопрос