2014-06-12 7 views
4

사용자가 엔드 투 엔드 암호화를 사용하여 장치간에 통신 할 수있는 앱을 작성 중입니다. 이를 위해 libsodium 암호화 라이브러리를 사용합니다. 비대칭 암호화 기능인 crypto_box (...)는 논스 (nonce)를 인수 중 하나로 요구합니다.비대칭 암호화 (libsodium)에서 nonce를 사용하는 방법은 무엇입니까?

나는 nonces를 처리하는 방법에 대해 약간 혼란 스럽다. 한 사람에게 보내는 모든 메시지는 다른 nonce를 사용하여 암호화해야합니까? 공격자가 사용 된 nonces 중 하나를 다시 사용할 수있는 공개 액세스 권한이있는 서버에 사용 된 nonce를 저장해야하므로 올바른 방법이 아닙니다.

A에서 B로 보낸 모든 메시지가 다른 nonce를 갖거나 nonce를 사용하여 A에서 B로 메시지를 보내면 C에서 B로 보낼 ​​수 없습니까?

누군가 나에게 설명해 주시겠습니까?

+2

"nonce"는 실제로 "Number used on"의 축소입니다. 그래서 네, 다른 숫자를 사용합니다! – OJFord

답변

3

한 사람에게 보내는 모든 메시지를 다른 nonce를 사용하여 암호화해야합니까?

예. 사실 결코, 같은 비공개를 동일한 개인 키에 대해 하나 이상 사용하십시오. 이 일을 성취하기 위해 넌센스를 추적해야 할 것입니다.

공격자가 사용 된 nonces 중 하나를 다시 사용할 수있는 공용 액세스 권한이있는 서버에 사용 된 nonces를 저장해야하므로 올바르게 보이지 않습니다.

왜 공개 액세스 권한이있는 서버에 nonce를 저장해야합니까? 그리고 어떻게 공격자가 넌스를 "사용"할 수 있다고 생각합니까? 그렇게하려면 개인 키가 필요할 것입니다.

왜 nonce를 개인 키와 같은 위치에 저장할 수 없습니까?

+0

그러나 A가 B에게 암호화 된 메시지를 보내려고하면 A는 B : PUBLIC 키를 사용하여 메시지를 암호화합니다. 이것은 내가 혼란스러워하는 곳입니다. 따라서 A는 nonce를 결정하고 B는 B로 전송 된 메시지를 암호화하는 데 사용 된 nonce가 B : 개인 키로 해독되는 것을 제어하지 않습니다. 내가 여기서 무엇을 놓치고 있니? – joakimb

+0

이 링크를 찾았습니다 : http://curvecp.org/nonces.html "특정 nonce가 패킷을 암호화하는 데 사용 된 후에는 동일한 nonce가 다른 패킷을 보낸 사람의 비밀 키에서이 패킷으로 암호화해서는 안됩니다 수신자의 공개 키와 동일한 넌스는 수신자의 비밀 키에서이 발신자의 공개 키로 다른 패킷을 암호화하는 데 절대 사용되어서는 안됩니다. " 이제는 A와 B 사이에서만 동일한 논스를 두 번 사용할 수 없다는 것을 이해합니다. – joakimb

+4

A가 B에게 암호화 된 메시지를 보내는 경우 B는 메시지의 암호를 해독하기 위해 동일한 nonce (A를 사용하여 메시지를 암호화하는 데 사용)를 사용해야합니까? 또는 메시지의 암호를 해독하는 새로운 nonce를 생성합니다. 나는 암호화와 해독이 서로 다른 공개 키를 필요로한다는 것을 알고 있습니다. 내가 알아 내려고하는 것은 공개 키가 아닌 데이터의 암호화/복호화를 위해 A와 B 사이에서 nonce가 교환되어야하는지 여부입니다. – Feru

2

주어진 공유 비밀 키를 사용하여 보낸 모든 메시지에 대해 고유 한 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_boxcrypto_secretbox을 사용할 때마다 매번 임의의 넌스 (randombytes_buf(nonce, sizeof nonce))를 선택하면 안전합니다.