Thứ Bảy, 5 tháng 12, 2020

Thuật giải di truyền và ứng dụng giải bài toán siêu trí tuệ Việt Nam

Heey yo 500 anh em, lâu lắm rồi mới quay trở lại viết blog. Cũng tại là dạo gần đây mình tập trung làm content bên mảng youtube nhiều quá, nên không sắp xếp đươc thời gian để viết bài bên đây. Nhưng cơ duyên là đợt rồi mình có đọc 1 cuốn sách liên quan đến trí tuệ nhân tạo, nói chung cuốn sách chủ yếu nói về việc trí tuệ nhân tạo sẽ thống trị loài người vân vân mây mây (mà mình cũng có review cuốn sách đó ở đây, anh chị em thấy hứng thú thì vào xem nhé). Sau khi đọc cuốn sách này thì mình lại có hứng để viết blog, thế là bài viết này ra đời =))
Ok, không dài dòng nữa, cùng mình tìm hiểu xem thuật giải di truyền là gì nhé, và cùng nhau code 1 chương trình giải 1 bài toán xuất hiện trong chương trình siêu trí tuệ Việt Nam mùa 2.
Các ứng dụng mình viết trong bài này đều đã được host lên ở đây, các bạn có thể vào xem nhé.

Thuật giải di truyền (Genetic Algorithm)

Để hiểu thuật giải di truyền là gì, thì chúng ta cần phải biết được thuyết tiến hóa của Darwin trước đã, vì thuật giải này được lấy ý tưởng từ thuyết tiến hóa này.
Theo Darwin, tiến hóa loài được hình thành do sự kết hợp của 3 yếu tố quan trọng: di truyền, đột biến và chọn lọc tự nhiên ( Cái này mình nhớ vì hồi xưa cấp 3 mình học chuyên sinh mà =)) ).
Lấy ví dụ loài bướm tiêu trong việc tiến hóa theo chọn lọc tự nhiên:
Ngày xửa ngày xưa, ở Anh có 1 đàn bướm tiêu, chúng là một đàn có nhiều con, và phần lớn chúng có màu đen và trắng.
Và để duy trì nòi giống, chúng phải giao phối với nhau, đây là quá trình di truyền. Và như chương trình sinh học cấp 3 đã dạy cho chúng ta biết, khi giao phối với nhau, thực chất là sự kết hợp của các cặp nhiễm sắc thể để tổng hợp tính trạng giữa bố và mẹ cho đứa con yêu dấu.
Nhưng, đây cũng là lúc những tác nhân môi trường khắc nhiệt của chúng ta phát huy tác động, và làm cho quá trình kết hợp này bị đột biến. Đột biến đã làm cho con con có những đặc tính không giống như bố mẹ mình.
Thế nên, trong đàn bướm trắng đen có xuất hiện những con bướm màu hường mộng mơ. Những con bướm màu hường này, thật là sặc sỡ, nó có thể dễ bị ăn thịt hơn, vì những con chim có thể phát hiện nó dễ dàng hơn. Thật tội nghiệp.
Nhưng, một ngày đẹp trời, có một dũng sĩ tên là Cuonglv1109 tới vùng đất loài bướm đang sống, và vẽ graffity. Dũng sĩ này cũng thuộc trường phái màu hường, do đó cả vùng đất bỗng chốc trở thành màu hường.
Và lúc này, những con bướm màu hường lại đạt được lợi thế. Những con bướm trắng và đen lại dễ bị tiêu diệt hơn vì quá dễ bị phát hiện. Và đây, Darwin gọi nó là chọn lọc tự nhiên.
Lúc này, trong quần thể con bướm số lượng bướm hường nhiều hơn, nên các con đời sau cũng dễ sinh ra có màu hường hơn.
Thế là, nhờ có dũng sĩ Cuonglv1109, đàn bướm từ trắng đen đã chuyển qua màu hường.
Và đó là thuyết tiến hóa của Darwin, vậy thì nó liên quan gì tới thuật giải di truyền. Ồ, hóa ra các nhà khoa học đã áp dụng thuyết tiến hóa để tạo nên thuật giải di truyền. Ví dụ, chúng ta đang muốn giải quyết một bài toán đơn giản là mò password. Password này gồm có 11 kí tự, chỉ cần đoán đúng 11 kí tự không cần theo thứ tự là sẽ giải được password. Ví dụ password cần giải là cuonglv1109.
Thuật giải di truyền sẽ tạo ra 1 quần thể gồm các password ngẫu nhiên có 11 kí tự. Ví dụ ở đây, ta có quần thể gồm 6 cá thể.
Những cá thể gần giống với password gốc nhất, là những cá thể có cơ hội sống cao hơn qua thế hệ sau, những cá thể khác với password nhất thì sẽ bị chết. Đây chính là chọn lọc tự nhiên.
Những cá thể sống sót sẽ giao phối với nhau, và sản sinh ra thế hệ con. Đây là quá trình di truyền.
Một vài cá thế con bị đột biến làm thay đổi 1 kí tự.
Thế hệ thứ 2 theo thuyết tiến hóa đã có độ chính xác cao hơn so với thế hệ đầu tiên. Quá trình này lặp đi lặp lại qua các thế hệ sẽ dẫn tới kết quả tìm ra được password.
Và đó chính là thuật giải di truyền.
Trong thuật giải di truyền có nhiều yếu tố cần phải xem xét. Trong đó có 2 yếu tố mà mình thấy quan trọng đó là:
Độ đột biến (mutation rate): tức là độ đột biến trong quần thể của bạn. Đây thực chất cũng là hyperparameter cần phải tối ưu.
Độ chọn lọc (Selection Rate): tức là mức độ chọn lọc cá thể, bao nhiêu cá thể phải chết đi.
Mình cũng đã viết 1 cái demo cho thuật giải này dựa trên câu chuyện đàn bướm ở trên.
Ý tưởng đơn giản là chúng ta có 1 đàn bướm ngẫu nhiên gồm nhiều con bướm với màu sắc khác nhau. Sau đó ta chọn màu cho môi trường chúng sống, qua các thế hệ thì những con bướm này sẽ chuyển thành màu gần gần giống với màu của môi trường. Cái demo này thì mình sẽ không giải thích code nha, tại nó sẽ tốn khá nhiều thời gian, mình sẽ dành thời gian để nói về ứng dụng giải bài toán siêu trí tuệ Việt Nam ở dưới. Code của demo này mình cũng đã push lên github ở đây, các bạn có thể clone về chạy thử
Vậy thì thuật giải di truyền này áp dụng được vào việc gì?
Như các bạn để ý, thuật giải di truyền này qua mỗi thế hệ, thì các cá thế ở thế hệ sau có độ chính xác cao hơn các cá thể ở thế hệ trước. Điều này sẽ được áp dụng vào việc tìm ra các hyperparameter trong máy học(Nếu như các bạn không hiểu hyperparameter, máy học là gì, thì có thể quay lại series nhận dạng hình ảnh bằng máy học do mình đã viết để đọc nhé). Vậy nên, người ta sẽ áp dụng thuật giải di truyền này vào máy học để máy có thể học đươc hiệu quả.
Nhưng hôm nay, mình sẽ áp dụng thuật giải di truyền này vào để giải một bài toán vừa mới được chiếu trên chương trình siêu trí tuệ Việt Nam mùa 2.

Ứng dụng giải bài toán siêu trí tuệ Việt Nam

Trong chương trình siêu trí tuệ Việt Nam mùa 2, mình có thấy 1 bài toán về mã đi tuần. Trong đó, thí sinh được cho 1 bàn cờ vua 8*8, và 2 ô bắt đầu và kết thúc.
Nhiệm vụ của tuyển thủ là phải giải bài mã đi tuần và bài toán điền số. Với bài toán mã đi tuần, các bạn có thể giải bằng back-tracking (mình đã viết ở trong bài này). Mà thực ra mình nói vậy thôi, chứ sau khi mình thử code thì thấy dùng back-tracking chạy lâu lắm các bạn ạ =(( .
Ở đây, chúng ta sẽ giải quyết bài toán thứ 2. Đó là phải điền số vào các ô trong bàn cờ sao cho: Tổng mỗi hàng, tổng mỗi cột phải bằng với 1 số cho trước bất kì (trong chương trình, con số này được ca sĩ Tóc Tiên chọn là 531)
Để giải quyết bài toán này, ý tưởng mình đưa ra đó là chúng ta sẽ tạo ra 1 quần thể những bàn cờ, với những con số bất kì được đặt trong bàn cờ đó. Ở đây mình tạo ra 1 quần thể có 1000 bàn cờ.
this.result = 531;
this.insta = 1000;        
this.mazes = [this.insta];
for(let i = 0; i< this.insta; i++) {
    this.mazes[i] = new Maze(result);
}
Sau đó chúng ta sẽ tính độ fit của mỗi cá thể so với kết quả đúng. Cách tính thì mình sẽ tính bằng cách tính tổng sự sai số của mỗi hàng, mỗi cột của bàn cờ. Cá thể có độ sai số càng cao, thì đột fit càng thấp. Tức là vào thế hệ sau sẽ càng dễ bị chết đi.
calculateScore(result){
        this.score = 0; // fitness score
        for (let i = 0; i < 8; i++) {
            let total = 0;
            for (let j = 0; j < 8; j++) {
               total += this.map[i][j];
            }
            this.score += Math.abs(result- total);
        }
        for (let i = 0; i < 8; i++) {
            let total = 0;
            for (let j = 0; j < 8; j++) {
                total += this.map[j][i];
            }
            this.score += Math.abs(result- total);
        }
    }
Độ chọn lọc mình đưa ra là 80% số lượng cá thể. Tức là sau mỗi thế hệ, sẽ có 800/1000 cá thể bị loại bỏ.
this.deathRate = 0.8*this.insta;
selection(){
        for(let i = 0 ; i < this.insta; i++){
            this.mazes[i].calculateScore(this.result);
        }
        this.mazes.sort((a, b) => a.score - b.score); //sort by fitness
        for(let i = this.mazes.length - this.deathRate; i < this.mazes.length; i++){ > 
            this.mazes[i].score = -1;
        }
    } <
Sau khi loại bỏ các cá thể, mình cho 200 cá thể còn lại lai tạo với nhau. Lai tạo ở đây là mình lấy giá trị trung bình của cha và mẹ cho đứa con
crossOverAndMutation(far, mom){
        for (let i = 0; i < 8; i++) {
            for (let j = 0; j < 8; j++) {
                this.map[i][j] =  Math.floor((far.map[i][j] + mom.map[i][j])/2);                
            }
        }
    }
Cuối cùng là quá trình đột biến. Ở đây mình cho đột biến bằng cách: Nếu giá trị của cha và mẹ khác nhau (tức là chưa tối ưu) thì mình sẽ chắc chắn cho đột biến tại ô đó +-2. Còn nếu giá trị của cha và mẹ giống nhau ( có sự tối ưu) thì mình cho tỉ lệ đột biến tại ô đó là 1% (với giá trị đột biển +- 1).
crossOverAndMutation(far, mom){
        for (let i = 0; i < 8; i++) {
            for (let j = 0; j < 8; j++) {
                this.map[i][j] =  Math.floor((far.map[i][j] + mom.map[i][j])/2);
                if(far.map[i][j]!=mom.map[i][j]){
                    let randNum = Math.floor(Math.random() * 4) ;
                    if(randNum%2==0){
                        this.map[i][j] +=2;
                    } else {
                        this.map[i][j] -= 2;
                    }
                } else {
                    let randNum = Math.floor(Math.random() * 100)
                    if(randNum===51){
                        this.map[i][j] +=1;
                    } else if(randNum===52){
                        this.map[i][j] -=1;
                    }
                }
                if(this.map[i][j]<=0){
                    this.map[i][j] =  1;
                }

            }
        }
    }
Quá trình chọn lọc tự nhiên, di truyền và đột biến cứ tiếp tục lặp đi lặp lại. Kết quả là chúng ta sẽ có được thế hệ sau, có bàn cờ giống với bàn cờ cần tìm nhất. Và khi xuất hiện một bàn cờ cần tìm (tức lúc này sai số = 0), thì chúng ta sẽ dừng lại.
while(true){
if(geneticAlgorithm.mazes[0].score == 0) {
                return;
            }
            geneticAlgorithm.selection();            
            geneticAlgorithm.crossOverAndMutation();
}
Tất cả code của ứng dụng này mình push hết lên đây rồi. Các bạn có thể lấy về chạy thử nhé.
Share:

Thứ Tư, 25 tháng 3, 2020

Tại sao HTTPs bảo mật?

 Hey yo mọi người, chào mừng mọi người đến với series bài học thứ 2 của mình sau series về image classification. Ở series này, chúng ta sẽ cùng nhau đi qua các khái niệm căn bản để tìm hiểu tại sao HTTPs lại bảo mật nhé.

Bài 1: Tìm hiểu về symmetric và asymmetric encryption
Bài 2: Thuật toán mã hóa bất đối xứng RSA
Bài 3: Public key và private key
Bài 4: Digital certificate và certificate authority
Bài 5: SSL/TLS và HTTPs
Series rất dễ đọc và nắm bắt. Mình mong qua series này, các bạn có thể thu lại cho bản thân mình những kiến thức bổ ích nhé.
Share:

Thứ Ba, 24 tháng 3, 2020

SSL/TLS và HTTPS

Nếu là dân công nghệ thông tin, chắc hẳn bạn cũng biết HTTPS bảo mật hơn HTTP. Nhưng có bao giờ bạn tự hỏi tại sao lại như vậy không? Sau khi cùng nhau đi qua những kiến thức về asymmetric encrypted, Certificate Authority thì bài này sẽ kết hợp chúng lại để giải thích cho bạn biết được tại sao HTTPs lại bảo mật nhé.

SSL là gì?

SSL viết tắt của từ Secure sockets layer, nói cho đơn giản thì nó là một chuẩn bảo mật khi giao tiếp giữa client và server. TLS cũng y hệt như SSL, chỉ có điều nó là bản nâng cấp cao hơn.
Vậy SSL/TLS liên quan gì đến sự bảo mật của HTTPs? Đơn giản là HTTPs sử dụng SSL/TLS để bảo mật dữ liệu khi client và server giao tiếp với nhau. Và để hiểu cơ chế bảo mật này hoạt động ra sao, chúng ta sẽ đi tới 1 khái niệm nữa có tên gọi là: SSL Handshake.

SSL handshake


Bước 1: bạn đăng nhập vào máy chủ
Bước 2: khi bạn đăng nhập vào 1 máy chủ, máy chủ sẽ trả về cho bạn 1 cái Certificate. Tất nhiên certificate này được chứng nhận bởi Certificate Authority rồi. Và để hiểu hơn về khái niệm Digital Certificate này, bạn nên quay về đọc bài này.
Bước 3: Browser của bạn sẽ tự động kiểm tra xem, cái certificate của server trả về có đúng hay không. Việc xác thực này là nhờ vào cái CA Certificate mình đã nói ở bài trước.
Bước 4: Sau khi xác thực được certificate của server trả về là chính xác, thì bạn sẽ lấy cái public key đính kèm trong certificate đó ra để sử dụng. Public key này là 1 cái chìa mã hóa (encrypt key). Bạn dùng cái encrypt key này để mã hóa public key của máy bạn.
Bước 5: bạn gửi cái public key đã được mã hóa của bạn qua cho server
Bước 6: Server sẽ dùng private key của server để mã hóa dữ liệu, từ đó lấy được public key của bạn. Public key của bạn cũng là một cái encrypt key.
Bước 7: Server dùng public key của bạn để mã hóa dữ liệu trả về.
Bước 8: Server send dữ liệu đã được mã hóa về cho bạn
Bước 9: bạn dùng private key của bạn để mã hóa dữ liệu trả về.
Sau quá trình ssl handshake hoàn tất, bạn đã có được public key của server, và server cũng có được public key của bạn. Bây giờ tất cả thông tin trao đổi giữa bạn và server đều được mã hóa và bảo mật.
Ví dụ bạn muốn gửi cho server thông điệp: "cuonglv1109". Thì bạn sẽ dùng public key của server để mã hóa rồi gửi.
Server là người duy nhất có thể mã hóa được dữ liệu này.
Server gửi lại cho bạn thông điệp: "hết series https rồi" bằng cách mã hóa bằng public key của bạn.
Cũng chỉ có bạn là người có thể đọc được thông điệp này.

Share:

Thứ Hai, 16 tháng 3, 2020

Digital Certificate and Certificate Authority

Digital certificate và certificate authority là gì?

Certificate dịch ra là chứng chỉ, Digital là số hóa. Vậy digital certificate là chứng chỉ số. Hừm, vậy chứng chỉ số là gì?
Giống như con người chúng ta, chứng minh thư là thứ dùng để xác định danh tính, thì 1 trang web (server) sử dụng digital certificate để chứng minh được thân phận của mình. Giả sử chúng ta đi vào bar để quẩy chẳng hạn. Nhân viên bảo vệ thấy mặt còn non quá nên không cho vào vì sợ không đủ 18 tuổi. Vậy thì để chứng minh bản thân đã đủ tuổi đi bay, ta chỉ cần show chứng minh thư ra là đủ (dạo này người ta chuyển qua xài thẻ căn cước hết rôi nhỉ )


Vấn đề là khi ta đưa chứng minh thư ra, làm thế nào để bảo vệ biết cái chứng minh thư đó không phải là hàng giả mạo. Đôi khi chúng ta tự làm 1 cái giấy chứng minh giả thì sao nhỉ? À, trên chứng minh thư có con dấu của công an. Vậy con dấu của công an này chính là thứ đảm bảo cho chứng minh thư của chúng ta là hàng thật. Và tất nhiên, bảo vệ sẽ vui vẻ cho chúng ta vào múa quạt đi bay.

Với chứng minh thư là vậy, thế còn digital certificate thì sao? Cũng tương tự như thế, một trang web muốn chứng minh danh phận bản thân thì phải xài digital certificate như là chứng minh thư. Và người đứng ra bảo đảm cái digital certificate này không phải hàng giả chính là Certificate Authority (CA).

Quy trình tạo Digital certificate

Giống y hệt quá trình làm chứng minh thư, bạn phải cung cấp ảnh, tên, tuổi, địa chỉ cho công an. Sau đó công an sẽ in ra 1 cái thẻ rồi đóng dấu lên vậy là bạn đã có chứng minh thư.
Digital certificate (DC) cũng làm y hệt. Muốn tạo ra 1 cái DC thì bạn phải cung cấp 1 cái public key cho CA, và sau đó, CA sẽ tạo ra 1 cái file và mã hóa bằng private key của CA. (nếu bạn chưa hiểu 2 khái niệm public key và private key thì quay lại đọc bài này đã)

Ở đây, Public key mà bạn đưa cho CA là encrypt key của server bạn.

Xác thực DC là thật như thế nào?

Bây giờ một người nào đó muốn xác thưc DC của bạn là thật, thì họ làm như thế nào? Thực ra, các browser hiện tại đều có thể xác thực được DC đấy.
 Khi bạn install 1 browser trên máy thì browser này đã có cài sẵn những CA Certificate rồi. Những Certificate này là những certificate của những CA nổi tiếng và phổ biến. Và những certificate này cũng có tác dụng như những public key của CA, có khả năng mã hóa được những DC do CA đó mã hóa.

Vậy thì khi ai đó nhận được DC của bạn, họ chỉ cần lấy CA Certificate có sẵn trong browser và mã hóa DC bạn đưa. Như vậy là đã chứng minh được DC của bạn là hàng xịn rồi.

Share:

Thứ Ba, 3 tháng 3, 2020

Public key và Private key

 Hôm nay chúng ta sẽ đi vào tìm hiểu 2 khái niệm rất phổ biến trong mã hóa thông tin đó là : Public key và private key.
 Quay trở lại với bài toán nhận 100 bức thư từ 100 người khác nhau mà mình đã nói trong bài này.

 Bạn muốn nhận 100 bức thư từ 100 người khác nhau và không muốn bất cứ ai có thể đọc được những bức thư đó. Điều bạn có thể làm là gửi những chìa khóa mã hóa cho 100 người, và chỉ duy nhất bạn có chìa giải mã.
Trong trường hợp này, những chìa khóa mà bạn gửi cho mọi người, tức là phổ biến ra cho những người khác giữ gọi là public key.
Public key là chìa khóa được phân bố rộng rãi cho mọi người sử dụng
Public key có thể là chìa khóa mã hóa, cũng có thể là chìa khóa giải mã, tùy vào tình huống bài toán bạn giải quyết.
Chiếc chìa khóa giải mã trong ví dụ ở trên, chỉ có một mình bạn giữ và bất cứ ai cũng không được đụng tới, nó gọi là private key.

Private key là chìa khóa không được phân phối cho những người khác mà được giữ bảo mật.
Private key thì ngược lại với public key. Nếu public key là chìa khóa mã hóa thì private key sẽ là chìa khóa giải mã. Còn nếu public key dùng để giải mã thì private key dùng để mã hóa.
Share:

Chủ Nhật, 23 tháng 2, 2020

Thuật toán mã hóa bất đối xứng RSA

Trong bài này, chúng ta đã được tìm hiểu symmetric encryption là gì, asymmetric encryption là gì rồi. Nhưng chúng ta vẫn chưa biết được, làm thế nào để người ta có thể tạo ra bộ key mã hóa và giải mã.
Trong bài hôm nay, mình sẽ giới thiệu cho các bạn 1 trong những thuật toán asymmetric được sử dụng để tạo ra cặp key mã hóa và giải mã. Đó chính là RSA Algorithm.
 Rivest–Shamir–Adleman (RSA) là một thuật toán mã hóa bất đối xứng. Sỡ dĩ nó có tên như vậy là vì nó được ghép từ tên của 3 người tác giả.

RSA hoạt động như thế nào?

 RSA hoạt động dựa vào việc tìm kiếm 5 con số quan trọng: p ,q , N, ed. Để tìm được 5 con số này, bạn cần thực hiện các bước sau:
Bước 1: chọn ra 2 con số nguyên tố tùy ý. 2 con số này chính là p và q. Ví dụ mình chọn p = 2 và q = 7

Bước 2: Tìm N theo công thức: N = p*q . Lúc này, ta có N = 2*7 = 14.

Bước 3: Tính $\phi(N)$ . $\phi(N)$ là hàm phi. Hàm phi của một số nguyên dương N là số các số nguyên dương nhỏ hơn N và là sô nguyên tố cùng nhau với N.Hai số được gọi là số nguyên tố cùng nhau khi mà chúng có ước số chung lớn nhất là 1.
Ví dụ: $\phi(14)=6$ vì từ 1 đến 13, ta có các số 1, 3, 5, 7, 9, 11, 13 là các số nguyên tố cùng nhau với 14. Và số lượng các số này = 6.

Nhưng thực ra, người ta đã chứng minh được một công thức đơn giản hơn để tìm $\phi(N)$, đó là:
$\phi(N)=(p-1)(q-1)$

Bước 4: Tìm số e. Số e là số được tìm sao cho thõa mãn:
1 < e <$\phi(N)$
e là số nguyên tố cùng nhau với N
e là số nguyên tố cùng nhau với $\phi(N)$
Vậy ta có e = 5

Bước 5: tìm d sao cho thõa mãn công thức:
$de(mod\phi(N))=1$
Theo công thức trên, ta có : d*5mod6=1 . Vậy ta có d có thể là 5, 11, 17 ... Ở đây mình chọn d = 11.

Vậy là ta đã tìm được 5 con số quan trọng của thuật toán RSA. Từ 5 con số này, ta sẽ tạo ra được 2 key. Một key dùng để mã hóa (encrypt key) và một key dùng để giải mã (decrypt key).
Encrypt key được tạo nên bởi cặp số (e,N) . Tức là encrypt key = (5,14). Decrypt key lại được tạo nên bởi cặp số (d,N). decrypt key = (11,14).

Việc dùng 2 cặp key này để mã hóa và giải mã như thế nào. Bạn hãy xem lại phần mã hóa bất đối xứng mình đã viết trong bài này nhé.

Tại sao RSA bảo mật?

Theo như cách hoạt động của encrypt key và decrypt key, thì 1 trong 2 sẽ là public key ( khái niệm public key và private key mình đã viết trong bài này). Có nghĩa là, hacker có thể biết được giá trị N.
Bạn hãy để ý, toàn bộ quá trình tạo nên encrypt key và decrypt key đều từ 2 con số q và p. Mà N=p*q. Vậy thì hacker chẳng phải dễ dàng đoán ra được p và q hay sao?????
Ví dụ N =14. Hacker có thể dễ dàng đoán ra được cặp số ngyên tố 2 và 7. Và từ đây, hacker có thể dễ dàng tái tạo được 2 key theo như 5 bước ở trên. Vậy tại sao RSA lại bảo mật được???

Lí do rất đơn giản. Trong thực tế, khi người ta chọn 2 số q và p, thì 2 số này là 2 con số cực kì lớn. Do đó, N cũng là 1 con số siêu to khổng lồ. Và để tìm ra được 2 số nhân với nhau để cho ra N, máy tính phải mất rất rất nhiều thời gian để có thể tìm ra được. Đây là lí do khiến cho hacker không thể truy ra được 2 key mặc dù đã có sẳn N.
Share:

Thứ Bảy, 22 tháng 2, 2020

Tìm hiểu về symmetric và asymmetric encryption

 Nếu là một lập trình viên, chắc hẳn bạn cũng từng nghe qua về mã hóa (encryption). Mã hóa là quá trình bạn chuyển 1 loại dữ liệu dễ đọc nào đó thành 1 loại dữ liệu đọc vào chả hiểu cái mẹ gì cả.

 Tại sao cần phải mã hóa dữ liệu? Lí do đơn giản là bạn không muốn người khác đọc được. Giống như tình huống bạn thích 1 đứa nào đó trong lớp và muốn gửi thư tình cho người đó. Nhưng để thư tình tới được tay người thương, thì phải được chuyển qua tay những đứa khác. Và để không ai ngoài người thương đọc được thư, thì bạn sẽ mã hóa đó bằng 1 cách nào đó. Và người thương của bạn cũng biết cách để giải mã, do đó sẽ chỉ có người đó đọc được nội dung thư mà thôi.

Symmetric Encryption ( mã hóa đối xứng )


Nếu như quá trình mã hóa và giải mã cùng sử dụng chung một key(chìa khóa), thì đây là symmetric encryption


Ví dụ: nội dung bạn muốn mã hóa là số 2. Bạn sẽ mã hóa bằng cách: lấy 2 công với 3, sau đó lấy kết quả nhân với 5.
Ta sẽ có (2+3)*5 = 25. Vậy số 2 đã được mã hóa thành số 25. Và key để mã hóa ở đây là (3,5).

Để giải mã, ta chỉ cần sử dụng lại key (3,5) để giải mã bằng cách: lấy 25 chia cho 5 và trừ đi 3: 25/5 -3 =2.

 Nhưng, với cách mã hóa như thế này nảy sinh ra 1 vấn đề. Hãy nghĩ tới trường hợp, bạn muốn nhận thông điệp từ 100 người khác nhau. Vậy để 100 người này mã hóa được nội dung trước khi gửi đi thì bạn phải gửi 100 cái key cho 100 người đó.

 Và việc có quá nhiều người giữ key sẽ dẫn đến việc thiếu bảo mật, vì có thể 1 người nào đó bị lộ key, thì người khác cũng có thể giải mã và đọc được nội dung từ 100 người này.

Vậy nên người ta mới nghĩ tới 1 loại mã hóa khác, đó là Asymmetric Encryption

Asymmetric Encryption (mã hóa bất đối xứng)

Asymmetric là khi quá trình mã hóa và giải mã dùng các key khác nhau


Giả sử ta có 1 key để mã hóa là : (5,14) . Nội dung để mã hóa là số 2. Để mã hóa, ta làm theo trình tự sau: lấy 2 mũ 5, và chia lấy dư cho 14.

Với cách mã hóa trên, ta đã có được nội dung sau khi mã hóa là : 4 . Nhưng nếu bạn cũng sử dụng key (5,14) để giải mã, thì sẽ không được. Vì với phép tính chia lấy dư thì không có cách nào để truy ngược lại được cả.

Để giải mã được theo cách này, ta phải dùng 1 chìa khóa khác. Chìa giải mã của chúng ta là (11,14). Và chúng ta sẽ giải mã theo trình tự sau: lấy 4 mũ 11 và chia lấy dư cho 14.

Kết quả giải mã của chúng ta là 2. Chính xác!!!
Và quay lại với bài toán trên, nếu bạn muốn nhận tin nhắn từ 100 người khác nhau, bạn chỉ cần gửi 100 chìa khóa mã hóa cho 100 người đó. Nếu như có ai ăn cắp được key mã hóa, họ cũng không thể giải mã. Vì chỉ có bạn mới là người cầm key giải mã.
Do đó, phương pháp asymmetric bảo mật hơn rất nhiều so với symmetric.

Vậy làm thế nào để tạo ra được 2 chìa khóa mã hóa và giải mã như trên. Rất may, chúng ta đã được thừa hướng những thuật toán vĩ đại được phát minh từ trước. Ví dụ những thuật toán như RSA (mình đã viết ở đây), DSA, ECC, Diffie Hellman... Để tạo ra được 2 chìa khóa kì diệu trên, chỉ cần áp dụng theo những thành tựu này là chúng ta sẽ thành công.

Share:
Được tạo bởi Blogger.