PKI/TLS

TLS ์—์„œ ECDH ํ‚ค ํ•ฉ์˜ ๊ฒฝ์šฐ PRF (PseudoRandom Function) ๋ฐฉ์‹

JayKim๐Ÿ™‚ 2023. 4. 14. 09:50
  • TLS ํ”„๋กœํ† ์ฝœ์€ ์•”ํ˜ธํ™” ํ†ต์‹ ์ด๋‹ค.
    ์ด ๋•Œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ํ‚ค์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด ์ ธ์•ผ ํ•˜๋Š”๋ฐ ์ด ๋•Œ PRF๋ฅผ ํ†ตํ•ด ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ํ˜„์žฌ ์„ค๋ช…์€ ECDH ๋ฅผ ํ†ตํ•œ ํ‚ค ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค.
  • ์ฐธ๊ณ ๋กœ ์•„๋ž˜ ์„ค๋ช… ํ•˜๋Š” ๋‚ด์šฉ์€ RFC5246 ์„ ๋‚ด์šฉ์„ ๋ถ„์„ํ•œ ๊ฒƒ์ด๋‹ค.
P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                             HMAC_hash(secret, A(2) + seed) +
                             HMAC_hash(secret, A(3) + seed) + ...

   A() is defined as:

   A(0) = seed
   A(i) = HMAC_hash(secret, A(i-1))

PRF(secret, label, seed) = P_<hash>(secret, label + seed)

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด seed ๊ฐ’์„ ์ž…๋ ฅ์œผ๋กœ hmac ๊ฐ’์„ ๊ตฌํ•œ A(1)์ด ๋‚˜์˜ค๊ณ 
์ด ํ›„ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฐ’ ๊ธธ์ด ์ด์ƒ์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต ํ•˜๋ฉด ๋œ๋‹ค.

์ด PRE ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด key_block ๊ฐ’์„ ์ƒ์„ฑ ํ•œ๋‹ค.

pre_master_secret = ECDH_Compute( my_private, other_pub_x, other_pub_y );

master_secret = PRF( pre_master_secret
                      "key expansion",
                      client_random + server_random);

key_block = PRF( master_secret,
                      "key expansion",
                      server_random + client_random);

// ์ƒ์„ฑ๋œ ํ‚ค key_block ( client_write_MAC_key || server_write_MAC_key || client_write_key || server_write_key || client_write_IV || server_write_IV )

client_write_MAC_key[mac_key_length]
server_write_MAC_key[mac_key_length]
client_write_key[enc_key_length]
server_write_key[enc_key_length]
client_write_IV[fixed_iv_length]
server_write_IV[fixed_iv_length]

verify_data = PRF(master_secret, 
                "finished", 
                Hash(handshake_messages))
                [0..verify_data_length-1];

PRF ํ•จ์ˆ˜ ๊ฒฝ์šฐ KeyBlock ์„ ์ƒ์„ฑ ์‹œ์™€ Finished ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ๋•Œ ์‚ฌ์šฉ ๋œ๋‹ค.

ECDH ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฝ์šฐ

์ƒ๋Œ€๋ฐฉ ๊ณต๊ฐœํ‚ค ๊ฐ’๊ณผ ์ž์‹ ์˜ ๊ฐœ์ธํ‚ค๋กœ Secret ํ‚ค๊ฐ€ ์ƒ์„ฑ ๋œ๋‹ค. ์ด ์ƒ์„ฑ ๋œ ํ‚ค๊ฐ€ pre_master_secret ๊ฐ’์ด ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  master_sercret ๋Š” PRF๋ฅผ ์ด์šฉํ•œ 48 ๋ฐ”์ดํŠธ์˜ ๊ณ ์ • ๊ฐ’์„ ๋งŒ๋“ ๋‹ค.
์ด ๋•Œ server ์™€ client ๋žœ๋ค ๊ฐ’์€ ์œ„์น˜๊ฐ€ ๋ฐ”๊ฟ”์–ด์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ GCM ๋˜๋Š” CCM ์„ ์‚ฌ์šฉ ์‹œ ์•„๋ž˜ ๊ฐ’์€ ์—†๋‹ค.

client_write_MAC_key[mac_key_length]
server_write_MAC_key[mac_key_length]

์ด๋ ‡๊ฒŒ 4๊ฐœ์˜ ๊ฐ’์„ ์‚ฌ์šฉ ํ•˜๋ฉด ๋œ๋‹ค.

      client_write_key[enc_key_length]
      server_write_key[enc_key_length]
      client_write_IV[fixed_iv_length]
      server_write_IV[fixed_iv_length]

์ฐธ๊ณ ๋กœ ECDH GCM ์‚ฌ์šฉ ์‹œ fixed_iv_length ๊ฐ’์€ 4 Bytes ์ด๋‹ค.
IV ๊ฐ’์˜ ๋‚˜๋จธ์ง€ ๊ธธ์ด๋Š” TLS ํŒจํ‚ท ์ •๋ณด์˜ ์ผ๋ถ€๋ถ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 4 Bytes ๊ธธ์ด๊ฐ€ ์ •ํ•ด ์กŒ๋‹ค.

ECDH ์™€ AES256 ํ‚ค ๊ธธ์˜ ์‚ฌ์šฉ ์‹œ

๋Œ€์นญํ‚ค ๊ธธ์ด ๊ฒฝ์šฐ 256 bits ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
์„œ๋ช… ๊ฐ’ ๊ฒ€์ฆ ์‹œ SHA-384 ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋Œ€์นญํ‚ค ๊ธธ์ด๋‹ค 256์„ ์“ธ๋•Œ๋Š” ECDSA_SHA384 ๋„ ์ง€์› ์–ด์•ผ ๋œ๋‹ค.