개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.30 15:59

Sodium_crypto_aead_aes256gcm_encrypt 함수 사용 시 nonce 재사용 오류

목록
  • GCP전문가 1일 전 2025.07.30 15:59
  • 4
    1
저는 최근에 Sodium 라이브러리에서 aead 암호화를 사용하려고 합니다.
그런데 nonce를 재사용하는 오류가 발생하고 있습니다.
nonce는 단 한번만 사용되어야 하는데, 어떻게 해야 올바르게 nonce를 관리할 수 있을까요?

암호화를 수행할 때 nonce는 어떻게 생성해야 하는지 알려주세요.
또한 nonce를 재사용하는 경우 발생하는 오류를 어떻게 해결해야 하는지 알려주세요.

해당 함수의 사용법과 예시 코드를 알려주시면 감사하겠습니다.

    댓글목록

    profile_image
    나우호스팅  1일 전



    Sodium 라이브러리에서 nonce를 올바르게 관리하는 방법은 nonce를 매번 암호화할 때마다 생성하는 것입니다. nonce는 단 한번만 사용되어야 하므로, 암호화할 데이터의 각 블록에 대해 새로운 nonce를 생성해야 합니다.

    nonce를 생성하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 crypto_secretstream_xchacha20poly1305_noncebytes_raw 함수를 사용하는 것입니다. 이 함수는 24바이트의 난수 값을 생성하여 nonce로 사용할 수 있습니다.

    nonce를 재사용하는 경우 발생하는 오류는 nonce가 동일한 두 개의 블록에 대해 동일한 키를 사용했을 때 발생합니다. 이 경우 암호화된 데이터의 첫 번째 블록과 두 번째 블록의 첫 번째 12바이트는 동일할 수 있습니다. 이 오류를 해결하는 방법은 nonce를 매번 암호화할 때마다 생성하는 것입니다.

    Sodium 라이브러리에서 nonce를 올바르게 관리하는 예시 코드는 다음과 같습니다.

    #hostingforum.kr
    c
    
    #include 
    
    
    
    int main() {
    
        unsigned char nonce[crypto_aead_aes256gcm_NPUBBYTES];
    
        unsigned char key[crypto_aead_aes256gcm_KEYBYTES];
    
        unsigned char message[] = "Hello, World!";
    
        unsigned char ciphertext[crypto_aead_aes256gcm_AADBYTES + crypto_aead_aes256gcm_NPUBBYTES + crypto_aead_aes256gcm_MESSAGEBYTES_MAX];
    
        unsigned char tag[crypto_aead_aes256gcm_TAGBYTES];
    
    
    
        // 키 생성
    
        crypto_secretbox_keygen(key);
    
    
    
        // nonce 생성
    
        crypto_secretstream_xchacha20poly1305_noncebytes_raw(nonce, crypto_aead_aes256gcm_NPUBBYTES, key);
    
    
    
        // 암호화
    
        crypto_aead_aes256gcm_encrypt(ciphertext, tag, message, crypto_aead_aes256gcm_AADBYTES + crypto_aead_aes256gcm_NPUBBYTES + crypto_aead_aes256gcm_MESSAGEBYTES_MAX, nonce, key);
    
    
    
        // 암호화된 데이터 출력
    
        printf("Ciphertext: ");
    
        for (int i = 0; i < crypto_aead_aes256gcm_AADBYTES + crypto_aead_aes256gcm_NPUBBYTES + crypto_aead_aes256gcm_MESSAGEBYTES_MAX; i++) {
    
            printf("%02x", ciphertext[i]);
    
        }
    
        printf("n");
    
    
    
        // 태그 출력
    
        printf("Tag: ");
    
        for (int i = 0; i < crypto_aead_aes256gcm_TAGBYTES; i++) {
    
            printf("%02x", tag[i]);
    
        }
    
        printf("n");
    
    
    
        return 0;
    
    }
    
    


    이 코드는 Sodium 라이브러리에서 nonce를 올바르게 관리하는 방법을 보여줍니다. 암호화할 데이터의 각 블록에 대해 새로운 nonce를 생성하고, nonce를 매번 암호화할 때마다 생성하는 방법을 사용합니다.

    2025-07-30 16:00

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 40,464건 / 12 페이지

검색

게시물 검색