RSA là gì? Code ví dụ RSA với Java – STACKJAVA
( 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)
Bạn đang đọc: RSA là gì? Code ví dụ RSA với Java – STACKJAVA
Độ bảo đảm 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
privateKey
vàpublicKey
được tạo ra.
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 fileprivatekey
để 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.comRSA là gì ? Code ví dụ RSA với Java
Okay, Done!
Download code ví dụ trên tại đây
Source: https://thomaygiat.com
Category : Kỹ Thuật Số
Chuyển vùng quốc tế MobiFone và 4 điều cần biết – MobifoneGo
Muốn chuyển vùng quốc tế đối với thuê bao MobiFone thì có những cách nào? Đừng lo lắng, bài viết này của MobiFoneGo sẽ giúp…
Cách copy dữ liệu từ ổ cứng này sang ổ cứng khác
Bạn đang vướng mắc không biết làm thế nào để hoàn toàn có thể copy dữ liệu từ ổ cứng này sang ổ cứng khác…
Hướng dẫn xử lý dữ liệu từ máy chấm công bằng Excel
Hướng dẫn xử lý dữ liệu từ máy chấm công bằng Excel Xử lý dữ liệu từ máy chấm công là việc làm vô cùng…
Cách nhanh nhất để chuyển đổi từ Android sang iPhone 11 | https://thomaygiat.com
Bạn đã mua cho mình một chiếc iPhone 11 mới lạ vừa ra mắt, hoặc có thể bạn đã vung tiền và có một chiếc…
Giải pháp bảo mật thông tin trong các hệ cơ sở dữ liệu phổ biến hiện nay
Hiện nay, với sự phát triển mạnh mẽ của công nghệ 4.0 trong đó có internet và các thiết bị công nghệ số. Với các…
4 điều bạn cần lưu ý khi sao lưu dữ liệu trên máy tính
08/10/2020những chú ý khi tiến hành sao lưu dữ liệu trên máy tính trong bài viết dưới đây của máy tính An Phát để bạn…