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

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

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

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

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

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

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 
  • ограничение eval с помощью команд с каналами
  • Как работает pv?
  • Проверьте, пуст ли пуст и запустите команду над данными, если это не
  • Создайте временный файл из перенаправления или вывода stdout
  • Как я могу выйти из системы меньше, не покидая исходный процесс?
  • Ошибка при замене даты в файле с помощью команды tr
  • Git совершает использование stdout из bash?
  • pipe stdout-to-file с wc
  • перенаправление на проблемы с файлом nohup и pipe
  • Могу ли я подключать stdout на одном сервере к stdin на другом сервере?
  • Вывод трубного процесса, который уже запущен
  • bash scripting - читать архив из stdin
  • Interesting Posts

    При запуске sudo make параметры среды установки не передаются

    Как я могу перейти вверх или вниз в tmux с помощью Terminal.app?

    эхо-строки файла – но не более N символов в строке

    Где я могу найти конфигурацию ядра в каждом дистрибутиве Linux?

    Как grep, включая одиночную кавычку в файле

    Как объединить два файла с различным количеством строк в оболочке?

    Остановить все индексы, если тест не прошел

    Не удается увидеть мою SD-карту

    Как узнать, что URL-адрес наблюдается непосредственно на сервере

    Инициализация полностью подключенной сети ssh

    Управление (добавление / удаление и т. Д.) Пользователей в squashfs (файловая система RO) с небольшим R / W-разделом

    Насыщенное синее изображение в потоке MJPG с малиной Pi и веб-камерой

    Получить идентификатор сеанса X

    установить opencv-2.4-9 на centos 6.5 с поддержкой cuda 5.5

    Как удалить дубликаты в моем .bash_history, сохраняя заказ?

    Linux и Unix - лучшая ОС в мире.