Xác thực bằng mã hóa khóa công khai có ưu điểm hơn so với xác thực bằng chữ ký số. Nhưng nó lại phải tốn 4 quá trình khóa công khai (2 quá trình mã khóa công khai và 2 quá trình giải mã khóa riêng). Phương pháp xác thực này vẫn giữ được các ưu điểm của mã hóa khóa công khai nhưng chỉ tốn 2 quá trình khóa công khai.
Trong phương pháp này, nonce vẫn được mã bằng khóa công khai của bên kia, tuy nhiên ID của các bên (và cả certificate nếu nó được gửi đi) được mã bằng thuật toán mã đối xứng (từ SA payload) bằng khóa được sinh ra từ nonce này. Giải pháp này giảm thiểu độ phức tạp và tiết kiệm được 2 quá trình khóa công khai. Hơn nữa, KE payload cũng được mã bởi cùng một khóa, điều này cung cấp khả năng bảo vệ chống lại những mã thám của trao đổi Diffie – Hellman.
Giống như phương pháp xác thực bằng mã hóa khóa công khai, HASH payload có thể được gửi đi để nhận dạng certificate nếu bên đáp ứng có rất nhiều certificate chứa các khóa có thể sử dụng được. Nếu HASH payload được gửi đi thì nó phải là payload thứ 3 của trao đổi thông báo thứ 2 và phải kèm theo nonce mã. Nếu HASH payload không được gửi đi, thì payload đầu tiên của trao đổi thông báo thứ 2 phải mã nonce mã. Hơn nữa, bên khởi tạo có thể tùy ý gửi đi một certificate để cung cấp cho bên đáp ứng một khóa công khai dùng để đáp lại.
Bên khởi tạo Bên đáp ứng
HDR, SA HDR, SA HDR, [HASH(1),] <Ni_b>pubkey_r, <KE_b>Ke_i, <IDii_b>Ke_i [,<Cert-I_b>Ke_i]
HDR, <Nr_b>pubkey_i, <KE_b>Ke_r, <IDir_b>Ke_r HDR*, HASH_I HDR*, HASH_R
Trong đó, HASH(1) là hàm hash (đã được thỏa thuận) của certificate mà bên khởi tạo dùng để mã nonce và ID. Ke_i và Ke_r là các khóa đối xứng của thuật toán mã đối xứng được thỏa thuận trong trao đổi SA payload. Chỉ có thân của các payload là được mã (trong cả mã không khai lẫn mã đối xứng), header chung của các payload là để rõ. Độ dài của payload bao gồm cả phần được thêm vào để thực hiện mã.
Các khóa đối xứng được sinh ra từ các nonce (được giải mã) như sau: Đầu tiên các giá trị Ne_i và Ne_r được tính:
Ne_i = prf(Ni_b, CKY-I) Ne_r = prf(Nr_b, CKY-R)
Sau đó, Ke_i và Ke_r được lấy ra từ Ne_i và Ne_r, nếu độ dài của hàm prf được thỏa thuận lơn hơn hoặc bằng độ dài khóa yêu cầu đối với bản mã, thì Ke_i và Ke_r được sinh ra từ các bit quan trọng nhất của Ne_i và Ne_r. Nếu đầu ra này có độ dài nhỏ hơn độ dài khóa mong muốn, thì ta sẽ lấy ra số bit cần thiết bằng cách đưa liên tiếp các kết quả của hàm prf trở lại chính nó và kết hợp kết quả cho đến khi nhận được số bit cần thiết. Ví dụ nếu thuật toán mã hóa (đã được thỏa thuận) yêu cầu 320 bit khóa mà đầu ra của hàm prf chỉ là 128 bit, thì Ke_i là 320 bit quan trọng nhất của K. Trong đó:
K=K1|K2|K3
Và K1=prf(Ne_i, 0). K2=prf(Ne_i, K1). K3=prf(Ne_i, K2).
Ke_r cũng được sinh ra tương tự như trên. Độ dài của giá trị 0 trong biểu thức tính K1 là một octet đơn. Chú ý rằng Ne_i, Ne_r, Ke_i và Ke_r là tức thời và phải bị loại bỏ sau khi sử dụng.
Ngoài yêu cầu về bố trí HASH payload tùy chọn và nonce payload bắt buộc thì không còn bất cứ một yêu cầu nào khác. Tất cả các payload (trong bất kỳ vị trí nào) theo sau các nonce mã đều phải được mã bằng khóa Ke_i hoặc Ke_r (tùy thuộc vào hướng liên lạc).
Nếu chế độ CBC được sử dụng cho mã đối xứng thì các vectơ khởi tạo IV (Initialization Vector) được thiết lập như sau. IV để mã payload thứ nhất sau nonce được đặt là 0. IV cho các payload tiếp theo được mã bằng khóa mã đối xứng (Ke_i) là khối mã cuối cùng của payload trước đó. Các payload mã được chèn thêm cho bằng cỡ của block gần nhất.