1. Trang chủ
  2. » Tất cả

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

82 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 82
Dung lượng 3,11 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 MỚ ĐẦU .3 CHƯƠNG 1: TÒNG QUAN VÈ CHỮ KÝ SỐ 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 Euclidmỏ' rộng 1.2.3 Nhóm Cyclic 1.2.4 Một số định lý quan trọngkhá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 toán bình phu'OTig nhân 19 CHƯƠNG 2: sơ ĐÒ CHỮ KÝ ELGAMAL 21 2.1 Bài tồ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ẫncà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, thi việc đảm báo an toàn xác thực nguồn gốc cùa 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 trinh bày sơ đồ chừ ký so Elgamal đề tài đồ án tốt nghiệp cùa Tơi xin trân trọng càm ơn giúp đờ cùa 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ý so Chương giới thiệu chữ ký so, 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ở cùa SƯ đồ ký, độ mật cùa sơ đồ chuẩn chừ ký số - biến thể cúa Elgamal - Chương 3: Xây dựng chừ ký số Elgamal Chương nói lập trình mơ phóng cho sơ đồ ký số Sau ta SC vào chi tiết chương cùa đề 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 đế chi 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 bán 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 bàng 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 vi tương đối dễ dàng làm giả bời chữ ký cùa người khác bị chối bó bời người ký Khác với chữ ký tay, chữ ký số kiếm tra cách dùng thuật toá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 bân chữ ký tay chữ ký số “bàn sao” thông báo số ký đồng với bàn gốc Trong đó, bàn tài liệu giấy ký thường khác với bàn 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ụ, ncu Alice ký thông báo số cho Bob rút 1000$ từ tài khoản ngân hàng minh, Alice chi muốn Bob làm điều I 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 toán kiểm tra Alice có thề ký thơng báo X nhờ thuật tốn (bí mật) Sig Chữ ký thu Sig(x) sau kiểm tra bàng 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? Dinh 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 mồi khóa k e K tồn thuật toán ký Sigk e s thuật toán xác minh Verk e V Mỗi Sigk: p ->A Verk: PxA->{TRUE,FALSE} hàm cho điện X e p chữ ký y e A thỏa mãn phương trinh đây: ,, (TRUE er(.x,y) - [false nẽu neu y = sig(x')) y * sig(x) i Yêu cầu: Với k e 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 chi 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 cã khả cùa chữ ký y nhờ thuật tốn kiếm tra cơng khai Vcr() tìm chữ ký Do đó, đú thời gian cần thiết Oscar giả mạo chữ ký Alice Vi vậy, mục đích tìm sơ đo 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 Thuật toán Euclid 1.2.1 Thuật tốn Euclid giải thuật giúp tính ước số chung lớn (UCLN) hai số cách hiệu quâ Nhà toán học Hy Lạp co Euclid đưa thuật toán sách toán tiếng Elements vào khố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ó 213 = 33 * + 15 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 bới 33*6+15=213 => UCLN(33,213)=UCLN(33,15) Bài toán trớ thành tim UCLN 33 15 Lặp lại quy trinh 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ố ngun, ta có: nri l.A _ í b UCLN(a,b) = s [UCLN(b,r) nẻu r - nẽur^o 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 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 hàng số nguyên, X, y an so 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: Nếu d = UCLN(a, b) tồn sơ nguyên x,y cho ax + by = d Giải thuật Euclid mờ rộng kết họp cúa trình tìm UCLN(a,b) thuật tốn Euclid với việc tim cặp so 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, F|=b, chia r0 cho t| số dư 1’2 thương nguyên qi Nếu r2 = dừng lại, r2ị chia r, cho r2 số dư r3 thương nguyên q2 Vi dãy r, giảm thực nên sau hữu hạn bước ta có so dư rm= r0 = q,r1 + r2, 0< r2< n r, = q2r2 + r3, 0< r3< r2 tin-1 Tin tỊmrm + rm+i, 0< rm+]< rm qm+ltin+l số dư cuối khác rm+1 = d Bài tốn đặt tìm X, y cho ax + by = rra+ I=d Đe làm điều này, ta tìm X, y theo cơng thức truy hồi, nghĩa tìm Xị, yi cho aXị + byi = Fj với i = 0, Ta có: a + b.o = a = r0 a.o + b = b = T| nghĩa Xo= 1, X| = yo= 0, yi = (1) Tổng quát: ax, + by, = r, với i = 0, axi+i + byi-ị = ri+, với i = 0, Khi từ n = qi+in+i + ri+2 suy ri-qi+lri+] =ri+2 (aXj + by,) - qi+i(axi+i + byi+i) = ri+2 a(xj - Xj+1 qi+i) + b(y, - qi+iyi+i) = ri+2 từ đó, có the chọn xi+2 = Xi - xi+1 qi+1 (2) yi+2 = y - qi+ơi+1 (3) Khi i = m - ta có Xm+| ym+l 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) = thi tồn phần tử b cho UCLN(b,m) = 1, phần tữ nghịch đáo cùa a, nghĩa thỏa mãn: ab = (ab) mod m =1 Mã giá: Procedure EuclidExtended (a,m) int y0=0,yl:=l; While a>() { r:= m mod a if r=0 then Break q:= m div a y:= yO-yl*q m:=a a:=r yO:=yl yl:=y } If a>l Then Return "A không khả nghịch theo modulo m" else Return " Nghịch đào modulo m a y" 1.2.3 *Nếu y>0 thỉ y kết quà a'1 mod m *Nếu y; jMenuBarl.add(jmnThongtin); setJMenuBar(jMenuBarl); javax.swing.GroupLayout layout j avax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( = new layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addComponent(j Panel4, javax.swing.GroupLayout.DEFAULT_SIZE, j avax.swing.GroupLayout.DEFAULT—SIZE, Short.MAX_VALOE) addGroup(layout.createSequentialGroup() addComponent(j Panels, j avax.swing.GroupLayout.PREFERRED_SIZE, j avax.swing.GroupLayout.DEFAULT_SIZE, j avax.swing.GroupLayout.PREFERRED_SIZE) addGapfO, 0, Short.MAX-VALUE)) addComponent(j Panel5, javax.swing.GroupLayout.DEFAULT-SIZE, javax.swing.GroupLayout.DEFAULT—SIZE, Short.MAX-VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addContainerGap(j avax.swing.GroupLayout.DEFAULT-SIZE, Short.MAX-VALUE) addComponent(j Panels, javax.swing.GroupLayout.PREFERRED-SIZE, 72 javax.swing.GroupLayout.DEFAULT_SIZE, j avax.swing.GroupLayout.PREFERRED_SIZE) ,addGap(2, 2, 2) addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, j avax.swing.GroupLayout.PREFERRED_SIZE) 150, addPreferredGap(javax.swing.Layoutstyle.Componentplacement.RELATED) addComponent(jPanels, j avax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, j avax.swing.GroupLayout.PREFERRED_SIZE)) ); getAccessibleContext().setAccessibleDescription(""); pack(); }// //GEN-END:initComponents evt) private void j rbtnTuyChinhActionPerformed(java.awt.event.ActionEvent {//GEN-FIRST:event_j rbtnTuyChinhActionPerformed // TODO add your handling code here: }//GEN-LAST:event_j rbtnTuyChinhActionPerformed private void jmnCaidatMouseClicked(java.awt.event.MouseEvent {//GEN-FIRST:event_jmnCaidatMouseClicked // TODO add your handling code here: jdlgCaiDat.setvisible(true); evt) }//GEN-LAST:event_jmnCaidatMouseClicked private void initPosO { Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize0; Dimension appSize = getSizeO; setLocation((int) (scrSize.getwidth() - appSize.getwidth()) / 2, (int) (scrSize.getHeight() - appSize.getHeight()) / 2); jdlgCaiDat.setLocation(getx(), getY()); jdlgThongtin.setLocation(getx(), getY()); } private void jbtBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtBrowseActionPerformed // TODO add your handling code here: int returnvalue = jFileChooser2.showOpenDialog(GUI.this); if (returnvalue == JFileChooser.APPROVE_OPTION) { File selectedFile = jFileChooser2.getSelectedFile0; jTextFieldPath.setText(selectedFile.getAbsolutePath()); } }//GEN-LAST:event_j btBrowseActionPerformed private void formWindowOpened(java.awt.event.WindowEvent evt) FIRST :event_formWindowOpened // TODO add your handling code here: jdlgCaiDatWindowOpened(evt); initPos(); }//GEN-LAST:event_formWindowOpened {//GEN- 73 public class DigitsDocument extends PlainDocument { @Override public void insertstring(int offs, String str, Attributeset a) throws BadLocationException { if (str == null) { return; } chart] addedFigures = str.toCharArray(); char c; for (int i = addedFigures.length; i > 0; i—) { c = addedFigures[i - 1]; if (Character.isDigit(c) II c == { super.insertstring(offs, new Character(c).toString0, a) ; } } } }; private void jbtKyActionPerformed(java.awt.event.ActionEvent evt) (/ /GEN-FIRST: eventjbtKyActionPer formed // 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.lastlndexOf(tenFileGoc)); String tenFileKy = if (splitTenFileGoc.length > 1) ( for (int i = 0; i < splitTenFileGoc.length - 1; Í++) ( tenFileKy += splitTenFileGoc[i]; tenFileKy += "_Ky." + splitTenFileGoctsplitTenFileGoc.length - 1]; } } else ( tenFileKy = splitTenFileGoc[0] + "_Ky.” + splitTenFileGoc[splitTenFileGoc.length]; } //sử dụng đuờ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 { chart] giaTri = jtxtGiatri.getPassword(); String value = for (int i = 0; i < giaTri.length; i++) ( value += giaTrifi]; 74 new Elgamal().ky(fileGoc, fileKy, SoLon.parseint(Integer.parselnt(value))); } JOptionPane.showMessageDialog(rootpane, "Ký thành công!!!\n" + fileKy.getAbsolutePath0, JOptionPane.INFORMATION_MESSAGE); } catch (lOException 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.createNewFile0; FileObj fo; if (jrbtnMacDinh.isSelected0 ) { fo = new FileObj(true, -1, jtxtDuongDan.getText() ); } else { chart] giaTri = jtxtGiatri.getPassword0; String value = for (int i = 0; i < giaTri.length; Ỉ++) ( value += giaTriti]; } fo = new FileObj(false, Integer.parselnt(value) , j txtDuongDan.getText()); } FileOutputStream fos = new Fileoutputstream(config); Objectoutputstream oos = new Objectoutputstream(fos); oos.writeObject(fo); } catch (lOException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR—MESSAGE); } }//GEN-LAST:eventjdlgCaiDatWindowClosing evt) private void jbtnBrowseActionPerformed(j ava.awt.event.ActionEvent (//GEN-FIRST:event-jbtnBrowseActionPerformed // TODO add your handling code here: int returnvalue = jFileChooserl.showOpenDialog(jdlgCaiDat); if (returnvalue == JFileChooser.APPROVE-OPTION) ( File selectedFile = jFileChooserl.getSelectedFile(); jtxtDuongDan.setText(selectedFile.getAbsolutePath 0); } }//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 0) { try { Fileinputstream fis = new Fileinputstream(file); ois = new Objectlnputstream(fis); FileObj fo = (FileObj) ois.readobject 0; 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 0, "Lỗi", JOptionPane.ERROR_MESSAGE); } catch (lOException ex) { JOptionPane.showMessageDialog(rootPane, ex.getMessage(), "Lỗi", JOptionPane.ERROR_MESSAGE); ) } else ( j rbtnMacDinh.setSelected(true); } }//GEN-LAST:event_jdlgCaiDatWindowOpened private void j rbtnMacDinhStateChanged(j avax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_j rbtnMacDinhStateChanged // TODO add your handling code here: jtxtGiatri.setText(null); jtxtGiatri.setEnabled(!j rbtnMacDinh.isSelected()); }//GEN-LAST:event_j rbtnMacDinhStateChanged private void jtxtGiatriFocusLost(java.awt.event.FocusEvent {//GEN-FIRST:event_j txtGiatriFocusLost // TODO add your handling code here: if (jtxtGiatri.getDocument().getLength() == 0) { jrbtnMacDinh.setSelected(true); } else ( chart] giaTri = jtxtGiatri.getPassword(); String value = for (int i = 0; i < giaTri.length; i++) { value += giaTriti]; } try { SoLon khoaBiMat SoLon.parselnt(Integer.parselnt(value) ); Toan toan = new Toan(); SoLon mot = new SoLon(new int[]{1}); evt) = 76 SoLon nguyenTo_l toan.tru(new ElgamalO getNg_to() mot) ; if (!toan.nguyenToCungNhau(khoaBiMat, nguyenTo_l)) { { khoaBiMat = toan.cong(khoaBiMat, mot); ) while (!toan.nguyenToCungNhau(khoaBiMat, nguyenTo_l)); 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_j txtGiatriFocusLost evt) private void j rbtnTuyChinhStateChanged(j avax.swing.event.ChangeEvent (//GEN-FIRST:event_j rbtnTuyChinhStateChanged // TODO add your handling code here: if (jrbtnTuyChinh.isSelected()) ( j txtGiatri.requestFocus(true); } }//GEN-LAST:event_j rbtnTuyChinhStateChanged private void jbtKiemtraActionPerformed(j ava.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtKiemtraActionPerformed // TODO add your handling code here: File fileKy = new File(jTextFieldPath.getText0); 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.ERRORJ4ESSAGE); }//GEN-LAST:event_jbtKiemtraActionPer formed private void jLabel9MouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_j Label9MouseClicked // TODO add your handling code here: Desktop desktop = Desktop.getDesktop0; try { desktop.mail(new URI("mailto", "linh08b6@gmail.com", null)); } catch (lOException ex) ( } catch (URISyntaxException ex) ( } )//GEN-LAST:event_j Label9MouseClicked evt) private void jmnThongtinActionPerformed(j ava.awt.event.ActionEvent {//GEN-FIRST:event_jmnThongtinActionPerformed // TODO add your handling code here: }//GEN-LAST:event_jmnThongtinActionPerformed 77 evt) private void jmnCaidatMenuKeyPressed(javax.swing.event.MenuKeyEvent {/ /GEN-FIRST: eventjmnCaidatMenuKey Pressed // TODO add your handling code here: jmnCaidatMouseClicked(null); } / /GEN-LAST: e ven tjmnCaidatMenuKey Pressed private void jmnThongtinMouseClicked(java.awt.event.MouseEvent {//GEN-FIRST:event_jmnThongtinMouseciicked // TODO add your handling code here: jdlgThongtin.setDefaultCloseOperation(DISPOSE_ON_CLOSE); jdlgThongtin.setvisible(true); } / /GEN-LAST: event—jmnThongtinMouseciicked evt) private void jmnThongtinMenuKeyPressed(javax.swing.event.MenuKeyEvent evt) {//GEN-FIRST:event_jmnThongtinMenuKeyPressed // TODO add your handling code here: jmnThongtinMouseClicked(null); }//GEN-LAST:event-jmnThongt inMenuKeyPressed private void jLabel9MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_j Label9MouseEntered // TODO add your handling code here: jLabel9.setFont(new Font("Times New Roman", Font.ITALIC, 13)); }//GEN-LAST:event_j Label9MouseEntered private void jLabel9MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_j Label9MouseExited // TODO add your handling code here: jLabel9.setFont(new Font("Times New Roman", Font.PLAIN, 13)); }//GEN-LAST:event_j Label9MouseExited evt) private void jdlgCaiDatWindowActivated(java.awt.event.WindowEvent {//GEN-FIRST:event_j dlgCaiDatWindowActivated // TODO add your handling code here: }//GEN-LAST:event_jdlgCaiDatWindowActivated /** * @param args the command line arguments */ public static void main(String args[J) /* * Set the Nimbus look and feel { * / //

Ngày đăng: 18/03/2023, 07:30

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w