Sửa 3 lỗi lớn trong chương trình RSA

Hôm bữa tôi có mày mò code một cái tool mã hóa RSA đơn giản. Nhưng vì quá đơn giản mà thành ra tự hại mình :”))

Vấn đề 1

Bây giờ thì tôi cũng hiểu ra tại sao mà 4.2.2 Ví dụ RSA trang 67 trong cuốn “Bài giảng AN TOÀN VÀ BẢO MẬT THÔNG TIN” xuất bản tháng 6 năm 2008 lại lấy ví dụ “bản rõ M = 15“.

Đơn giản vì số ban đầu của chuỗi plain text không được phép lớn hơn N (N = p × q).

Thảo nào mà hôm bữa tới giờ tôi test trường hợp p = 17q = 11 thì khi đó N = 187. Kết quả mã hóa là hoàn toàn chính xác cũng như việc giải mã không có gì trục trặc.

comp.PNG

Vì tôi không dùng kiểu tự gán số cho các ký tự (như vậy sẽ rắc rối với các dấu câu) nên tôi lấy mã ASCII của nó ra xài cho nhanh. Nhưng hên là cái test case mà tôi dùng, dù là viết hoa hay viết thường, cũng đều trả về mã ASCII nhỏ hơn N! =))))

Khi thử với trường hợp số p và q nhỏ, như 11 và 3 thì N = 33. Lúc này câu chuyện khác hoàn toàn. Thế mới nói, làm một mình không có bóng hồng nào hỗ trợ động viên, cô độc vô bờ bến…

Sở dĩ tôi phát hiện ra được cái vấn đề này là nhờ nhớ lại cái list pet project mà tôi từng share trước đây. Trong đó may mắn sao có một cái ví dụ về RSA.

if (pt > n)
            throw new Exception();

Nếu mã ASCII của chuỗi ban đầu mà lớn hơn số N thì quăng ra thông báo lỗi.

Vấn đề 2

Thật buồn cười là khi đã biết dùng tới BigInteger rồi, mà tôi vẫn xài kiểu

BigInteger encrypt = BigInteger.Pow(c, dNum) % N;

haha… Cho đến khi phát hiện ra cái hàm ModPow đi kèm với BigInteger thì thấy quả thật bể học vô biên.

BigInteger encrypt = BigInteger.ModPow(c, dNum, N);

Vấn đề 3

Cái này thuộc về tư duy và cách mỗi người xài thôi. Tôi chọn cách dùng hàm ép kiểu để lấy ra mã ASCII của ký tự đó.

string plainText = “vo tinh thuong”;

foreach(char c in plainText){

Console.WriteLine((int)c + “|”);

}

Nhưng đồng thời tôi cũng biết thêm một cách nữa là dùng ASCIIEncoding.ASCII.GetBytes(plainText) để gán vào một mảng byte[ ].

byte[ ] plainByte = ASCIIEncoding.ASCII.GetBytes(plainText) ;

Nói chung vấn đề này tôi không biết code nào chạy nhanh hơn, nhưng tùy mỗi người mà chọn một cách khác nhau.

Code khi nào sửa hoàn thiện sẽ đưa lên Github cá nhân của tôi.

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com

Advertisements

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 )

Google+ photo

You are commenting using your Google+ 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 )

Connecting to %s