Я написал сценарий. Прошу прощения за то, что я не эксперт в написании сценариев. После расшифровки результаты были усечены.
[Message in text]: 0123456789abcdefghijklmnopqrstuvwxyz
message_input in hex: 303132333435363738396162636465666768696a6b6c6d6e6f707172737475767778797a0a
key: 788a1ca0bf1ab80f092841aabd77793f
hex string is too short, padding with zero bytes to length
c19f83afc1160ce81b0fc9906d513693386ccdd313b0f2884c698411441054e8
ciphered text: c19f83afc1160ce81b0fc9906d513693386ccdd313b0f2884c698411441054e8
IV: 7ecd3d63a8b74bb2f80d71a1c9d43359
deciphering ...
hex string is too short, padding with zero bytes to length
key: 788a1ca0bf1ab80f092841aabd77793f
iv: 7ecd3d63a8b74bb2f80d71a1c9d43359
answer: 30313233343536373839616263646566
Deciphered Message in hex: 30313233343536373839616263646566
deciphered text: 0123456789abcdef
Восстановленные deciphered text: 0123456789abcdef
, ghijklmnopqrstuvwxyz
усекаются. Предполагается, что это AES-CBC. Есть вариант, который я не включил?
Вот расшифровка:
IV=$(openssl rand -hex 16)
get_key_for_ciphering; # key_for_ciphering gets populated
message_input=$(echo -n "${message_input//[[:space:]]/}") # remove spaces
echo "message_input in hex: "$message_input
echo "key": $key_for_ciphering;
ANS=$(echo "0: $message_input" | xxd -r | openssl enc -aes-256-cbc -iv $IV -K "$key_for_ciphering" | xxd -p)
ANS=$(echo -n "${ANS//[[:space:]]/}") # remove spaces
Вот расшифровка (message_input=$ANS):
get_key_for_ciphering; # key_for_ciphering gets populated
ANS=$(echo "0: $message_input" | xxd -r | openssl enc -aes-256-cbc -d -nopad -nosalt -K "$key_for_ciphering" -iv $IV | xxd -p) # -nopad -nosalt
У вас есть echo "message_input in hex: "$message_input
, но вы можете просто сделать echo "message_input in hex: $message_input"
. То же самое с echo "key: $key_for_ciphering"
. И тройные точки с запятой избыточны.
@Roadowl, как решить проблему усечения?
Утром еще раз посмотрю. Моя голова не ясна, мне нужно лечь в мешок. Кстати, тем временем попробуйте более простой сценарий, в котором вы оставляете пробелы нетронутыми. То есть тот, в котором все ссылки на переменные аккуратно заключены в двойные кавычки, например: echo "key: $key_for_ciphering"
. Также оставьте часть «0:» (почему она у вас есть?).
О, и используйте printf
вместо echo
(сделайте help printf
, а также man printf
, хотя последнее предназначено для двоичного файла /usr/bin/printf, а первое — вашей оболочки printf, хотя во всех смыслах и целях они, вероятно, работают одинаково).
Я распечатываю, чтобы наблюдать. Для «0:» без него он не работает для openssl из-за проблемы с форматом.
Никогда не слышал об этом. Я посмотрю на это завтра.
Также в новом тестовом сценарии исключите все элементы xxd.
---- Редактировать: ----
Не работает, так как параметры оболочки не могут содержать двоичный ноль. Возможное исправление с помощью фильтров:
#!/bin/bash
tohex () {
perl -e 'binmode STDIN; while (<STDIN>) { print unpack "H*",$_; }'
}
fromhex () {
perl -e 'binmode STDIN; while (<STDIN>) { print pack "H*",$_; }'
}
binInput='0123456789abcdefghijklmnopqrstuvwxyz'
hexIV = "$(openssl rand -hex 16)"
hexKey='788a1ca0bf1ab80f092841aabd77793f'
hexCipher = "$(printf '%s' "$binInput" |\
openssl enc -aes-256-cbc -nosalt -iv "$hexIV" -K "$hexKey" | tohex)"
binResult = "$(printf '%s' "$hexCipher" | fromhex |\
openssl enc -aes-256-cbc -d -iv "$hexIV" -K "$hexKey")"
if [ "$binInput" = "$binResult" ]; then echo OK;
fi
---- Оригинал: ----
Я думаю, что ваша проблема заключается в шестнадцатеричном преобразовании. Попробуйте использовать perl pack/unpack:
tohex () {
perl -e 'print unpack "H*", "$ARGV[0]"' "$1"
}
fromhex () {
perl -e 'print pack "H*", "$ARGV[0]"' "$1"
}
message='0123456789abcdefghijklmnopqrstuvwxzy §"+!%/=()'
message_hex=$(tohex "$message")
message_cmp=$(fromhex "$message_hex")
if [ "$message" = "$message_cmp" ]; then echo OK; fi
Можете ли вы продемонстрировать с помощью: ANS=$(echo "0: $message_input" | xxd -r | openssl enc -aes-256-cbc -nosalt -iv $IV -K "$key_for_ciphering" | xxd -p)
и ANS=$(echo "0: $message_input" | xxd -r | openssl enc -aes-256-cbc -d -nopad -nosalt -K "$key_for_ciphering" -iv $IV | xxd -p)
Я использовал ваши образцы кода в некоторых местах, но он по-прежнему дает те же ответы или в некоторых местах неправильно меняет формат.
Ориентируясь на ваш вопрос, проблема в команде xxd
. При преобразовании шестнадцатеричной строки в двоичную с помощью xxd -r
вы должны использовать -p
, чтобы сообщить xxd
, что это простая шестнадцатеричная строка (без разрывов строк).
При обратном преобразовании в шестнадцатеричный формат с помощью xxd -p
разрывы строк добавляются каждые 32 байта. К сожалению, xxd
не предоставляет флаг, чтобы не включать разрывы строк (вы можете использовать -c
, чтобы установить количество столбцов, но оно ограничено максимальным количеством). Есть много вариантов удаления разрывов строк, но один из них — добавление | tr -d '\n'
к вашей команде, как показано в примере ниже.
IV=$(openssl rand -hex 16)
key_for_ciphering=$(openssl rand -hex 16)
message_input = "303132333435363738396162636465666768696a6b6c6d6e6f707172737475767778797a0a"
message_input=$(echo -n "${message_input//[[:space:]]/}") # remove spaces
echo "Message: $message_input"
echo "Key: $key_for_ciphering"
echo "IV: $IV"
ANS=$(echo "0: $message_input" | xxd -r -p | openssl enc -aes-256-cbc -iv $IV -K "$key_for_ciphering" | xxd -p | tr -d '\n')
ANS=$(echo -n "${ANS//[[:space:]]/}") # remove spaces
echo "Encrypted: $ANS"
ANS=$(echo "0: $ANS" | xxd -r -p | openssl enc -aes-256-cbc -d -nopad -nosalt -K "$key_for_ciphering" -iv $IV | xxd -p | tr -d '\n')
echo "Decrypted: $ANS"
идеально ! Меня часто путают с форматированием данных. Это идеальная помощь! Спасибо за руководство, @Lucas.
У вас есть
message_input=$(echo -n "${message_input//[[:space:]]/}")
, но это более громоздко, чем нужно; вы можете просто сделатьmessage_input = "${message_input//[[:space:]]/}"
.