Mã hóa và giải mã dữ liệu trong Java (Bài 9) – Gia Sư Tin Học

Mã hóa và giải mã dữ liệu trong java sẽ trình bày hai thao tác liên quan đến bảo mật dữ liệu là mã hóa và giải mã. Mã hoá là thao tác chuyển đổi văn bản hoặc dữ liệu ban đầu thành một hình thức mã hóa hay các bản mã bằng cách áp dụng các biến đổi toán học.

trái lại với thao tác này là giải thuật. Giải mã truy xuất tài liệu gốc từ những bản mã sử dụng một khóa giải thuật. Và việc mã hóa dữ liệu nhằm mục đích nâng cao năng lực bảo mật thông tin, xác nhận và tính toàn vẹn của thông tin được truyền trên những phương tiện đi lại tiếp thị quảng cáo .

Mã hóa và giải mã dữ liệu trong java – Cách thức hoạt động

Giả sử B muốn gửi thông điệp m sang cho A. B sẽ dùng khoá công khai (public key) mà A cung cấp để mã hoá dữ liệu và gửi. Khi nhận A được thông điệp từ B, A sẽ dùng khoá riêng (private key) của mình để giải mã và đọc. Trong tình huống này, A sẽ phải tạo ra cặp khoá gồm Public key và Private key.

Mã hóa và giải mã dữ liệu trong java – Các thuật toán mã hoá

Có nhiều thuật toán mã hóa được phổ cập thoáng đãng và được sử dụng trong bảo mật an ninh thông tin. Chúng được phân loại gồm mã hóa khóa đối xứng và mã hóa khóa không đối xứng. Trong mã hóa khóa đối xứng chỉ có một khóa ( key ) được sử dụng để mã hóa và giải thuật tài liệu. Trong mã hóa khóa bất đối xứng sử dụng hai khóa là khóa riêng và khóa công khai minh bạch. Trong đó khóa công khai minh bạch được sử dụng để mã hóa và khóa riêng được sử dụng để giải thuật. Bảng bên dưới trình diễn những thuật toán mã hóa .

AES DES RSA
Developed 2000 1977 1978
Key Size 128, 192, 256 bits 56 bits >1024 bits
Algorithm Đối xứng (Symmetric) Đối xứng (Symmetric) Bất đối xứng (Asymmetric)

Mã hóa và giải mã dữ liệu trong java – Thuật toán mã hoá bất đối xứng

Người nhận (Receiver): Tạo cặp khoá

SecureRandom sr = new SecureRandom();
// Thuật toán phát sinh khóa - Rivest Shamir Adleman (RSA)
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048, sr);
// Phát sinh cặp khóa
KeyPair kp = kpg.genKeyPair();
// PublicKey
PublicKey pubKey = kp.getPublic();
// PrivateKey
PrivateKey priKey = kp.getPrivate();
// Lưu public key và private key vào tập tin
// ...

Người gửi (Sender): Mã hoá dữ liệu

// Đọc file chứa public key
FileInputStream fis = new FileInputStream("fileName");
byte[] b = new byte[fis.available()];
fis.read(b);
fis.close();
// Tạo public key
X509EncodedKeySpec spec = new X509EncodedKeySpec(b);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pubKey = factory.generatePublic(spec);
// Sử dụng public key để mã hoá dữ liệu 
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.ENCRYPT_MODE, pubKey);
byte encryptOut[] = c.doFinal("Dữ liệu cần mã hoá");
//strEncrypt chứa dữ liệu sau khi mã hoá
String strEncrypt = Base64.encode(encryptOut);

Người nhận (Reveiver): Giải mã dữ liệu nhận được

// Đọc file chứa private key
FileInputStream fis = new FileInputStream("fileName");
byte[] b = new byte[fis.available()];
fis.read(b);
fis.close();
// Tạo private key
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b);
KeyFactory factory = KeyFactory.getInstance("RSA");
PrivateKey priKey = factory.generatePrivate(spec);
// Giải mã dữ liệu
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, priKey);
// decryptOut chứa dữ liệu sau khi giải mã
byte decryptOut[] = c.doFinal(Base64.decode(txtMessage.getText()));

Mã hóa và giải mã dữ liệu trong java – Chương trình mẫu

Tạo cặp khoá

package swing_pkg.basic.cryptography_signature.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
/**
 *
 * @author giasutinhoc.vn
 */
public class KeyPairGenerate {
 public static void main(String[] args) {
  try {
   SecureRandom sr = new SecureRandom();
   //Thuật toán phát sinh khóa - Rivest Shamir Adleman (RSA)
   KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
   kpg.initialize(2048, sr);
   //Phát sinh cặp khóa
   KeyPair kp = kpg.genKeyPair();
   //PublicKey
   PublicKey pubKey = kp.getPublic();
   //PrivateKey
   PrivateKey priKey = kp.getPrivate();
   //Lưu Public Key
   FileOutputStream fos = new FileOutputStream("D:/file/pubKey.bin");
   fos.write(pubKey.getEncoded());
   fos.close();
   //Lưu Private Key
   fos = new FileOutputStream("D:/file/priKey.bin");
   fos.write(priKey.getEncoded());
   fos.close();
   System.out.println("Generate key successfully");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

Mã hoá dữ liệu

package swing_pkg.basic.cryptography_signature.demo;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.FileInputStream;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
 *
 * @author giasutinhoc.vn
 */
public class Encrpytion {
 public static void main(String[] args) {
  try {
   // Đọc file chứa public key
   FileInputStream fis = new FileInputStream("D:/file/pubKey.bin");
   byte[] b = new byte[fis.available()];
   fis.read(b);
   fis.close();
   // Tạo public key
   X509EncodedKeySpec spec = new X509EncodedKeySpec(b);
   KeyFactory factory = KeyFactory.getInstance("RSA");
   PublicKey pubKey = factory.generatePublic(spec);
   // Mã hoá dữ liệu
   Cipher c = Cipher.getInstance("RSA");
   c.init(Cipher.ENCRYPT_MODE, pubKey);
   String msg = "giasutinhoc.vn";
   byte encryptOut[] = c.doFinal(msg.getBytes());
   String strEncrypt = Base64.encode(encryptOut);
   System.out.println("Chuỗi sau khi mã hoá: " + strEncrypt);
  } catch (Exception ex) {
    ex.printStackTrace();
  }
 }
}

Chuỗi sau khi mã hóa

SIpP0Bnu/XSCOpOvsJWLcWOHzFQ8jipidewfghbPl0WoJC/i5OWJbzk5IfdqR3x8tRJ9a2tY7zuAFgdti0BGivxWpuHeSrRO9hDPakwTw1+7OYizDJDb0UCAEViEhJCB09FhZkNnxtTpG+o4UaSeSVG/5KGCA7oIIsG0/tYpdCqv8do6KdGODHDjmKMhTbmjcsA2ksK93gQVVkIi/QkSgUxbV12GtXRpxS9zKpImNxH6otUT08K4UYPIGigU/0T8JBxHiDdb0R0uphKGei8+UJ++pDwtcNkv9yurkNcLL7oHzv16yL7bJV0zK5uBm6+tmbpU4pMLrqlYcrxwnMBZEw==

Giải mã dữ liệu

package swing_pkg.basic.cryptography_signature.demo;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.FileInputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.Cipher;
/**
 *
 * @author giasutinhoc.vn
 */
public class Decryption {
 public static void main(String[] args) {
  try {
   // Đọc file chứa private key
   FileInputStream fis = new FileInputStream("D:/file/priKey.bin");
   byte[] b = new byte[fis.available()];
   fis.read(b);
   fis.close();
   // Tạo private key
   PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b);
   KeyFactory factory = KeyFactory.getInstance("RSA");
   PrivateKey priKey = factory.generatePrivate(spec);
   // Giải mã dữ liệu
   Cipher c = Cipher.getInstance("RSA");
   c.init(Cipher.DECRYPT_MODE, priKey);
   byte decryptOut[] = c.doFinal(Base64.decode("SIpP0Bnu/XSCOpOvsJWLcWOHzFQ8jipidewfghbPl0WoJC/i5OWJbzk5IfdqR3x8tRJ9a2tY7zuAFgdti0BGivxWpuHeSrRO9hDPakwTw1+7OYizDJDb0UCAEViEhJCB09FhZkNnxtTpG+o4UaSeSVG/5KGCA7oIIsG0/tYpdCqv8do6KdGODHDjmKMhTbmjcsA2ksK93gQVVkIi/QkSgUxbV12GtXRpxS9zKpImNxH6otUT08K4UYPIGigU/0T8JBxHiDdb0R0uphKGei8+UJ++pDwtcNkv9yurkNcLL7oHzv16yL7bJV0zK5uBm6+tmbpU4pMLrqlYcrxwnMBZEw=="));
   System.out.println("Dữ liệu sau khi giải mã: " + new String(decryptOut));
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

Dữ liệu sau khi giải thuật

giasutinhoc.vn

Mã hóa và giải mã dữ liệu trong java – Bài tập thực hành

Câu 1: Tạo cặp khoá

Khi người dùng chọn nút lệnh “ Generate Key ”, chương trình sẽ tạo cặp khóa Public Key và Private Key được dùng để mã hóa và giải thuật tài liệu. Sau khi tạo xong cặp khóa, chương trình sẽ hiển thị hộp thoại được cho phép người dùng lựa chọn thư mục lưu cặp khóa. Lưu ý thứ tự lưu : Public key lưu trước, Private key lưu sau ( Thứ tự này do lập trình lao lý, không có ý nghĩa về mặt mã hóa )
Hiển thị thông tin xác nhận đã giải quyết và xử lý thành công xuất sắc

Câu 2: Mã hoá dữ liệu

Sau khi người dùng nhập nội dung cần mã hóa tại Message và nhấn nút “Send”, chương trình sẽ yêu cầu cung cấp Public key để mã hóa dữ liệu.

Dữ liệu sau khi mã hóa thành công xuất sắc

Câu 3: Giải mã dữ liệu

Nhập thông tin cần mã hóa, sau đó chọn nút  “Decrypt”, chương trình sẽ yêu cầu cung cấp Private key được dùng để giải mã dữ liệu

Dữ liệu sau khi giải thuật

Mã hóa và giải mã dữ liệu trong Java (Bài 9) – Gia Sư Tin Học

Bài viết liên quan
Hotline 24/7: O984.666.352
Alternate Text Gọi ngay