Если вы скажете openssl enc
использовать фразу-пароль, она всегда передается через KDF, никогда не используется непосредственно в качестве ключа; использование -nosalt
не отключает это. (Вы можете использовать openssl enc -p
опцию, чтобы увидеть, какой ключ и IV фактически используются.) Чтобы указать необработанный ключ, вам нужна -K
опция.
(Обратите внимание, что openssl enc -K
значение, как ожидается, будет в шестнадцатеричном, в то же время aes::aes -key
интерпретируется как необработанные двоичные данные.)
Другая проблема - отступы. Поскольку AES является блочным шифром, все входные данные должны быть дополнены до 16 байтов (размер блока AES), и существует несколько методов заполнения с различными свойствами безопасности. Модуль Tcl aes
использует простое заполнение нулями, расширяя данные на 0x00 байт.
Между тем OpenSSL использует заполнение PKCS # 7 и заполняет блок значением, соответствующим размеру пэда. Например, если ваш ввод составляет всего 2 байта, ему нужно заполнить 14 байтов, поэтому в соответствии с PKCS # 7 каждый байт пэда также будет иметь значение 14 (0x0E).
( man enc
говорит о PKCS # 5, который является более старым документом, определяющим схему заполнения только для 8-байтовых блоков. PKCS # 7 позже определил точно такую же схему для любого размера блока .)
Для режима CBC вам также необходимо указать IV (16 байтов, равный размеру блока AES). Модуль Tcl по умолчанию использует IV со всеми нулями. Хотя CBC использует IV только для 2-го и последующих блоков, это не влияет на вывод короткого текста.
Итак, в заключение, они дадут вам идентичные результаты (используя заполнение нулями):
aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex "hi" printf 'hi\0\0\0\0\0\0\0\0\0\0\0\0\0\0' \ | openssl enc -aes-128-cbc -nopad \ -K 31323334353637383931303132333435 \ -iv 00000000000000000000000000000000 \ | hexdump -C
Это также (используя заполнение PKCS # 7):
aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex \ "hi\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e" printf 'hi' \ | openssl enc -aes-128-cbc \ -K 31323334353637383931303132333435 \ -iv 00000000000000000000000000000000 \ | hexdump -C
Для реализации заполнения:
set data "hi" set pad [expr ] append data [string repeat [format %c $pad] $pad] aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex $data