Шифрование/дешифрование AES (aes-cbc-256) с усечением ожидаемого вывода openssl

Я написал сценарий. Прошу прощения за то, что я не эксперт в написании сценариев. После расшифровки результаты были усечены.

[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 

У вас есть message_input=$(echo -n "${message_input//[[:space:]]/}"), но это более громоздко, чем нужно; вы можете просто сделать message_input = "${message_input//[[:space:]]/}".

user2849202 30.06.2019 02:42

У вас есть echo "message_input in hex: "$message_input, но вы можете просто сделать echo "message_input in hex: $message_input". То же самое с echo "key: $key_for_ciphering". И тройные точки с запятой избыточны.

user2849202 30.06.2019 02:44

@Roadowl, как решить проблему усечения?

Ursa Major 30.06.2019 02:47

Утром еще раз посмотрю. Моя голова не ясна, мне нужно лечь в мешок. Кстати, тем временем попробуйте более простой сценарий, в котором вы оставляете пробелы нетронутыми. То есть тот, в котором все ссылки на переменные аккуратно заключены в двойные кавычки, например: echo "key: $key_for_ciphering". Также оставьте часть «0:» (почему она у вас есть?).

user2849202 30.06.2019 02:52

О, и используйте printf вместо echo (сделайте help printf, а также man printf, хотя последнее предназначено для двоичного файла /usr/bin/printf, а первое — вашей оболочки printf, хотя во всех смыслах и целях они, вероятно, работают одинаково).

user2849202 30.06.2019 02:58

Я распечатываю, чтобы наблюдать. Для «0:» без него он не работает для openssl из-за проблемы с форматом.

Ursa Major 30.06.2019 02:58

Никогда не слышал об этом. Я посмотрю на это завтра.

user2849202 30.06.2019 02:59

Также в новом тестовом сценарии исключите все элементы xxd.

user2849202 30.06.2019 03:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
3 152
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

---- Редактировать: ----

Не работает, так как параметры оболочки не могут содержать двоичный ноль. Возможное исправление с помощью фильтров:

#!/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) Я использовал ваши образцы кода в некоторых местах, но он по-прежнему дает те же ответы или в некоторых местах неправильно меняет формат.

Ursa Major 30.06.2019 20:26
Ответ принят как подходящий

Ориентируясь на ваш вопрос, проблема в команде 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.

Ursa Major 30.06.2019 21:50

Другие вопросы по теме