- Hàm tạo khóa
private void taoKhoa() {
//Tinh n=p*q n = p * q;
//Tính Phi(n)=(p-1)*(q-1) phi_n = (p - 1) * (q - 1);
//Tính e là một số ngẫu nhiên có giá trị 0< e <phi(n) và là số nguyên tố cùng nhau với Phi(n)
do {
Random rd = new Random(); e = rd.Next(2, phi_n);
}
while (!nguyenToCungNhau(e, phi_n)); txte.Text = Convert.ToString(e);
//Tính d d = 0;
int i = 2; while (((1 + i * phi_n) % e) != 0 || d <= 0) { i++; d = (1 + i * phi_n) / e; } } - Hashing MD5
o Input: chuỗi cần băm
o Output: mã băm
public string CreateMD5Hash(string input) {
try {
// Use input string to calculate MD5 hash
MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes =
System.Text.Encoding.ASCII.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes); // Convert the byte array to hexadecimal string StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++) {
sb.Append(hashBytes[i].ToString("X2"));
// To force the hex string to lower-case letters instead of // upper-case, use he following line instead:
// sb.Append(hashBytes[i].ToString("x2")); }
return sb.ToString(); }
catch { return null; } }
- Hàm mã hóa RSA
o Input: Chuỗi băm
try {
// Chuyen xau thanh ma Unicode int[] nguyen = new int[s.Length]; for (int i = 0; i < s.Length; i++) {
nguyen[i] = (int)s[i]; }
//Mảng a chứa các kí tự đã mã hóa int[] a = new int[nguyen.Length]; for (int i = 0; i < nguyen.Length; i++) {
a[i] = mod(nguyen[i], e, n); }
//Chuyển sang kiểu kí tự trong bảng mã Unicode string str = "";
for (int i = 0; i < nguyen.Length; i++) {
str = str + (char)a[i]; }
byte[] data = Encoding.Unicode.GetBytes(str); return Convert.ToBase64String(data);
}
catch { return null; } }
- Hàm giải mã RSA
o Input: Chuỗi mã hóa
o Output: Chuỗi được giải mã
public string GiaiMa(string s) {
try {
//Lấy mã Unicode của từng kí tự mã hóa string giaima =
Encoding.Unicode.GetString(Convert.FromBase64String(s)); int[] b = new int[giaima.Length];
for (int i = 0; i < giaima.Length; i++) {
b[i] = (int)giaima[i]; }
//Giải mã
int[] c = new int[b.Length]; for (int i = 0; i < c.Length; i++) {
c[i] = mod(b[i], d, n); }
string str = "";
for (int i = 0; i < c.Length; i++) {
str = str + (char)c[i]; }
return str; }
catch { return null; } }
KẾT LUẬN
Em đã cố gắng truyền tải những gì thu hoạch được về vấn đề mã hóa, áp dụng giải thuật RSA vào chữ ký điện tử, dựa vào cơ sở lý thuyết để viết một ứng dụng mô phỏng quá trình tạo chữ ký điện tử và kiểm tra tính hợp lệ của chữ ký điện tử. Tuy đã cố gắng nhưng do thời gian ngắn nên bài thu hoạch chỉ đáp ứng được cơ bản về mặt lý thuyết và sử dụng dụng ngôn ngữ C# để viết một ứng dụng nhỏ mô phỏng chữ ký điện tử. Nếu có thời gian nhiều hơn em tin mình sẽ làm tốt hơn nữa, phát triển lên để áp dụng vào thực tế đời sống.
TÀI LIỆU THAM KHẢO
1. Bài giảng môn học “Toán cho máy tính” – PGS.TS. Đỗ Văn Nhơn
2. Giáo trình “An toàn và bảo mật thông tin” – Trường ĐH Hàng Hải 2008
3. Trang web http://vi.wikipedia.org/wiki/RSA_(m%C3%A3_h%C3%B3a)
4. Trang web http://vi.wikipedia.org/wiki/L%C3%BD_thuy%E1%BA%BFt_m%C3%A3_h%C3%B3a %C3%A3_h%C3%B3a
5. Trang web http://vi.wikipedia.org/wiki/MD5
6. Trang web http://vi.wikipedia.org/wiki/Ch%E1%BB%AF_k%C3%BD_%C4%91i%E1%BB%87n_t%E1%BB%AD %E1%BB%87n_t%E1%BB%AD