OpenSSL은 개행 문자가 포함되지 않은 Base64 데이터를 디코딩할 수 있습니까?

OpenSSL은 개행 문자가 포함되지 않은 Base64 데이터를 디코딩할 수 있습니까?

내 bash 변수에는 두 개의 Base64 데이터가 있습니다. Base64 데이터에서 흔히 사용되는 줄 바꿈은 공백으로 대체되었으며 변수는 기본적으로 매우 긴 한 줄 문자열입니다.

변수에 포함된 두 개의 Base64 데이터 덩어리를 디코딩할 수 있지만 이 작업을 수행하려고 하면 약간의 차이가 있습니다. 제가 이것을 올바르게 처리하고 있는지, 아니면 개행 문자가 포함되지 않은 Base64 데이터를 디코딩하는 더 좋은 방법이 있는지 알고 싶습니다. 이것이 내가 가진 것입니다:

첫 번째 청크는 350자이며 다음과 같이 성공적으로 디코딩할 수 있습니다.

echo ${DATA::350} | openssl base64 -d | wc -c
256

두 번째 블록에는 5745자가 있지만 위 명령은 예상한 결과를 생성하지 않습니다. 즉:

$ echo {DATA:350} | openssl base64 -d | wc -c
432

그러나 개행 문자를 다시 넣으면 작동합니다.

$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240

줄 길이 문제가 있을 것으로 예상됩니다. 첫 번째 청크는 피할 수 있을 만큼 작으며, 이는 사용된 Base64 디코더의 기능인 것 같습니다(두 가지 일반적인 기능 base64openssl base64다른 동작).

base64대신 디코더는 openssl base64첫 번째 유효하지 않은 문자(공백)에서 중지하므로 첫 번째 "라인"(48바이트 출력 데이터)만 디코딩되는 반면 OpenSSL은 432자(9 "라인")를 출력합니다. 명령 base64에 무시 옵션이 있습니다쓰레기이므로 다음과 같이 작동합니다.

$ echo ${DATA:350} | base64 -d -i | wc -c
4240

OpenSSL 디코더에는 그러한 옵션이 없는 것 같습니다.

또한 공백 제거는 완벽하게 작동 base64하지만 다음에서는 작동하지 않습니다 openssl base64.

$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400

$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240

그래서 결국에는 디코딩된 데이터를 추가로 처리해야 했기 때문에 개행 문자를 교체하고 OpenSSL 디코더를 사용했습니다.

$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...

하지만 난 이해하고 싶어OpenSSL은 개행 문자가 포함되지 않은 base64 데이터를 디코딩할 수 있습니까?

답변1

그렇지 않으면필요Space는 openssl다음 옵션을 사용하여 이를 처리합니다 -A.

그래서:

$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)                
$ echo "$x" | wc
      1       1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp 
$ 

base64 데이터가 모두 한 줄에 있고 디코딩될 수 있음을 알 수 있습니다.

man enc-A옵션을 설명하세요.

공백을 유지해야 하는 경우 공백을 제거해야 합니다( 로 변환하거나 '\n'제거 및 사용 -A).

관련 정보