파이프를 16바이트 시퀀스로 분할하는 방법은 무엇입니까?

파이프를 16바이트 시퀀스로 분할하는 방법은 무엇입니까?

특정 파일을 자동으로 해독하는 bash 스크립트를 작성 중입니다. 그러나 파일은 단순히 전체를 인코딩하는 것이 아니라 16바이트 단위로 암호화됩니다.

이 작업을 수행하는 이유를 간략하게 설명하는 의사 코드는 다음과 같습니다.

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

데이터를 분할하려면 본질적으로 파이프를 열고 닫아야 하는데 bash에서 이를 수행하는 방법을 잘 모르겠습니다. 알아봤는데 split암호화된 파일이 몇 GB가 될 수도 있기 때문에 그렇게 많은 디스크 쓰기를 하고 싶지는 않습니다.

또한 여러 파이프를 통해 반복하지 않고 이 작업을 수행할 수 있는 방법이 있는지 궁금합니다.

답변1

나는 당신이 사용할 수 있다고 믿습니다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

답변2

최신 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 제외)를 사용하지 않으면 암호화가 안전하지 않을 수 있습니다.

답변3

스트림을 분할하고 버퍼링하는 또 다른 방법은 옵션 과 함께 사용 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

답변4

여러 파이프를 반복하지 않고 파이프를 16바이트 시퀀스로 분할하는 한 가지 방법은 다음과 같은 것을 사용하는 것입니다.스트림 미디어또는완충기(이미 언급한 방법 외에 split -b 16).

cstream예를 들어, dd. 읽기/쓰기를 위한 블록 크기를 설정하는 옵션 뿐만 아니라 -b num쓰기 전에 -B num입력 블록을 최대 바이트까지 버퍼링하는 옵션도 있습니다. num-n num옵션은 복사할 데이터의 총량을 num바이트로 제한합니다.

관련 정보