RSA là gì? Code ví dụ RSA với Java

RSA là gì? Code ví dụ RSA với Java

(Code ví dụ mã hóa với DES)

(Code ví dụ mã hóa với AES)

RSA là gì?

RSA là một giải thuật mã hóa được 3 nhà khoa học Ronald Rivest, Adi Shamir và Leonard Adleman phát minh năm 1977 (Tên giải thuật RSA lấy theo chữ cái đầu của tên 3 ông)

Độ an toàn của RSA dựa trên tính khó của việc phân tích số nguyên rất lớn (số có hàng trăm chữ số thập phân);

Kích thước khóa của RSA:

  • Khóa < 1024 bít không an toàn hiện nay.
  • Khuyến nghị dùng khóa >= 2048 bít. Tương lai nên dùng khóa 3072 bít.

RSA là mã hóa bất đối xứng, sử dụng một cặp khóa:

  • Khóa công khai (Public key) dùng để mã hóa;
  • Khóa riêng (Private key) dùng để giải mã.
  • Chỉ khóa riêng cần giữ bí mật. Khóa công khai có thể công bố rộng rãi.

Code ví dụ RSA

Tạo cặp khóa private-public.

package stackjava.com.demorsa.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;

public class GenerateKeys {
  
  public static final String PUBLIC_KEY_FILE = "rsa_keypair/publicKey";
  public static final String PRIVATE_KEY_FILE = "rsa_keypair/privateKey";
  
  private KeyPairGenerator keyGen;
  private KeyPair pair;
  private PrivateKey privateKey;
  private PublicKey publicKey;

  public GenerateKeys(int keylength) throws NoSuchAlgorithmException, NoSuchProviderException {
    this.keyGen = KeyPairGenerator.getInstance("RSA");
    this.keyGen.initialize(keylength);
  }

  public void createKeys() {
    this.pair = this.keyGen.generateKeyPair();
    this.privateKey = pair.getPrivate();
    this.publicKey = pair.getPublic();
  }

  public PrivateKey getPrivateKey() {
    return this.privateKey;
  }

  public PublicKey getPublicKey() {
    return this.publicKey;
  }

  public void writeToFile(String path, byte[] key) throws IOException {
    File f = new File(path);
    f.getParentFile().mkdirs();

    FileOutputStream fos = new FileOutputStream(f);
    fos.write(key);
    fos.flush();
    fos.close();
  }

  public static void main(String[] args) {
    try {
      new GenerateKeys(1024).generateKeysToFile();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (NoSuchProviderException e) {
      e.printStackTrace();
    }
  }
  
  public void generateKeysToFile() {
    try {
      System.out.println("Starting generate...");
      this.createKeys();
      this.writeToFile(PUBLIC_KEY_FILE, this.getPublicKey().getEncoded());
      this.writeToFile(PRIVATE_KEY_FILE, this.getPrivateKey().getEncoded());
      System.out.println("Generated!");
    } catch (IOException e) {
      System.err.println(e.getMessage());
    }
  }
}

Kết quả: 2 file privateKeypublicKey được tạo ra.

RSA là gì? Code ví dụ RSA với Java

Mã hóa và giải mã.

Mỗi lần thực hiện mã hóa ta sẽ đọc file publicKey để lấy public key thực hiện mã hóa, tương tự ta sẽ đọc file privatekey để lấy private key thực hiện giải mã

package stackjava.com.demorsa.main;

import java.io.File;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import javax.crypto.Cipher;

public class DemoRSA {

  public static PrivateKey getPrivateKey() throws Exception {
    byte[] keyBytes = Files.readAllBytes(new File(GenerateKeys.PRIVATE_KEY_FILE).toPath());
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(spec);
  }

  public static PublicKey getPublicKey() throws Exception {
    byte[] keyBytes = Files.readAllBytes(new File(GenerateKeys.PUBLIC_KEY_FILE).toPath());
    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePublic(spec);
  }
  
  public static void main(String[] args) throws Exception {
    PrivateKey privateKey = getPrivateKey();
    PublicKey publicKey = getPublicKey();

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    
    String original = "stackjava.com";
    byte[] byteEncrypted = cipher.doFinal(original.getBytes());
    String encrypted =  Base64.getEncoder().encodeToString(byteEncrypted);

    
    
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    byte[] byteDecrypted = cipher.doFinal(byteEncrypted);
    String decrypted = new String(byteDecrypted);

      System.out.println("original  text: " + original);
      System.out.println("encrypted text: " + encrypted);
      System.out.println("decrypted text: " + decrypted);
  
  }
}

Kết quả:

original  text: stackjava.com
encrypted text: VuDvWkK/lsBQqAz29qJVCuxCHruq4TVQrd8IvAsV8qCOxsCktCgrT8WtpAC37aZuoqwEKxNP3Ei/ZOiqjyzaRJVEUfSvsv7/EzyoLorJkGkikOphfLIASACwM1R/1+2wgyP9eUmpk+OxU6ECoz3oWk099yT9JscfG+hUAK0zh8U=
decrypted text: stackjava.com

RSA là gì? Code ví dụ RSA với Java

RSA là gì? Code ví dụ RSA với Java

Okay, Done!
Download code ví dụ trên tại đây

stackjava.com