Base64에서 변환하고 잘못된 문자를 반환하면 문자열 끝에 잘못된 문자가 나타나는 이유는 무엇입니까?

Base64에서 변환하고 잘못된 문자를 반환하면 문자열 끝에 잘못된 문자가 나타나는 이유는 무엇입니까?

주문하다:

echo "HelloWorld==" | base64 -d | base64

산출:

HelloWorlQ==

나는 왜 d지금 인가 Q?

편집하다:

임의의 데이터로 시작하여 Base64로 인코딩하고 싶지 않습니다. 내 목표는 Base64로 시작하여 Base64로 끝나고 이 시간 동안 바이너리 값만 생성하는 것입니다.

편집 2:

입력 문자열이 4자의 배수인 경우에는 이런 일이 발생하지 않는다는 것을 알았으므로 패딩과의 상호 작용이라고 생각합니다.

❯ echo 'abcdefghij==' | base64 -d | base64
abcdefghig==

❯ echo 'abcdefgh' | base64 -d | base64 
abcdefgh

편집 3

-i내 문제와 관련이 없는 것으로 밝혀진 혼란스러운 로고 언급을 제거했습니다 .

답변1

HelloWorld==디코딩할 수 없고 일반적으로 0패딩되어야 하기 때문에 기술적으로 유효한 Base64가 아닌 정보가 포함되어 있습니다. .을 사용하면 1그 안에 포함된 추가 s는 무시되고 손실됩니다 echo "HelloWorld==" | base64 -d.

설명하다...

Base64는 4자로 구성된 그룹에 작동합니다. 각 문자는 6비트를 나타내므로 4개의 각 그룹은 3바이트(각각 8비트)로 디코딩됩니다. 유일한 예외는 기호 수에 따라 달라지는 마지막 4자입니다 =. Base64 문자열은 항상 4로 나누어집니다.

  • 0은 3바이트로 디코딩됨
  • 1 = 2바이트로 디코딩
  • 2 == 1바이트로 디코딩

귀하의 예에서는 Hell및 둘 다 oWor유효합니다. 그러나 ld==그것은 진실이 아니다. 이유를 이해하려면 다음 조회 테이블을 참조하세요. https://en.wikipedia.org/wiki/Base64

ld===끝에 2바이트가 있으므로 1바이트로만 디코딩해야 합니다 . 그러나 ld다음과 같이 디코딩됩니다 100101 011101. 한 바이트에는 8개의 8비트만 있습니다. 따라서 문자열 디코딩을 사용하면 base64 -d바이트 100101 01로만 변환되고 끝은 1101완전히 무시됩니다.

로 끝나는 모든 Base 64 문자열은 ==마지막 문자의 처음 두 문자만 사용해야 합니다. 유일한 유효한 결말 ==Q== A== w== g==

답변2

예, 이것은 패딩과의 상호작용입니다.

실제 인코딩된 데이터를 디코딩하고 (ASCII 문자열이 아니므로) 바이너리로 변환하여 살펴보겠습니다.

$ base64 -d <<<'HelloWorld==' | xxd -b
00000000: 00011101 11101001 01100101 10100001 01101010 00101011  ..e.j+
00000006: 10010101                                               .

HelloWorld==Base64로 인코딩된 데이터입니다.필립 쿨린마지막 부분을 디코딩하는 복잡도를 설명하고, 데이터를 디코딩할 때 ld==인코딩된 데이터의 1/3만 실제로 사용되는 정도까지 설명합니다. 아래에서는 데이터를 기록할 때 소스를 d표시하겠습니다 .Q

이 바이너리를 반복해 보겠습니다.

00011101 11101001 01100101 10100001 01101010 00101011 10010101

6비트 그룹(Base64 인코더가 사용하는 것):

000111 011110 100101 100101 101000 010110 101000 101011 100101 01

마지막으로 4개의 0비트를 채워 10개의 완전한 6자리 코드를 형성합니다.

000111 011110 100101 100101 101000 010110 101000 101011 100101 010000

이는 데이터를 기록할 때 표시되는 내용 010000입니다 (참조:QBase64 코드 테이블).

답변3

파이프가 깔끔하지 않습니다. 먼저 인코딩한 다음 디코딩해야 합니다.

$ echo "Hello World!==" | base64 | base64 -id
Hello World!==

잘못된 Base64 인코딩 형식을 디코딩하고 있습니다.

관련 정보