2012-10-19 3 views
4

OpenSSL의 EVP 인터페이스를 사용하여 GCM 모드를 사용하여 AES 암호화를 구현하고 있습니다.OpenSSL GCM 암호 해독에서 지연 인증

인증 모드 중 하나 인 GCM은 암호 텍스트 무결성을 제공합니다. 즉, 암호 텍스트 (및 제공되는 경우 추가 데이터)에 태그 (MAC - 메시지 인증 코드)를 생성합니다. 암호 텍스트가 수정되지 않았는지 확인하기 위해 해독 전에이 태그를 나중에 확인할 수 있습니다.

나는이 블로그 게시물에 따라 암호화를 구현 한 : http://incog-izick.blogspot.in/2011/08/using-openssl-aes-gcm.html

나는 다음과 같은 API를 (순서대로) 호출을 사용하고 해독하는 동안 :

// setting cipher, key and iv 
    EVP_DecryptInit (ctx, EVP_aes_128_gcm(), key, iv); 

    // setting tag 
    EVP_CIPHER_CTX_ctrl (ctx, EVP_CTRL_GCM_SET_TAG, taglength, tagbuffer); 

    // adding Additional Authenticated Data (AAD) 
    EVP_DecryptUpdate (ctx, NULL, &length, aad, aadlength); 

    // decrypting data 
    EVP_DecryptUpdate (ctx, decrypteddata, &length, encrypteddata, encryptedlength); 

    // authentication step 
    EVP_DecryptFinal(ctx, outbuffer, &length); 

문제는, 그 나는 경우 암호 텍스트 또는 AAD를 수정하면 암호문은 여전히 ​​암호 해독되고 암호 해독 프로세스의 최종 호출, 즉 EVP_DecryptFinal에 대한 호출에서 오류가 감지됩니다. 오류를 나타내는 0 값이 리턴됩니다.

내 의견으로는 EVP_DecryptUpdate 호출 자체에 오류가 발생하여 암호 해독이 실패해야합니다. 늦은 오류 탐지는 인증 된 암호화의 목적을 상실합니다.

무엇이 문제입니까?

답변

3

MAC이 암호문의 끝에 도달하기 전에 실패한다는 것을 어떻게 알 수 있습니까? 스트리밍 API는 끝까지 도달했음을 알기 전에 출력을 생성해야합니다.

이렇게하지 않으려면 전체 메시지를 임시 버퍼로 해독하고 생성 된 일반 텍스트로 작업을 해독하면됩니다. 일단 확인 된 암호문 만 제공하지만 스트리밍 사용을 지원하지 않는 API (예 : NaCl의 unbox)가 있습니다.

또는 MAC을 일정한 간격으로 암호문에 넣는 새로운 암호화 체계를 만들면 더 작은 블록을 해독하고 확인할 수 있습니다. 일반 AES-GCM으로는 충분하지 않습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 EVP 인터페이스를 사용하여 CCM을 구현하려했으나 정상적으로 작동합니다. 암호문이 수정되면 암호 해독에 실패합니다. 둘의 차이점은 무엇입니까? – sg1

관련 문제