특정 파일을 자동으로 해독하는 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