2016-06-06 4 views
0

서버와 클라이언트 간의 데이터 전송에 OpenSSL을 사용하고 싶습니다. CBC 모드에서 AES가있는 EVP를 사용하여이 작업을 수행하려고합니다. 그러나 클라이언트에서 두 번째 메시지를 디코딩하려고하면 EVP_EncryptFinal_ex가 0을 반환합니다. 내 구성표가 그림에 표시됩니다.AES를 사용한 OpenSSL 데이터 전송

Approximated scheme

나는 생각한다, 나는 하나의 EVP 컨텍스트 두 번 EVP_EncryptFinal_ex (및 EVP_DecryptFinal_ex)를 호출하기 때문에이 문제. 그것을 올바르게하는 방법?

+0

두 번째 메시지를 해독하기 전에 컨텍스트를 초기화 할 수 있습니다. 이미 메시지를 보낸 사람의 IV (무작위로 생성 된 메시지)를 사용할 수 있기 때문에 이미 그렇게하는 것이 좋습니다. –

답변

1

EVP docs에 따라 EVP_EncryptFinal_ex()으로 전화하면 EVP_EncryptUpdate()으로 전화 할 수 없습니다.

패딩을 사용하는 경우 (디폴트)를 EVP_EncryptFinal_ex() 는 그 부분 블록에 남아있는 데이터이고 상기 "최종"데이터를 암호화한다. 아래 참고 섹션의 에 설명 된대로 표준 블록 패딩 (PKCS 패딩이라고도 함)을 사용합니다. 암호화 된 최종 데이터는 에 쓰여지고 하나의 암호 블록에 충분한 공간이 있어야합니다. 기록 된 바이트 수는 이며 outl에 저장됩니다. 이 기능을 수행 한 후 이라는 암호화 작업이 완료되고 에 대한 더 이상 호출 할 필요가 없습니다. EVP_EncryptUpdate()가 수행되어야합니다.

EVP_EncryptInit_ex()을 호출하여 암호화를위한 암호 ctx를 다시 설정해야합니다. EVP_EncryptInit()과 달리 EVP_EncryptInit_ex()과 같이 각 호출마다 기존 컨텍스트를 할당하고 해제하지 않고도 기존 컨텍스트를 계속 재사용 할 수 있습니다.

+0

모든 메시지와 함께 초기화 벡터를 보내고 싶지 않습니다. 그래서 나는 컨텍스트를 다시 초기화하고 싶지 않습니다. OpenSSL을 설정하여 CBC 모드에서 메시지를 암호화하고 암호 해독을 다시 시작합니다. I. e. 이전 메시지의 마지막 블록은 다음 메시지에 대해 IV가됩니다. OpenSSL을 기본적으로 사용할 수 있습니까? –

+0

모든 메시지에 고유 한 IV를 보내지 않으면 BEAST 공격에 취약 할 수 있습니다. http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html – Rahul

관련 문제