本篇文章給大家分享的是有關如何在java中使用RSA算法對密碼進行加密與解密,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
前言:
RSA是第一個比較完善的公開密鑰算法,它既能用于加密,也能用于數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定RSA的安全性,但這恰恰說明該算法有一定的可信性,目前它已經成為最流行的公開密鑰算法。
RSA的安全基于大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價于分解兩個大素數之積(這是公認的數學難題)。
RSA加密與解密
RSA算法的密鑰由公鑰和私鑰組成,公鑰用于加密,私鑰用于解密。顧名思義,公鑰就是可以進行公開的密鑰,一般可以公開給你的合作伙伴;私鑰就是私有的,也就是只有你知道的,你的合作伙伴通過你提供的公鑰進行加密的內容只有你能進行解密,這樣也就只有你知道他發的是什么內容。用于加密的公鑰和私鑰是配對的。這樣的一對密鑰在Java中由
java.security.KeyPairGenerator來產生。以下是一個生成密鑰對的示例,該示例中還將生成的密鑰對分別保存到了文件中。
private static final String ALGORITHM = "RSA"; private static final String PRIVATE_KEY_PATH = "D:\\rsa_private.isa"; private static final String PUBLIC_KEY_PATH = "D:\\rsa_public.isa"; /** * 生成公鑰和私鑰并存儲到文件中 * @throws Exception */ @Test public void geneKeyPair() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM); keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate();//私鑰 PublicKey publicKey = keyPair.getPublic();//公鑰 byte[] privateKeyBytes = privateKey.getEncoded();//私鑰對應的字節數組 byte[] publicKeyBytes = publicKey.getEncoded();//公鑰對應的字節數組 Files.write(Paths.get(PRIVATE_KEY_PATH), privateKeyBytes); Files.write(Paths.get(PUBLIC_KEY_PATH), publicKeyBytes); }
加密
加密的過程跟使用AES算法進行加密的過程類似,唯一需要注意的是使用存儲起來的公鑰時需要使用X509EncodedKeySpec進行封裝,然后通過KeyFactory.generatePublic(KeySpec)進行生成。
@Test public void testEncrypt() throws Exception { this.encrypt("Hello RSA"); } /** * 公鑰加密 * @param value * @return * @throws Exception */ private byte[] encrypt(String value) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); //讀取公鑰對應的字節數組 byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH)); //構造公鑰,存儲起來的公鑰需要使用X509EncodedKeySpec進行讀取 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode); KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); //根據已有的KeySpec生成對應的公鑰 PublicKey publicKey = keyFactory.generatePublic(keySpec); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] result = cipher.doFinal(value.getBytes()); System.out.println(Base64.getEncoder().encodeToString(result)); return result; }
解密
解密是使用的密鑰對中的私鑰,其使用方法跟AES算法進行解密類似。 存儲起來的私鑰需要通過PKCS8EncodedKeySpec加載,然后通過KeyFactory.generatePrivate(KeySpec)生成私鑰。
/** * 私鑰解密 * @throws Exception */ @Test public void testDecrypt() throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); byte[] privateKeyCode = Files.readAllBytes(Paths.get(PRIVATE_KEY_PATH)); //私鑰需要通過PKCS8EncodedKeySpec來讀取 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyCode); KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); //生成私鑰 PrivateKey privateKey = keyFactory.generatePrivate(keySpec); cipher.init(Cipher.DECRYPT_MODE, privateKey); String content = "Java Program"; byte[] input = this.encrypt("Java Program"); byte[] result = cipher.doFinal(input); Assert.assertTrue(content.equals(new String(result))); }
以上就是如何在java中使用RSA算法對密碼進行加密與解密,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。