주어진 공유 비밀 키를 사용하여 보낸 모든 메시지에 대해 고유 한 nonce가 필요합니다. nonce는 비밀 일 필요 없다; 간단한 카운터는 완전히 괜찮습니다. nonce에서 단일 비트를 변경하면 동일한 메시지가 두 번 전송 되더라도 암호문이 완전히 다르게 보입니다.
공유 된 비밀이란 무엇입니까? 이것은 (A의 비밀 키, B의 공개 키) 또는 (A의 공개 키, B의 비밀 키)에서 계산 된 키입니다. A와 B는 가지고있는 것을 기반으로 다른 계산을 수행하지만 동일한 공유 비밀로 끝납니다.
crypto_box
에서 사용되는 공유 암호는 256 비트입니다. 거대합니다. 공유 비밀은 각 "대화"마다 고유하게 될 것이라고 안전하게 생각할 수 있습니다.
따라서 (A, B), (A, C) 및 (C, B)는 동일한 넌스를 사용하여 메시지를 안전하게 교환 할 수 있습니다. 그러나 A가 주어진 nonce를 사용하여 B에게 메시지를 보내면 B는 동일한 nonce를 사용하여 A에게 메시지를 보낼 수 없습니다. Nonce는 A와 B 사이의 대화 중에 교환되는 모든 것에 대해 고유해야합니다.
따라서 간단한 카운터가 유용 할 수 있습니다. A 짝수를 선택하고, B에 홀수를 남기고, 전송 된 모든 메시지가 끝날 때마다 넌스를 2 씩 증가시킵니다.
그러나 crypto_box
건설에 사용 된 암호에는 실제로 매우 큰 논스가 있습니다. 192 비트.
즉, 내가 쓴 모든 것을 무시하고 메시지를 보낼 때마다 임의의 넌스를 선택하면 충돌 가능성이 너무 낮아서 결코 실제로는 결코 일어나지 않을 것이라고 확신 할 수 있습니다.
Sodium (AES128-CTR, ChaCha20, Salsa20)에 포함 된 일부 스트림 암호는 더 짧은 nonce를 가지며 충돌을 피하기 위해 카운터가 필요합니다. 이것이 문서의 "고급"섹션에있는 이유입니다.
그러나 crypto_box
및 crypto_secretbox
을 사용할 때마다 매번 임의의 넌스 (randombytes_buf(nonce, sizeof nonce)
)를 선택하면 안전합니다.
"nonce"는 실제로 "Number used on"의 축소입니다. 그래서 네, 다른 숫자를 사용합니다! – OJFord