Java 數字簽名演算法RSA 的使用教程
阿新 • • 發佈:2019-02-04
JAVA
20小時前 36瀏覽
0評論
RSA的公鑰和私鑰到底哪個用來加密哪個用來解密
圖解 數字簽名演算法 RSA
RSA 公鑰加密,私鑰解密 的 java 實現
最近用到了 RSA 演算法,百度了一下,發現很多文章都是互相轉載的。有的實現太過複雜,有的完全沒有中心,是錯誤的實現。今天小編就特意為大家整理了一下 java 使用 RSA 演算法的案例,希望能對大家有所幫助!
關於 RSA非對稱演算法的原理我就不寫了,大家可以去看看阮老師的兩篇關於 RSA 演算法原理的文章。《RSA演算法原理(一)》、《RSA演算法原理(二)》兩篇非常有深度的文章。
RSA的公鑰和私鑰到底哪個用來加密哪個用來解密
這方面沒有絕對的要求,但是一般是按照下面的原則來執行的。
既然是加密,那肯定是不希望別人知道我的訊息,所以只有我才能解密,所以可得出公鑰負責加密,私鑰負責解密 ;同理,既然是簽名,那肯定是不希望有人冒充我發訊息,只有我才能釋出這個簽名,所以可得出私鑰負責簽名,公鑰負責驗證。
圖解 數字簽名演算法 RSA
RSA 公鑰加密,私鑰解密 的 java 實現
實現的步驟如下:
- 先初始化金鑰,獲得公私鑰
- 使用 PKCS8EncodedKeySpec 進行 私鑰加密、公鑰解密
- 使用 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();
}
}
|
是不是非常的簡單!