2014-05-25 4 views
1

HTTPS 요청을 처리하기 위해 Lisp이있는 웹 서버를 작성하고 있습니다. 나는 TLS 1.2을 따르고 핸드 셰이크 프로세스를 이미 완료했습니다. 내가 선택한 Cipher Suite는 TLS_RSA_WITH_RC4_128_SHA입니다. 이미 client_write_MAC_secret, server_write_MAC_secret, client_write_key, server_write_key를 계산했습니다. 브라우저에서 "Finished"메시지를 해독하고 내부 데이터의 유효성을 검사 할 수 있기 때문에 이러한 키가 올바른 것 같습니다. 또한 레코드 레이어의 HMAC를 확인합니다. 그런 다음 "Change Cipher Spec"과 "Finished"를 서버에서 보냅니다. 지금까지 모든 것이 잘 작동하는 것 같습니다.HTTPS의 응용 프로그램 계층에서 데이터를 해독하는 방법은 무엇입니까?

그런 다음 브라우저에서 메시지가 #(23 3 3 1 61 ...)으로 시작됩니다. 23은 응용 프로그램 데이터임을 의미합니다. #(3 3)은 TLS 1.2를 의미합니다. #(1 61)은 길이가 256 + 61 = 317을 의미하며, 왼쪽의 데이터는 실제로 길이가 317입니다. 여기에 내 질문이 온다 : RC4를 사용하여 "client_write_key"를 사용하여 317 바이트를 해독 한 다음 텍스트로 변환 할 수없는 #(148 104 81 182 67 111 28 201 202 50 207 57 126 209 19 ...) 같은 데이터를 얻었습니다. 내가 GET/HTTP/1.1과 같은 것을 얻어야한다고 생각했습니다. 무엇이 잘못 되었습니까?

감사합니다.

+1

client_write_key가 아닌 server_write_key를 사용하여 해독해야합니다. –

+0

@GregS 답장을 보내 주셔서 감사합니다. 왜 server_write_key를 사용합니까? 에 따르면 서버 쓰기 키 : 서버가 작성한 데이터를 암호화하는 데 사용되는 키입니다. –

+0

@GregS server_write_key 시도했지만 행운을 : ( –

답변

1

RC4는 RFC 5246, section 6.2.3.1에 따라 "동기화 벡터 (예 : RC4)를 사용하지 않는 스트림 암호의 경우 하나의 레코드 끝에있는 스트림 암호 상태가 다음 패킷에서 간단히 사용됩니다. "

따라서 해독 한 첫 번째 레코드는 FINISHED 메시지이며 해독 한 첫 번째 애플리케이션 데이터는 FINISHED 메시지를 해독 한 후 RC4 상태 여야합니다.