"gpg2"가 동일한 입력에 대해 항상 동일한 출력을 생성하도록 하려면 어떻게 해야 합니까?

"gpg2"가 동일한 입력에 대해 항상 동일한 출력을 생성하도록 하려면 어떻게 해야 합니까?

동일한 문자열을 gpg2여러 번 암호화하면 암호화 키가 동일하더라도 결과가 달라집니다.

$ echo "secret message" | gpg2 --batch --passphrase-file /tmp/key --output - --symmetric > /tmp/r
$ xxd r
00000000: 8c0d 0409 0302 49c1 3718 910a c1ca f3d2  ......I.7.......
00000010: 4401 85a4 6885 26ef 7d4f c403 984d 6c03  D...h.&.}O...Ml.
00000020: 8c68 9ba9 4ea6 b214 2e9c 474a 0666 be52  .h..N.....GJ.f.R
00000030: 5d79 53cd d24b 387f 56e1 3a22 4401 a407  ]yS..K8.V.:"D...
00000040: 881b c641 8b10 b1e7 6662 aaee 3382 7151  ...A....fb..3.qQ
00000050: 565b 172e 74                             V[..t
$ echo "secret message" | gpg2 --batch --passphrase-file /tmp/key --output - --symmetric > /tmp/r
$ xxd r
00000000: 8c0d 0409 0302 dde5 397c 8bfa 4c29 f3d2  ........9|..L)..
00000010: 4401 ca3d bba8 8259 b9e9 7a18 4031 9e86  D..=...Y..z.@1..
00000020: 4861 ddca 8bf3 dbff f4c7 c40e be3f 4092  Ha...........?@.
00000030: 5dec 4dab ef31 3712 1fa3 76e1 4381 ed6f  ].M..17...v.C..o
00000040: bb0d ca49 be0d 4256 9049 2468 07da 3ba7  ...I..BV.I$h..;.
00000050: c338 74e8 d4                             .8t..

gpg2이런 일이 일어나는 이유는 달릴 때마다두 개의 랜덤 블록을 사용합니다.스트림의 시작 부분에.

gpg2동일한 입력에 대해 항상 동일한 출력이 생성되도록 하려면 어떻게 해야 합니까 ?


왜 이런 게 필요하지?라고 생각하는 분들도 계실 겁니다. 실제로 저는 gpg2백업을 위해 파일을 오프사이트로 보내기 전에 파일을 암호화합니다.

네트워크 문제, 원격 서버 충돌 등 어떤 이유로든 중단된 경우 대용량 파일의 백업을 복원할 수 있기를 원합니다. 결정적 암호화를 사용하면 쉽습니다. 업로드된 바이트 수(암호화된 콘텐츠)를 가져오고, 파일을 다시 암호화하고, 해시를 확인하세요.질소바이트를 저장하고 일치하는 경우 나머지 바이트를 계속 처리합니다. 그러나 암호화 결과가 확실하지 않은 경우 업로드를 재개할 수 없습니다.

답변1

당신은 할 수 없습니다. 가장 일반적으로 인정되는 보안 정의(예: 의미론적 보안 및 적응형 선택 암호문 보안)는 결정론적 암호화를 허용하지 않습니다.

이유를 알아보기 위해 제가 여러분에게 두 가지 예/아니요 질문을 하고 여러분이 미리 공유한 키를 사용하여 내 답변을 결정적으로 암호화한다고 가정해 보겠습니다. 결정론적 암호화를 사용하면 모든 도청자는 두 질문에 대한 답변이 동일한지 알 수 있습니다.

물론 틈새 사용 사례를 겨냥한 덜 안전한 형태의 암호화도 있습니다(예: 집계 암호화). 그러나 gpg와 같은 일반 암호화 도구는 범용 용도로 사용되기 때문에 더 나은 보안을 제공해야 합니다.

고쳐 쓰다참조가 필요하면 GPG 소스 코드를 에서 볼 수 있습니다 agent/protect.c. IV가 설정된 것을 볼 수 gcry_create_nonce있으며 다음에서 기록을 찾을 수 있습니다.libgcrypt 매뉴얼처럼:

가득한완충기그리고길이예측할 수 없는 바이트입니다. 이는 종종 난수라고 불리며 벡터와 패딩을 초기화하는 데에도 사용할 수 있습니다. 이는 세 가지 이유로 다른 임의 함수와 거의 독립적인 추가 기능입니다. 일반 임의 생성기의 내부 상태를 더 잘 보호하고 더 나은 성능을 제공하며 귀중한 엔트로피 풀을 소모하지 않습니다.

관련 정보