Если вы 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 {16 - ([string length $data] % 16)}]
append data [string repeat [format %c $pad] $pad]
aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex $data