Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 82 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
82
Dung lượng
1,43 MB
Nội dung
VIỆN ĐẠI HỌC MỞ HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN Nguyễn Văn Linh TÌM HIỂU SƠ ĐỒ CHỮ KÝ ĐIỆN TỬ ELGAMAL VÀ LẬP TRÌNH ỨNG DỤNG ĐỂ XÁC THỰC VIỆC TRAO ĐỔI DỮ LIỆU QUA MẠNG Chuyên ngành: Tin học ứng dụng Người hướng dẫn: Ths Đặng Văn Cường ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Hà Nội – năm 2012 MỤC LỤC MỤC LỤC .1 MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN VỀ CHỮ KÝ SỐ .4 1.1 Giới thiệu chung chữ ký số 1.2 Một số vấn đề toán học 1.2.1 Thuật toán Euclid 1.2.2 Thuật toán Euclid mở rộng .7 1.2.3 Nhóm Cyclic 1.2.4 Một số định lý quan trọng khác 10 1.3 Một số thuật tốn tính tốn số lớn 10 1.3.1 Phép cộng 11 1.3.2 Phép trừ 12 1.3.3 Phép so sánh 13 1.3.4 Phép dịch trái 14 1.3.5 Phép dịch phải 15 1.3.6 Phép nhân số lớn với số nhỏ 15 1.3.7 Phép nhân .17 1.3.8 Phép chia 18 1.3.9 Thuật tốn bình phương nhân 19 CHƯƠNG 2: SƠ ĐỒ CHỮ KÝ ELGAMAL 21 2.1 Bài toàn Logarithm rời rạc ZP 21 2.2 Sơ đồ chữ ký Elgamal 27 2.3 Độ mật sơ đồ chữ ký Elgamal 28 2.4 Chuẩn chữ ký số 32 CHƯƠNG 3:XÂY DỰNG CHỮ KÝ SỐ ELGAMAL 37 3.1 Hàm Hask tóm lược thơng báo .37 3.2 Mơ tả chương trình chữ ký số Elgamal 38 3.3 Cài đặt hướng dẫn sử dụng chương trình .39 KẾT LUẬN 41 Phụ lục 42 Hướng dẫn cài máy ảo JRE 42 Mã nguồn lớp SoLon .44 Mã nguồn lớp Toan .46 Mã nguồn lớp DocFile 53 Mã nguồn lớp GhiFile 54 Mã nguồn lớp Hash .55 Mã nguồn lớp Elgamal 56 Mã nguồn lớp FileObj 61 Code lớp GUI 62 TÀI LIỆU THAM KHẢO 81 MỞ ĐẦU Khi công nghệ thông tin ngày thay người công việc chúng ta, việc đảm bảo an tồn xác thực nguồn gốc thông tin thiết bị số ngày trở nên quan trọng, cấp thiết, đặc biệt với Việt Nam, nước thời kỳ đại hóa Vì vậy, tơi chọn trình bày sơ đồ chữ ký số Elgamal đề tài đồ án tốt nghiệp Tơi xin trân trọng cảm ơn giúp đỡ thầy cô khoa Công nghệ thông tin – Viện Đại học Mở Hà Nội, bạn bè, gia đình đặc biệt thầy Thạc sĩ Đặng Văn Cường hướng dẫn giúp đỡ tơi hồn thành đề tài nghiên cứu Ngoài phần mở đầu, kết luận, phụ lục tài liệu tham khảo, đồ án gồm chương: - Chương 1: Tổng quan chữ ký số Chương giới thiệu chữ ký số, so sánh với chữ ký thường, vấn đề toán học thuật toán sử dụng - Chương 2: Sơ đồ chữ ký Elgamal Chương giới thiệu chi tiết sơ đồ Elgamal, toán logarithm rời rạc – sở sơ đồ ký, độ mật sơ đồ chuẩn chữ ký số - biến thể Elgamal - Chương 3: Xây dựng chữ ký số Elgamal Chương nói lập trình mơ cho sơ đồ ký số Sau ta vào chi tiết chương đề tài CHƯƠNG 1: TỔNG QUAN VỀ CHỮ KÝ SỐ 1.1 Giới thiệu chung chữ ký số Như biết, chữ ký viết tay “thường lệ” gắn với tài liệu dùng để người ký Chữ ký sử dụng hàng ngày viết thư, ký hợp đồng… Ở tìm hiểu loại chữ ký hồn tồn khác chữ ký số Nó phương pháp ký thơng báo lưu dạng điện tử thơng báo ký truyền mạng máy tính Chữ ký tay chữ ký số dù có chung nhiệm vụ ký có khác biệt chúng - Thứ nhất, việc ký tài liệu: với chữ ký tay chữ ký phận vật lý tài liệu ký Tuy nhiên, chữ ký số không gắn với thông báo ký theo kiểu vật lý mà gắn với thơng báo theo kiểu logic, thuật tốn dùng phải “trói” chữ ký với thơng báo theo cách - Thứ hai, việc kiểm tra: chữ ký tay kiểm tra cách so sánh với khác (những chữ ký xác thực) Ví dụ, người ký séc mua hàng, người bán hàng phải so sánh với chữ ký nằm sau thẻ tín dụng để kiểm tra Tuy nhiên, phương pháp không an tồn tương đối dễ dàng làm giả chữ ký người khác bị chối bỏ người ký Khác với chữ ký tay, chữ ký số kiểm tra cách dùng thuật tốn kiểm tra cơng khai biết Vì người kiểm tra chữ ký số, việc sử dụng sơ đồ (lược đồ) ký an toàn ngăn chặn khả làm giả chối bỏ - Điều khác chữ ký tay chữ ký số “bản sao” thông báo số ký đồng với gốc Trong đó, tài liệu giấy ký thường khác với gốc Điều có nghĩa phải cẩn thận để ngăn chặn việc thơng báo ký số bị sử dụng lại Ví dụ, Alice ký thông báo số cho Bob rút 1000$ từ tài khoản ngân hàng mình, Alice muốn Bob làm điều lần Do đó, thơng báo phải chứa thơng tin để ngăn chặn Bob làm lại việc nhiều lần Sơ đồ chữ ký số gồm hai thành phần: thuật toán ký thuật tốn kiểm tra Alice ký thơng báo x nhờ thuật tốn (bí mật) Sig Chữ ký thu Sig(x) sau kiểm tra thuật tốn kiểm tra cơng khai Ver Khi cho cặp (x,y) thuật toán kiểm tra trả lời “đúng” “sai” phụ thuộc vào việc ký có đích thực không? Định nghĩa sơ đồ chữ ký điện tử Là 5(P, A, K, S, V) thỏa mãn điều kiện đây: 1) P tập hữu hạn điện (thơng điệp, rõ) 2) A tập hữu hạn chữ ký 3) K tập khơng gian khóa (tập hữu hạn khóa có thể) 4) Với khóa k K tồn thuật toán ký Sigk S thuật toán xác minh Verk V Mỗi Sigk: PA Verk: P×A{TRUE,FALSE} hàm cho điện x P chữ ký y A thỏa mãn phương trình đây: 𝑉𝑒𝑟 𝑥, 𝑦 = 𝑇𝑅𝑈𝐸 𝐹𝐴𝐿𝑆𝐸 𝑛ế𝑢 𝑛ế𝑢 𝑦 = 𝑠𝑖𝑔 𝑥 𝑦 ≠ 𝑠𝑖𝑔 𝑥 Yêu cầu: Với k K, hàm Sigk Verk hàm thời gian đa thức Verk hàm công khai, Sigk hàm bí mật tránh trường hợp Oscar giả mạo chữ ký Alice để ký thơng báo Với x Alice tính chữ ký y cho: Ver(x,y) = TRUE Sơ đồ chữ ký phải an tồn Bởi người thám mã Oscar kiểm tra tất khả chữ ký y nhờ thuật toán kiểm tra cơng khai Ver() tìm chữ ký Do đó, đủ thời gian cần thiết Oscar giả mạo chữ ký Alice Vì vậy, mục đích tìm sơ đồ chữ ký cho Oscar không đủ thời gian thực tế để thử hết trường hợp 1.2 Một số vấn đề toán học 1.2.1 Thuật toán Euclid Thuật toán Euclid giải thuật giúp tính ước số chung lớn (UCLN) hai số cách hiệu Nhà toán học Hy Lạp cổ Euclid đưa thuật toán sách tốn tiếng Elements vào khoảng năm 300 trước Cơng Ngun Trước tìm hiểu thuật tốn ta xét ví dụ: tính UCLN 33 213 Trước hết phân tích 213 theo 33 ta có = Nhận xét: Bất kỳ số chia hết 213 33 bị chia hết 213-33*6=15 Tương tự, số chia hết 33 15 chia hết 33*6+15=213 UCLN(33,213)=UCLN(33,15) Bài tốn trở thành tìm UCLN 33 15 Lặp lại quy trình khơng cịn số dư: 33 = 15*2 + (15 dùng cho vòng lặp kế) 15=3*5 (khơng cịn dư, kết thúc, nhận làm kết quả) Cuối ta có : = UCLN(33,15) = UCLN(33,213) Bổ đề: Giả sử a = bq +r với a, b, q, r số nguyên, ta có: 𝑈𝐶𝐿𝑁 𝑎, 𝑏 = 𝑏 𝑈𝐶𝐿𝑁 𝑏, 𝑟 𝑛ế𝑢 𝑟 = 𝑛ế𝑢 𝑟 ≠ Mã giả: UCLN(a,b: nguyên dương) BEGIN While b>0 begin x:=a mod b a:=b b:=x end return x END 1.2.2 Thuật toán Euclid mở rộng Thuật toán Euclid mở rộng sử dụng để giải phương trình vơ định ngun (cịn gọi phương trình Đi-ơ-phăng) ax + by = c Trong a, b, c số nguyên, x, y ẩn số nguyên Điều kiện để phương trình có nghiệm (ngun) UCLN(a,b) ước c Khẳng định dựa mệnh đề sau: ế = , , = Giải thuật Euclid mở rộng kết hợp trình tìm UCLN(a,b) thuật tốn Euclid với việc tìm cặp số x, y thỏa mãn phương trình Đi-ơ-phăng Giả sử cho hai số tự nhiên a, b với a>b>0 Đặt r0 = a, r1=b, chia r0 cho r1 số dư r2 thương nguyên q1 Nếu r2 = dừng lại, r2 ≠ chia r1 cho r2 số dư r3 thương nguyên q2… Vì dãy ri giảm thực nên sau hữu hạn bước ta có số dư rm = r0 = q1r1 + r2, 0< r2< r1 r1 = q2r2 + r3, 0< r3< r2 … rm-1 = qmrm + rm+1, 0< rm+1< rm rm = qm+1rm+1 số dư cuối khác rm+1 = d Bài toán đặt tìm x, y cho ax + by = rm+1=d Để làm điều này, ta tìm x, y theo cơng thức truy hồi, nghĩa tìm xi, yi cho axi + byi = ri với i = 0, 1… Ta có: a.1 + b.0 = a = r0 a.0 + b.1 = b = r1 nghĩa x0 = 1, x1 = y0 = 0, y1 = (1) Tổng quát: axi + byi = ri với i = 0, 1… axi+1 + byi+1 = ri+1 với i = 0, 1… Khi từ ri = qi+1ri+1 + ri+2 suy ri – qi+1ri+1 = ri+2 (axi + byi) – qi+1(axi+1 + byi+1) = ri+2 a(xi – xi+1 qi+1) + b(yi – qi+1yi+1) = ri+2 từ đó, chọn xi+2 = xi – xi+1 qi+1 (2) yi+2 = yi – qi+1yi+1 (3) Khi i = m – ta có xm+1 ym+1 Các công thức (1), (2), (3) công thức truy hồi để tính x, y Ở ta nghiên cứu thuật tốn Euclid mở rộng để tìm phần tử nghịch đảo theo modulo Định lý 1.1 (định lý tồn phần tử nghịch đảo): UCLN (a,m) = tồn phần tử b cho UCLN(b,m) = 1, phần tử nghịch đảo a, nghĩa thỏa mãn: ab = (ab) mod m =1 Mã giả: Procedure Euclid_Extended (a,m) int y0=0,y1:=1; While a>0 { r:= m mod a if r=0 then Break q:= m div a y:= y0-y1*q m:=a a:=r y0:=y1 y1:=y } If a>1 Then Return "A không khả nghịch theo modulo m" else Return " Nghịch đảo modulo m a y" *Nếu y>0 y kết a-1 mod m *Nếu y 0; i ) { c = addedFigures[i - 1]; if (Character.isDigit(c) || c == '.') { super.insertString(offs, new Character(c).toString(), a); } } } }; private void jbtKyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtKyActionPerformed // TODO add your handling code here: File fileGoc = new File(jTextFieldPath.getText()); String tenFileGoc = fileGoc.getName(); String splitTenFileGoc[] = tenFileGoc.split("\\."); String duongDanGoc = fileGoc.getAbsolutePath(); String thuMucGoc = duongDanGoc.substring(0, duongDanGoc.lastIndexOf(tenFileGoc)); String tenFileKy = ""; if (splitTenFileGoc.length > 1) { for (int i = 0; i < splitTenFileGoc.length - 1; i++) { tenFileKy += splitTenFileGoc[i]; tenFileKy += "_Ky." + splitTenFileGoc[splitTenFileGoc.length - 1]; } } else { tenFileKy = splitTenFileGoc[0] + "_Ky." + splitTenFileGoc[splitTenFileGoc.length]; } //sử dụng đường dẫn lưu trữ if (jtxtDuongDan.getText().length() == 0) { tenFileKy = thuMucGoc + tenFileKy; } else { tenFileKy = jtxtDuongDan.getText() + "\\" + tenFileKy; } File fileKy = new File(tenFileKy); try { fileKy.createNewFile(); if (jrbtnMacDinh.isSelected()) { new Elgamal().ky(fileGoc, fileKy, null); } else { char[] giaTri = jtxtGiatri.getPassword(); String value = ""; for (int i = 0; i < giaTri.length; i++) { value += giaTri[i]; 74 } new Elgamal().ky(fileGoc, fileKy, SoLon.parseInt(Integer.parseInt(value))); } JOptionPane.showMessageDialog(rootPane, "Ký thành công!!!\n" + fileKy.getAbsolutePath(), "", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } catch (Exception ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_jbtKyActionPerformed private void jdlgCaiDatWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_jdlgCaiDatWindowClosing // TODO add your handling code here: File config = new File("config.cfg"); try { config.createNewFile(); FileObj fo; if (jrbtnMacDinh.isSelected()) { fo = new FileObj(true, -1, jtxtDuongDan.getText()); } else { char[] giaTri = jtxtGiatri.getPassword(); String value = ""; for (int i = 0; i < giaTri.length; i++) { value += giaTri[i]; } fo = new FileObj(false, Integer.parseInt(value), jtxtDuongDan.getText()); } FileOutputStream fos = new FileOutputStream(config); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(fo); } catch (IOException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_jdlgCaiDatWindowClosing private void jbtnBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnBrowseActionPerformed // TODO add your handling code here: int returnValue = jFileChooser1.showOpenDialog(jdlgCaiDat); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = jFileChooser1.getSelectedFile(); jtxtDuongDan.setText(selectedFile.getAbsolutePath()); } }//GEN-LAST:event_jbtnBrowseActionPerformed private void jdlgCaiDatWindowOpened(java.awt.event.WindowEvent {//GEN-FIRST:event_jdlgCaiDatWindowOpened evt) 75 ObjectInputStream ois; // TODO add your handling code here: File file = new File("config.cfg"); if (file.exists()) { try { FileInputStream fis = new FileInputStream(file); ois = new ObjectInputStream(fis); FileObj fo = (FileObj) ois.readObject(); jrbtnMacDinh.setSelected(fo.isDefaultValue()); jrbtnTuyChinh.setSelected(!fo.isDefaultValue()); if (!fo.isDefaultValue()) { jtxtGiatri.setText(fo.getSecretKey() + ""); } jtxtDuongDan.setText(fo.getDefaultDir()); fis.close(); ois.close(); } catch (ClassNotFoundException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } catch (FileNotFoundException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); } } else { jrbtnMacDinh.setSelected(true); } }//GEN-LAST:event_jdlgCaiDatWindowOpened private void jrbtnMacDinhStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jrbtnMacDinhStateChanged // TODO add your handling code here: jtxtGiatri.setText(null); jtxtGiatri.setEnabled(!jrbtnMacDinh.isSelected()); }//GEN-LAST:event_jrbtnMacDinhStateChanged private void jtxtGiatriFocusLost(java.awt.event.FocusEvent {//GEN-FIRST:event_jtxtGiatriFocusLost // TODO add your handling code here: if (jtxtGiatri.getDocument().getLength() == 0) { jrbtnMacDinh.setSelected(true); } else { char[] giaTri = jtxtGiatri.getPassword(); String value = ""; for (int i = 0; i < giaTri.length; i++) { value += giaTri[i]; } try { SoLon khoaBiMat SoLon.parseInt(Integer.parseInt(value)); Toan toan = new Toan(); SoLon mot = new SoLon(new int[]{1}); evt) = 76 SoLon nguyenTo_1 = toan.tru(new Elgamal().getNg_to(), mot); if (!toan.nguyenToCungNhau(khoaBiMat, nguyenTo_1)) { { khoaBiMat = toan.cong(khoaBiMat, mot); } while (!toan.nguyenToCungNhau(khoaBiMat, nguyenTo_1)); JOptionPane.showMessageDialog(rootPane, "Số " + value + " dùng để làm khóa bí mật.\nHãy thử với giá trị " + toan.converToInt(khoaBiMat), "Cảnh báo", JOptionPane.WARNING_MESSAGE); jtxtGiatri.setText(""); jtxtGiatri.requestFocus(true); } } catch (Exception ex) { //Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex); } } }//GEN-LAST:event_jtxtGiatriFocusLost private void jrbtnTuyChinhStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jrbtnTuyChinhStateChanged // TODO add your handling code here: if (jrbtnTuyChinh.isSelected()) { jtxtGiatri.requestFocus(true); } }//GEN-LAST:event_jrbtnTuyChinhStateChanged private void jbtKiemtraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtKiemtraActionPerformed // TODO add your handling code here: File fileKy = new File(jTextFieldPath.getText()); boolean kiemTra = new Elgamal().kiemTra(fileKy); JOptionPane.showMessageDialog(rootPane, kiemTra ? "Xác nhận file ký hợp lệ!!!" : "File ký không hợp lệ!!!", "Xác nhận chữ ký", kiemTra ? JOptionPane.INFORMATION_MESSAGE : JOptionPane.ERROR_MESSAGE); }//GEN-LAST:event_jbtKiemtraActionPerformed private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel9MouseClicked // TODO add your handling code here: Desktop desktop = Desktop.getDesktop(); try { desktop.mail(new URI("mailto", "linh08b6@gmail.com", null)); } catch (IOException ex) { } catch (URISyntaxException ex) { } }//GEN-LAST:event_jLabel9MouseClicked private void jmnThongtinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmnThongtinActionPerformed // TODO add your handling code here: }//GEN-LAST:event_jmnThongtinActionPerformed 77 private void jmnCaidatMenuKeyPressed(javax.swing.event.MenuKeyEvent evt) {//GEN-FIRST:event_jmnCaidatMenuKeyPressed // TODO add your handling code here: jmnCaidatMouseClicked(null); }//GEN-LAST:event_jmnCaidatMenuKeyPressed private void jmnThongtinMouseClicked(java.awt.event.MouseEvent {//GEN-FIRST:event_jmnThongtinMouseClicked // TODO add your handling code here: jdlgThongtin.setDefaultCloseOperation(DISPOSE_ON_CLOSE); jdlgThongtin.setVisible(true); }//GEN-LAST:event_jmnThongtinMouseClicked evt) private void jmnThongtinMenuKeyPressed(javax.swing.event.MenuKeyEvent evt) {//GEN-FIRST:event_jmnThongtinMenuKeyPressed // TODO add your handling code here: jmnThongtinMouseClicked(null); }//GEN-LAST:event_jmnThongtinMenuKeyPressed private void jLabel9MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel9MouseEntered // TODO add your handling code here: jLabel9.setFont(new Font("Times New Roman", Font.ITALIC, 13)); }//GEN-LAST:event_jLabel9MouseEntered private void jLabel9MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel9MouseExited // TODO add your handling code here: jLabel9.setFont(new Font("Times New Roman", Font.PLAIN, 13)); }//GEN-LAST:event_jLabel9MouseExited private void jdlgCaiDatWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_jdlgCaiDatWindowActivated // TODO add your handling code here: }//GEN-LAST:event_jdlgCaiDatWindowActivated /** * @param args the command line arguments */ public static void main(String args[]) { /* * Set the Nimbus look and feel */ // /* * If Nimbus (introduced in Java SE 6) is not available, stay with the * default look and feel For details see * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { 78 for (javax.swing.UIManager.LookAndFeelInfo javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { info : javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.log ging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.log ging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.log ging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.log ging.Level.SEVERE, null, ex); } // /* * Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new GUI().setVisible(true); } }); } // Variables declaration - not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JFileChooser jFileChooser1; private javax.swing.JFileChooser jFileChooser2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; 79 private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JTextField jTextFieldPath; private javax.swing.JButton jbtBrowse; private javax.swing.JButton jbtKiemtra; private javax.swing.JButton jbtKy; private javax.swing.JButton jbtnBrowse; private javax.swing.JDialog jdlgCaiDat; private javax.swing.JDialog jdlgThongtin; private javax.swing.JMenu jmnCaidat; private javax.swing.JMenu jmnThongtin; private javax.swing.JRadioButton jrbtnMacDinh; private javax.swing.JRadioButton jrbtnTuyChinh; private javax.swing.JTextField jtxtDuongDan; private javax.swing.JPasswordField jtxtGiatri; // End of variables declaration//GEN-END:variables } 80 TÀI LIỆU THAM KHẢO [1] Herbert S.Wilf, Algorithms and Complexity [2] Jonathan Katz, Digital Signatures [3] Hồng Xn Sính, Đại số đại cương, Giáo dục, 2005 [4] TS Lều Đức Tân, Sinh tham số cho hệ mật Elgamal 81