[Hỏi đáp] – Mã hoá rồi kí hay kí rồi mã hoá?


Đây là 1 chủ đề thảo luận trên HVA theo link sau:
http://www.hvaonline.net/hvaonline/posts/list/42243.hva

Các ý quan trọng đã được mình tô màu xanh như đoạn trích dưới đây.

Phần trình bày vấn đề của chủ thớt (nick là foaato):

Em và thằng bạn em cãi nhau về vấn đề Mã hoá và Xác thực. Em thì cho rằng việc kí lên bản rõ sau đó mới thực hiện việc mã hoá rồi gửi đi sẽ tốt hơn là mã hoá bản rõ rồi mới kí lên bản mã rồi gửi đi .
Mong các bậc tiền bối vào giải thích giúp em với ạ smilie 
Chi tiết cuộc nói chuyện của chúng em tạm gọi em là A, bạn em là B

B: mã rồi ký hoặc ký rồi mã thì cũng như nhau cả thôi bác ak
B: vì tất cả đều thực hiện trên cùng 1 máy mà
B: chứ ko bị đánh cắp thông tin giữa 2 nhiệm vụ đó
B: nên ko nói cách nào ổn hơn cách nào đâu bác ak smilie

A: đây là câu trả lời thỏa đáng nè: Alice gửi cho Bob thông điệp. Alice mã hóa thông điệp, sau đó mới kí lên thông điệp, rồi gửi đi trên đường truyền (khi này chỉ có thông điệp được mã hóa, chữ kí thì không). Nếu trên đường truyền có kẻ thứ ba, tạm gọi là Oscar bắt đc cái thông điệp kèm theo cái chữ kí đó. Oscar hoàn toàn có thể lấy được cái thông điệp đã bị mã hóa kia rồi kí lại bằng chứ kí của mình (Oscar) rồi mới chuyển đi cho Bob. Khi đó Bob nhận được thông điệp và kiểm tra nó sẽ được xác định đây là thông điệp do Oscar gửi đi mà không phải do Alice. Còn trường hợp kí luôn lên rồi mới mã hóa chuyển đi thì Oscar sẽ khó lòng có thể giải mã được thông điệp+chữ kí để có thể thay đổi chữ kí vì Oscar không biết được khóa bí mật của Bob để giải mã. Tạm giải thích là như thế

A: quy trình trong trường hợp mã hóa rồi mới kí như sau: Alice dùng khóa công khai của Bob để mã hóa thông điệp, gọi cái thông điệp sau khi đã đc mã hóa này là Z. Sau đó dùng khóa bí mật của mình (Alice) + nội dung thông điệp (đã mã hóa) để kí. Gọi cái chữ kí này là Y. Khi đó Alice sẽ truyền đi cặp (Z,Y), Khi Bob nhận được thì sẽ thử tất cả các khóa công khai mà mình có để xem ai là chủ của cái chữ kí này (ở đây là Alice), sau khi đã xác định được ai kí lên thì mới bắt đầu giải mã thông điệp

A: Vấn đề trong trường hợp này là khi có người thứ 3 (ở đây là Oscar) tham gia vào quá trình truyền Oscar sẽ thay cái chữ kí Y của Alice = cái chữ kí của mình, tạm gọi là O rồi gửi đi cho Bob. Khi đó Bob sẽ nhận được là (Z, O), Bob cũng tiến hành thử các khóa công khai để xem ai là chủ của chữ kí và khi thử xong thì đó là chữ kí của Oscar (kẻ không mong muốn)

A: bác thử nghĩ trong trường hợp Mỹ và Philipin liên kết chống Trung Quốc, Mỹ nó gửi cho Phil 1 cái lệnh rồi kí lên tên nó, không may thằng Trung Quốc nó bắt đc trước, nó thay = chữ kí của nó, các bác Phil nhận được thấy của bọn Khựa nó gửi, thì chả đốt luôn chứ còn giải mã ra làm gì nữa smilie)

B: thế nó ký rồi mới mã thì nó gửi cái gì đi?

A: kí rồi mới mã thì nó mã = cái khóa công khai của thằng nhận, muốn giải mã phải có khóa bí mật của thằng nhận, mà khóa bí mật thì chỉ có mình thằng nhận biết chứ làm sao mà ai biết được nữa smilie

A: gửi đi cái bản mã hóa như bác thấy thì nó có phép hợp cái chữ kí với cái thông điệp lại làm 1 rồi mã hóa rồi gửi đi thôi, đến đầu kia sau khi giải mã xong mới tách chữ kí với thông điệp ra để xác thực

B: em phân tích thuật toán của bác thế này. bác ký xong được bản Y. sau đó bác mã bản Y này được bản Z. rồi bác gửi cả Y và Z đi sang bên kia đúng ko?

B: làm thế này cũng được. nhưng mà dữ liệu gửi đi rất nhiều. tự dưng bị gấp đôi

B: nhưng nếu như ta ký lên bản rõ được bản Y, mã Y được Z rồi gửi cả Y và Z đi thì dữ liệu cũng bị lộ thôi. và thế thì cần mã hóa để ra Z làm gì smilie

B: cách tốt nhất để bắt trên đường truyền mà ko bị xem đó là chỉ gửi 1 bản vừa được ký vừa được mã thôi

B: như thế thì chẳng còn quan tâm mã trước hay ký trước smilie

B: bác hiểu ý em nói chứ?

A: bản rõ là X, chữ kí của bản rõ là Y= sigature(X), Y ghép vào với X tạo thành thông điệp đã được kí M, mã hóa Z= encrypt(M). Sau đó gửi Z đi thôi 

A: còn mã trước kí sau nó là: Bản rõ X, mã hóa ra Z= encrypt(X), kí là Y=signature(Z), ghép Z vào Y thành M rồi gửi M đi

Và mrro đã có ý kiến sau:

@foaato: để có thể thảo luận một vấn đề như thế này thì trước tiên phải làm rõ chúng ta đang nói trong ngữ cảnh symmetric crypto hay là asymmetric crypto. mình thấy bạn có vẻ nhầm lẫn giữa các khác niệm khác nhau trong hai lĩnh vực này. mã hoá và ký trong asymmetric crypto rất khác với mã hoá và “ký” (thực ra là authenticate) trong symmetric crypto, nên phải cẩn thận trong việc dùng các thuật ngữ. ngoài ra cũng không thể bàn về vấn đề này nếu chỉ nói khơi khơi “mã hoá rồi ký” hay là “ký rồi mã hoá” mà phải ghi ra chi tiết các thuật toán sẽ sử dụng. 

foaato wrote:

cách Encrypt Then Authenticate : The sender encrypts the plaintext, then appends a MAC of the ciphertext. Ek1(P) || MACk2(Ek1(P)) là cách tối ưu. Vậy khi người nhận nhận được cái message này họ sẽ tiến hành Xác thực (Authenticate) cái message này đầu tiên. Vấn đề là, nếu có kẻ tấn công (attacker) lấy được cái message này, và hắn (attacker) không cần quan tâm đến nội dung của cái plaintext kia là gì, hắn gỡ cái MAC của sender ra rồi lại gắn lại cái MAC của hắn vào tạm gọi là MACk3(Ek1(P)) khi đó message sẽ trở thành

Ek1(P) || MACk3(Ek1(P))

đến bên người nhận họ xác thực thì đó không phải là của người gửi (sender) mà lại là của kẻ tấn công

mình đoán đây chính là thứ mà bạn muốn hỏi – trong symmetric crypto thì nên kết hợp mã hoá (encrypt) và xác thực (MAC) như thế nào. đây cũng là câu hỏi thường gặp hàng ngày của nhiều người khi bắt đầu sử dụng mật mã. có nhiều cách kết hợp khác nhau, nhưng cách encrypt-then-MAC là an toàn nhất (có thể xem chứng minh ở đây: http://charlotte.ucsd.edu/users/mihir/papers/oem.pdf). 

bây giờ hình dung giữa Alice và Bob có một kênh truyền dữ liệu và giả sử bằng một cách nào đó Alice và Bob đã có chung với nhau một khoá bí mật (thông qua một giao thức authenticated key-exchange). bây giờ hai bên muốn truyền dữ liệu qua lại. nguyên tắc cơ bản để có một kênh truyền an toàn là: truyền cái gì thì bảo vệ integrity của cái đó. 

với encrypt-and-MAC, chúng ta gửi C = E_k(P) nhưng lại bảo vệ integrity của P (đó là còn chưa kể MAC có thể tiết lộ thông tin về P). với MAC-then-encrypt, chúng ta hoàn toàn không bảo vệ integrity của thông điệp mà chúng ta truyền đi. chỉ có với encrypt-then-MAC thì nhờ bước MAC cuối cùng mà thông điệp gửi đi được đảm bảo integrity. 

lưu ý rằng MAC vừa bảo vệ được integrity về nội dung thông điệp, vừa bảo đảm được integrity về danh tính của người gửi. vì Bob biết mình đang muốn nhận thông tin từ Alice, nên Bob sẽ xác thực dữ liệu trên kênh truyền bằng khoá chung giữa Bob và Alice. Nếu việc xác thực không thành công (thao tác verify của thuật toán MAC trả về false), Bob biết ngay thông điệp hoặc là đã bị thay đổi, hoặc là không đến từ Alice. Cách tốt nhất cho Bob lúc này là huỷ bỏ thông điệp. nói cách khác, Bob chỉ chấp nhận thông điệp M nếu như Alice gửi M cho Bob. 

thành ra tấn công mà bạn foaato đưa ra hoàn toàn không ảnh hưởng gì đến sự an toàn của kênh truyền. khi nhận được thông điệp đã bị foaato sửa đổi, Bob sẽ có cách phát hiện và không chấp nhận nó. điều duy nhất mà foaato có thể làm là ngăn cản sự liên lạc giữa Bob và Alice. kỳ thực thì khả năng này cũng bằng với khả năng của một công cụ cực kỳ hiện đại khác có tên là… cây kéo. khi đó foaato chỉ cần cắt đứt dây mạng là xong :-D.

–manthang.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s