1. 程式人生 > >Java 數字簽名演算法RSA 的使用教程

Java 數字簽名演算法RSA 的使用教程

JAVA 20小時前 36瀏覽 0評論

最近用到了 RSA 演算法,百度了一下,發現很多文章都是互相轉載的。有的實現太過複雜,有的完全沒有中心,是錯誤的實現。今天小編就特意為大家整理了一下 java 使用 RSA 演算法的案例,希望能對大家有所幫助!

關於 RSA非對稱演算法的原理我就不寫了,大家可以去看看阮老師的兩篇關於 RSA 演算法原理的文章。《RSA演算法原理(一)》、《RSA演算法原理(二)》兩篇非常有深度的文章。

RSA的公鑰和私鑰到底哪個用來加密哪個用來解密

這方面沒有絕對的要求,但是一般是按照下面的原則來執行的。

既然是加密,那肯定是不希望別人知道我的訊息,所以只有我才能解密,所以可得出公鑰負責加密,私鑰負責解密

;同理,既然是簽名,那肯定是不希望有人冒充我發訊息,只有我才能釋出這個簽名,所以可得出私鑰負責簽名,公鑰負責驗證。

圖解 數字簽名演算法 RSA

數字簽名演算法 RSA

RSA 公鑰加密,私鑰解密 的 java 實現

實現的步驟如下:

  1. 先初始化金鑰,獲得公私鑰
  2. 使用 PKCS8EncodedKeySpec 進行 私鑰加密、公鑰解密
  3. 使用 X509EncodedKeySpec 進行 私鑰加密、公鑰解密 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 public static void jdkRSA() { String src = "imooc security rsa"; try { //1.初始化金鑰 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate(); System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));  System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));  //2.私鑰加密、公鑰解密——加密 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, privateKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("私鑰加密、公鑰解密——加密 : " + Base64.encodeBase64String(result)); //3.私鑰加密、公鑰解密——解密 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); result = cipher.doFinal(result); System.out.println("私鑰加密、公鑰解密——解密:" + new String(result)); //4.公鑰加密、私鑰解密——加密 x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); keyFactory = KeyFactory.getInstance("RSA"); publicKey = keyFactory.generatePublic(x509EncodedKeySpec); cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); result = cipher.doFinal(src.getBytes()); System.out.println("公鑰加密、私鑰解密——加密 : " + Base64.encodeBase64String(result)); //5.公鑰加密、私鑰解密——解密 pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); keyFactory = KeyFactory.getInstance("RSA"); privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); result = cipher.doFinal(result); System.out.println("公鑰加密、私鑰解密——解密:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } }

是不是非常的簡單!