a. Thuật toán AES dùng trong mã hóa cho SRTP:
Đặc điểm kỹ thuật
AES là một thuật toán mã hóa khối đối xứng với độ dài khóa là 128 bít (một chữ số nhị phân có giá trị 0 hoặc 1), 192 bít và 256 bít tương ứng dọi là AES-128, AES-192 và AES-256. AES-128 sử dụng 10 vòng (round), AES-192 sử dụng 12 vòng và AES-256 sử dụng 14 vòng.
Vòng lặp chính của AES thực hiện các hàm sau: SubBytes(), ShiftRows(), MixColumns() và AddRoundKey(). Ba hàm đầu của một vòng AES được thiết kế để ngăn chặn phân tích mã bằng phương thức “mập mờ“ (confusion) và phương thức “khuếch tán“ (diffusion), còn hàm thứ tư mới thực sự được thiết kế để mã hóa dữ liệu. Trong đó “khuếch tán“ có nghĩa là các kiểu mẫu trong bản rõ (Dữ liệu đầu vào của phép mã hóa hoặc dữ liệu đầu ra của phép giải mã) được phân tán trong các bản mã (Dữ liệu đầu ra của phép mã hóa hoặc dữ liệu đầu vào của phép giải mã), “mập mờ“ nghĩa là mối quan hệ giữa bản rõ và bản mã bị che khuất. Một cách đơn giản hơn để xem thứ tự hàm AES là: Trộn từng byte (SubBytes), trộn từng hàng (ShiftRows), trộn từng cột (MixColumns) và mã hóa (AddRoundKey).
Đặc tả thuật toán AES
Đối với thuật toán AES, độ dài của khối đầu vào, khối đầu ra và trạng thái là 128 bít, số các cột (các từ có độ dài 32 bít) tạo nên trạng thái là Nb = 4.
Trong thuật toán AES, độ dài khóa mã K có thể là 128, 192 hay 256 bít. Độ dài khóa được biểu diễn bằng Nk = 4, 6 hoặc 8 thể hiện số lượng các từ 32 bít (số cột) của khóa mã.
Đối với thuật toán AES, số vòng được thay đổi trong quá trình thực hiện thuật toán phụ thuộc vào kích cỡ khóa. Số vòng này được ký hiệu là Nr. Nr = 10 khi Nk = 4, Nr = 12 khi Nk = 6 và Nr = 14 khi Nk = 8.
Các tổ hợp khóa-khối-vòng phù hợp đối với tiêu chuẩn này thể hiện trong Bảng 2.1. Việc thực hiện cụ thể thuật toán có liên quan đến độ dài khóa, kích cỡ khối và số vòng. Độ dài khóa (Nk từ) Độ dài khối (Nb từ) Số vòng (Nr) AES-128 4 4 10 AES-196 6 4 12 AES-256 8 4 14 Bảng 2.1: Tổ hợp Khóa-khối-vòng
Đối với phép mã hóa và phép giải mã, thuật toán AES sử dụng một hàm vòng gồm bốn phép biến đổi byte như sau: phép thay thế byte (một nhóm gồm 8 bít) sử dụng một bảng thay thế (Hộp-S), phép dịch chuyển hàng của mảng trạng thái theo các offset (số lượng byte) khác nhau, phép trộn dữ liệu trong mỗi cột của mảng trạng thái, phép cộng khóa vòng và trạng thái. Các phép biến đổi này (cũng như các phép nghịch đảo tương ứng của chúng) được mô tả trong phần dưới đây.
Phép mã hóa
Tại thời điểm bắt đầu phép mã hóa, đầu vào được sao chép vào mảng trạng thái sử dụng các quy ước. Sau phép cộng khóa vòng khởi đầu, mảng trạng thái được biến đổi bẳng cách thực hiện một hàm vòng liên tiếp với số vòng lặp là 10, 12 hoặc 14 (tương ứng với độ dài khóa), vòng cuối cùng khác biệt không đáng kể với Nr-1 vòng đầu tiên. Trạng thái cuối cùng được chuyển thành đầu ra. Hàm vòng được tham số hóa bằng cách sử dụng một lược đồ khóa – mảng một chiều chứa các từ 4 byte nhận từ phép mở rộng khóa.
Phép biến đổi cụ thể gồm SubBytes(), ShiftRows(), MixColumns() và AddRoundKey() dùng để xử lý trạng thái.
- SubBytes()
Phép biến đổi dùng trong phép mã hóa áp dụng lên trạng thái (kết quả mã hóa trung gian, được mô tả dưới dạng một mảng chữ nhật của các byte) sử dụng một bảng thay thế byte phi tuyến (Hộp S – bảng thay thế phi tuyến, được sử dụng trong một số phép thay thế byte và trong quy trình mở rộng khóa, nhằm thực hiện một phép thay thế 1-1 đối với giá trị mỗi byte) trên mỗi byte trạng thái một cách độc lập.
- ShiftRows()
Phép biến đổi dùng trong phép mã hóa áp dụng lên trạng thái bằng cách chuyển dịch vòng ba hàng cuối của trạng thái theo số lượng byte các offset khác nhau.
- MixColumns()
Phép biến đổi trong phép mã hóa thực hiện bằng cách lấy tất cả các cột trạng thái trộn với dữ liệu của chúng (một cách độc lập nhau) để tạo ra các cột mới.
- AddRoundKey()
Phép biến đổi trong phép mã hóa và phép giải mã. Trong đó, một khóa vòng (các giá trị sinh ra từ khóa mã bằng quy trình mở rộng khóa) được cộng thêm vào trạng thái bằng phép toán XOR (phép toán hoặc và loại trừ). Độ dài của khóa vòng bằng độ dài của trạng thái.
Mở rộng khóa
Thuật toán AES nhận vào một khóa mã K và thực hiện phép mở rộng khóa để tạo ra một lược đồ khóa. Phép mở rộng khóa tạo ra tổng số Nb(Nr+1) từ. Thuật toán yêu cầu một tập khởi tạo gồm Nb từ và mỗi trong số Nr vòng đòi hỏi Nb từ làm dữ liệu khóa đầu vào. Lược đồ khóa kết quả là một mảng tuyến tính các từ 4 byte.
Phép giải mã
Các phép biến đổi trong phép mã hóa có thể được đảo ngược và sau đó thực hiện theo chiều ngược lại nhằm tạo ra phép giải mã trực tiếp của thuật toán AES. Các phép biến đổi sử dụng trong phép giải mã gồm: InvShiftRows(), InvSubBytes(), InvMixColumns() và AddRoundKey().
- InvSubBytes()
Phép biến đổi InvSubBytes() là nghịch đảo của phép thay thế theo byte SubBytes(), trong đó sử dụng một hộp-S nghịch đảo áp dụng cho mỗi byte của trạng thái.
- InvShiftRows()
Phép biến đổi InvShiftRows() là phép biến đổi ngược của ShiftRows(). Các byte trong ba từ cuối của trạng thái được dịch vòng theo số byte khác nhau. Ở hàng đầu tiên (r=0) không thực hiện phép chuyển dịch, ba hàng dưới cùng được dịch vòng Nb-shift(r,Nb) byte.
- InvMixColumns()
Phép biến đổi InvMixColumns() là phép biến đổi ngược của MixColumns(). Nó thao tác theo từng cột của trạng thái, xem mỗi cột như một đa thức bốn hạng tử.
- Biến đổi nghịch AddRoundKey()
Phép biến đổi AddRoundKey() là phép biến đổi thuận nghịch vì nó chỉ áp dụng một phép toán XOR nên nó được thực hiện như nhau ở cả phép mã hóa và phép giải mã.
Ngoài các phép giải mã trên, thuật toán AES còn cho phép thực hiện một phép giải mã tương đương có cùng thứ tự các phép biến đổi như trong phép mã hóa (các biến đổi được thay bằng các phép biến đổi ngược). Có thể thực hiện được điều này là nhờ một thay đổi trong lược đồ khóa. Hai tính chất tạo nên một phép giải mã tương đương là: Tính giao hoán giữa hai phép biến đổi SubBytes() và ShiftRows() (tính chất này cũng đúng với phép nghịch đảo InvSubBytes() và InvShiftRows()), Các phép toán trộn cột MixColumns() và InvMixColumns() là tuyến tính đối với đầu vào cột. Các tính chất này cho phép đảo ngược thứ tự của các phép biến đổi InvSubBytes() và InvShiftRows(). Thứ tự của các phép biến đổi AddRoundKey() và InvMixColumns() cũng có thể đảo ngược với điều kiện đảm bảo rằng các cột của lược đồ khóa giải mã được chỉnh sửa bằng cách sử dụng phép biến đổi InvMixColumns().
Vấn đề thực hiện khóa
- Yêu cầu về độ dài khóa
Việc thực hiện khóa của thuật toán AES sẽ hỗ trợ ít nhất một trong ba độ dài khóa là 128 bít, 192 bít và 256 bít. Việc thực hiện khóa có thể tùy chọn hỗ trợ hai hoặc ba độ dài khóa, nhằm tăng thêm tính tương tác cho các thực hiện thuật toán.
- Tham số hóa độ dài khóa, kích thước khối và số vòng
AES quy định cụ thể các giá trị được phép dùng cho chiều dài khóa, kích thước khối và số vòng. Tuy nhiên, các giá trị này có thể thay đổi trong tương lai. Do đó, những nhà triển khai thuật toán AES có thể lựa chọn thiết kế linh hoạt với mong muốn của họ.
b. Giao thức dùng trong trao đổi khóa và xác thực cho SRTP:
MIKEY (Multimedia Internet KEYing) để thỏa thuận các tham số cần thiết cho các bên tham gia liên lạc với đặc tính dữ liệu thời gian thực và để tạo khóa
phiên đảm bảo cho mã hóa, xác thực và toàn vẹn dữ liệu thoại giữa các bên. Trong trường hợp MIKEY kết hợp với SRTP, MIKEY cung cấp khóa chủ (master key) cho SRTP. Trên cơ sở khóa chủ đó, khóa phiên (Khóa mã, khóa xác thực, và salt) cho giao dịch an toàn được tạo ra.
MIKEY hỗ trợ ba cơ chế xác thực khác nhau: Sử dụng khóa chia sẻ trước (shared key), Khóa công khai với vận chuyển khóa, và Khóa công khai với trao đổi khóa sử dụng lược đồ Diffie-Hellman (DH) có ký. Cơ chế thỏa thuận các tham số ở đây (kể cả cơ chế xác thực) được thực hiện theo giao thức mô tả phiên SDP (Section Description Protocol) dưới hình thức Yêu cầu/Trả lời (Request /Response) để đảm bảo tính toàn vẹn, đối với khóa chia sẻ trước là mã toàn vẹn thông báo (MIC- Message Integrity Code) và chữ ký số đối với hai trường hợp còn lại.
Trong trường hợp sử dụng khóa chia sẻ trước, khóa được sinh ra bởi người khởi tạo phiên và được truyền bằng cách bí mật nào đó tới đối tác. Tất nhiên khóa chia sẻ trước chỉ được áp dụng trong môi trường có số người sử dụng hạn chế. Đối với môi trường nhiều người sử dụng cần xây dựng cơ sở hạ tầng khóa công khai (PKI) với triển khai thực tế như sau: Người dùng lưu một tập con các CA gốc (Root CAs ), nhà cung cấp dịch vụ SIP phải có chứng chỉ ký bởi một trong các CA gốc đó, và đến lượt mình nhà cung cấp dịch vụ SIP cấp chứng chỉ sử dụng cho người dùng. Trong các cơ chế xác thực dựa trên chứng chỉ, chúng ta chỉ quan tâm đến trường hợp xác thực sử dụng DH, còn trường hợp sử dụng khóa công khai dựa trên vận chuyển khóa không được đề cập đến ở đây do độ trễ trong quá trình xác thực khá lớn (trên thực tế Alice phải bằng cách nào đó có được khóa công khai của Bob trước khi Alice gửi thông báo INVITE). Mặt khác sử dụng DH có ký còn có thể đạt được an toàn phía trước hoàn thiện (perfect forward secrecy) (Với an toàn phía trước hoàn thiện, kẻ tấn công không thể giải mã được cuộc nói chuyện (bản mã) đã ghi âm giữa Alice và Bob, ngay cả khi sau đó kẻ tấn công có được khóa riêng của họ).
Đáng lưu ý ở đây là khi đưa chứng chỉ vào trong nội dung thông báo MIKEY thông báo SIP sẽ quá lớn (khi độ dài khóa lớn hơn 1024 bit), không thể sử dụng giao vận UDP để vận chuyển thông báo (thông báo SIP khi đó sẽ lớn hơn 1300 byte, vượt ngưỡng cho phép) và phải vận chuyển bằng giao vận TCP hay TLS.
* Thuật toán Diffie – Hellman:
Hệ phân phối khoá Diffie-Hellman
Hệ phân phối khoá Diffie-Hellman không đòi hỏi TA (Trusted Authority – cơ quan đáng tin cậy) phải biết và chuyển bất kỳ thông tin bí mật nào về khoá của các người tham gia trong mạng để họ thiết lập được khoá chung bí mật cho việc truyền tin với nhau.
Trong một hệ phân phối khoá Diffie-Hellman, TA chỉ việc chọn một số nguyên tố lớn p và một phần tử nguyên thuỷ α theo mod p, sao cho bài toán tính logα trong p Zp* là rất khó. Các số p và α được công bố công khai cho mọi người tham gia trong mạng. Ngoài ra, TA có một sơ đồ chữ ký với thuật toán ký (bí mật) sigTA và thuật toán kiểm chứng (công khai) verTA.
Một thành viên bất kỳ A với danh tính ID(A) tuỳ ý chọn một số aA(0 ≤ aA ≤ p 2) và tính bA= αaA mod p. A giữ bí mật aA và đăng ký các thông tin (ID(A), bA) với TA. TA cấp cho A chứng chỉ:
C(A) = (ID(A), bA, sigTA(ID(A), bA)).
Các chứng chỉ của các thành viên trong mạng có thể được lưu giữ trong một cơ sở dữ liệu công khai hoặc uỷ thác cho TA lưu giữ và cung cấp công khai cho các thành viên mỗi khi cần đến.
Khi hai thành viên A và B trong mạng cần có một khoá bí mật chung để truyền tin bảo mật cho nhau thì A dùng thông tin công khai bB có trong C(B) kết hợp với số bí mật củamình là aA để tạo nên khoá:
KA,B= bB a
A mod p = αaBaA mod p
Khoá chung đó B cũng tạo ra được từ các thông tin công khai bA của A và số bí mật của mình:
KA,B= bA a
B mod p = αaAaB mod p
Để bảo đảm được các thông tin về và bB và bA là chính xác, A và B có thể dùng thuật toán verTA để kiểm chứng chữ ký xác thực của TA trong các chứng chỉ C(B) và C(A) tương ứng.
Độ an toàn của hệ phân phối khoá Diffie-Hellman được bảo đảm bởi yếu tố sau đây: Biết bA và bB để tính KA,B chính là bài toán Diffie-Hellman tương đương: biết αa mod p và αb mod p, tính αab mod p. Đây là một bài toán khó tương đương bài toán tính lôgarit rời rạc hay bài toán phá mật mã ElGamal.
Giao thức trao đổi khoá Diffie-Hellman
Hệ phân phối khoá Diffie-Hellman nói trong mục trước có thể dễ dàng biến đổi thành một giao thức trao đổi (hay thoả thuận) khoá trực tiếp giữa những người sử dụng mà không cần có sự can thiệp của một TA làm nhiệm vụ điều hành hoặc phân phối khoá.
Một nhóm bất kỳ người sử dụng có thể thoả thuận cùng dùng chung một số nguyên tố lớn p và một phần tử nguyên thuỷ α theo mod p, hai người bất kỳ trong nhóm A và B mỗi khi muốn truyền tin bảo mật cho nhau có thể cùng thực hiện giao thức sau đây để trao đổi khoá:
1. A chọn ngẫu nhiên số aA (0 aA p -2), giữ bí mật aA, tính bA= αaA mod p và gửi bA cho B.
2. Tương tự, B chọn ngẫu nhiên số aB (0 aB p -2), giữ bí mật aB, tính bB= αaB
mod p và gửi bB cho A.
3. A và B cùng tính được khoá chung:
KA,B= bBaA mod p = bAaB mod p( = αaAaBmod p) Giao thức trao đổi khoá Diffie-Hellman có các tính chất sau:
1. Giao thức là an toàn đối với việc tấn công thụ động, nghĩa là một người thứ ba, dù biết bA và bB sẽ khó mà biết được KA,B.
Ta biết rằng bài toán “biết bA và bB tìm KA,B” chính là bài toán Diffie- Hellman và bài toán đó tương đương với bài toán phá mật mã El Gamal.
2. Giao thức là không an toàn đối với việc tấn công chủ động bằng cách đánh tráo giữa đường, nghĩa là một người thứ ba C có thể đánh tráo các thông tin trao đổi giữa A và B, chẳng hạn, C thay αaA mà A định gửi cho B bởi αa'A, và thay αaBmà B định gửi cho A bởi αa'B, như vậy, sau khi thực hiện giao thức trao đổi khoá, A đã lập một khoá chung αaAa'B với C mà vẫn tưởng là với B, đồng thời B đã lập một khoá chung αa'AaB với C mà vẫn tưởng là với A; C có thể giải mã mọi thông báo mà A tưởng nhầm là mình gửi đến B, cũng như mọi thông báo mà B tưởng nhầm là mình gửi đến A!
Một cách khắc phục kiểu tấn công chủ động nói trên là làm sao để A và B có thể kiểm chứng để xác thực tính đúng đắn của các khoá công khai bA và bB. Đưa vào giao thức trao đổi khoá Diffie-Hellman thêm vai trò điều phối của một TA để được một hệ phân phối khoá Diffie-Hellman là một cách khắc phục như vậy. Trong
hệ phân phối khoá Diffie-Hellman, sự can thiệp của TA là rất yếu, thực ra TA chỉ làm mỗi một việc là cấp chứng chỉ xác nhực khoá công khai cho từng người dùng chứ không đòi hỏi biết thêm bất cứ một bí mật nào của người dùng. Tuy nhiên, nếu chưa thoả mãn với vai trò hạn chế đó của TA, thì có thể cho TA một vai trò xác nhận yếu hơn, không liên quan gì đến khoá, chẳng hạn như xác nhận thuật toán kiểm thử chữ ký của người dùng,
còn bản thân các thông tin về khoá (cả bí mật và công khai) thì do những người dùng trao đổi trực tiếp với nhau.
Giao thức trao đổi khoá D-H có chứng chỉ xác thực
Mỗi người dùng A có một danh tính ID(A) và một sơ đồ chữ ký với thuật toán ký sigA và thuật toán kiểm chứng verA. TA cũng có một vai trò xác thực, nhưng không phải xác thực bất kỳ thông tin nào liên quan đến việc tạo khoá mật mã của người dùng (dù là khoá bí mật hay là khoá công khai), mà chỉ là xác thực một thông tin ít quan hệ khác như thuật toán kiểm chứng chữ ký của người dùng. Còn bản thân các thông tin liên quan đến việc tạo khoá mật mã thì các người dùng sẽ trao đổi trực tiếp với nhau. TA cũng có một sơ đồ chữ ký của mình, gồm một thuật toán ký sigTA