Как я могу разбить канал на 16 байтовых последовательностей?

Я пишу скрипт bash для автоматизации дешифрования определенного файла; однако файл шифруется в 16 байтовых блоках, а не просто кодируется целиком.

Вот какой-то код psuedo, чтобы кратко объяснить, почему я пытаюсь это сделать:

cat encrypted.bin | \ buffer and output 16 bytes when asked | \ openssl --args >> decrypted.bin 

Мне по существу нужно, чтобы труба открывалась и закрывалась, чтобы разделить данные, и я не уверен, как это можно сделать в bash. Я посмотрел на split , но поскольку зашифрованный файл может быть несколько ГБ, я не хочу выполнять много записей на диске.

Я должен также указать, что я хотел бы знать, есть ли способ сделать это, не зацикливаясь на нескольких трубах.

  • Как работает pv?
  • Перенаправление и вывод труб
  • Как сообщить «последней» команде прочитать STDIN?
  • Содержимое конвейера с несколькими пробелами
  • подключить файл к сценарию медленного процесса
  • Почему команда shuf file> file оставляет пустой файл, но аналогичных команд нет?
  • В чем смысл опций cut -d и -f
  • Цепочка команд терминала Linux
  • 5 Solutions collect form web for “Как я могу разбить канал на 16 байтовых последовательностей?”

    При использовании новейшего Linux (или любой системы с последними GNU coreutils) вызовите split --filter .

     <decrypted.bin split -b 16 --filter='openssl --args "$FILE" >> decrypted.bin' 

    Независимо зашифрованные блоки звучат как ECB, так что openssl enc -d aes-128-ecb может быть тем, что вам нужно.

    Если у вас странный режим, который инструмент командной строки openssl не поддерживает, вам может быть лучше использовать инструмент, поддерживающий этот странный режим. (Если вы описываете режим, я могу предложить предложения.)

    Вы, надеюсь, знаете это уже, но если вы не используете стандартный режим (кроме ECB), ваше шифрование, вероятно, небезопасно.

    Я считаю, что вы можете использовать вместо dd

    dd позволяет вам читать из файла и отправлять вывод туда, где вы хотите указать также размер блока.

    с страницы руководства

    ОПИСАНИЕ Копирование файла, преобразование и форматирование в соответствии с операндами.

      bs=BYTES read and write up to BYTES bytes at a time 

    Поэтому я предполагаю, что

     dd if=encrypted.bin bs=16|openssl --args >> decrypetd.bin 

    должен работать на вас. Хотя я не тестировал его с помощью openssl.

    Обновление на основе комментария от jordamn (спасибо jordamn)

    Встроенный способ не перекачивает все в стрит в openssl, а вместо него – 16 блоков.

     #Get the file size in bytes total=`ls -l encrypted.bin|awk '{print $5}'` echo $total; ret=0; i=0; counter=0; while [ $counter -lt $total ] do #counter to know how many block we read counter=$(($i * 16)) #skip is the number of block based on our setting to skip dd if=encrypted.bin skip=$i ibs=16 bs=16 count=1 status=none |openssl --args >> decrypit.bin i=$(($i+1)) done 

    Другим способом разделения и буферизации потока может быть использование xxd - make a hexdump or do the reverse с его параметрами -c и -p .

     # test n=0 printf '%s' {1..1000} | xxd -p -c 16 | while IFS="" read -r hexstr; do n=$((n+1)) printf '%s\n' "$n: $hexstr size: $((${#hexstr}/2)) bytes" printf '%s' "$hexstr" | xxd -p -r | wc -c done # split up standard output stream in 16 byte blocks to be decrypted xxd -p -c 16 encrypted.bin | while IFS="" read -r hexstr; do printf '%s' "$hexstr" | xxd -p -r | openssl --args >> decrypted.bin done 

    Способ разделения трубы на 16 байтовых последовательностей без циклирования через несколько каналов может заключаться в использовании таких инструментов, как cstream или mbuffer (в дополнение к уже упомянутому подходу split -b 16 ).

    cstream , например, подобен dd . Он не только имеет параметр -b num чтобы установить размер блока, используемый для чтения / записи, но также и параметр -B num для буферизации входного блока до num байтов перед записью. Параметр -n num ограничивает общий объем данных, подлежащих копированию, на num байты.

     awk '$0=RT' RS=.{16} encrypted.bin | while read jb do openssl enc -d -base64 <<< $jb >> decrypted.bin done 
    Linux и Unix - лучшая ОС в мире.