한 당사자가 4 바이트를 40 바이트 미만으로 암호화하는 가장 안전한 방법은 무엇입니까?
사용자가 스스로 복구 할 수 있도록 블록 체인에 암호화 된 U32를 저장해야하는 프로젝트가 있습니다. 사용자는 항상 키를 사용할 수 있지만 U32 값을 "잊을"수 있습니다. 다른 당사자는 정보를 디코딩 할 필요가 없지만 일반 텍스트는 결국 체인에서 공개됩니다.
사용자는 크기에 관계없이 무한한 수의 키를 결정적으로 도출 할 수있는 엔트로피 시드를 가지고 있습니다. 단일 블록의 AES를 사용하려고했지만 간단한 XOR로도 충분하다는 생각이 들었습니다. 사용자가 이러한 유형의 작업을 수행 할 때마다 고유 한 "키"를 파생한다고 가정 할 때 그보다 더 복잡한 작업을 수행 할 이유가 있습니까?
답변
분명한 대답은 일회용 패드 를 사용하는 것 입니다. 각 4 바이트 블록에 대해 고유 한 임의의 4 바이트 키를 실제로 사용하는 경우 보안이 입증 될 수 있습니다.
사용자는 크기에 관계없이 무한한 수의 키를 결정적으로 도출 할 수있는 엔트로피 시드를 가지고 있습니다.
진짜 문제는이 "파생 된"무작위성과 그것이 얼마나 무작위 적인지입니다. 나는 그것의 무한한 근원을 알지 못합니다.
Salsa / ChaCha를 사용하면 2 ^ 64 512 비트 키를 생성 할 수 있으며 각 키는 16 개의 서로 다른 4 바이트 블록을 암호화 할 수 있습니다. 그래서 나는 충분히 무한하다고 생각합니다.
사용자는 320 비트 키로 시드해야합니다. 2 ^ 68 (내 수학이 틀리지 않은 경우) 암호화 후 키를 변경해야합니다. XChaCha와 유사한 설정을 사용하면 이것을 2 ^ 132로 확장 할 수 있습니다.
요약하면, 암호화로 안전한 임의성 소스가있는 경우 XOR 만 수행 할 수 있습니다.
따라서 이러한 제약 조건이있는 암호 학자의 표준 솔루션은 12 바이트 nonce와 함께 AES-128-GCM을 사용하고 고정 비밀 키를 사용하는 16 바이트 인증 태그를 사용하는 것입니다.
그러나이 값이 블록 체인에 저장된다는 사실은 다음과 같은 부당한 크기 감소를 허용합니다 .
- 임시 값은 삭제 될 수 있으며 대신 블록 체인에 기록 된 값의 수에서 다시 파생 될 수 있습니다.이 값은 체인의 과거 상태를 검사하여 검색 할 수 있습니다. 이는 키 가이 애플리케이션 에만 사용되고 키의 다른 사용이 실수로 모든 트랜잭션과 동일한 키 / 넌스 쌍을 사용할 수 없다고 가정 합니다.
- 암호문이 무엇인지 항상 알고 있기 때문에 인증 태그를 삭제할 수 있으며 트랜잭션의 서명과 블록 체인의 불변성 덕분에 제출 후 변경할 수 없습니다. 이것은 가치를 검색 할 때 블록 체인 클라이언트가 잘못된 값을 제공하지 않는다고 신뢰하거나 어떻게 든 관련 서명 된 트랜잭션을 검색하여 확인할 수 있다고 가정합니다.
이제이 두 가지를 모두 제거하면 기본적으로 AES-128-CTR이 남습니다. $\operatorname{AES}_K(C)\oplus M$ 고정 키 $K$ 그리고 당신의 카운터 값 $C$ 및 메시지 $M$. 복호화를 위해 AES 출력의 동일한 부분을 다시 생성 할 수 있기 때문에 메시지 확장이 발생하지 않습니다.