国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - java結合keytool如何實現非對稱加密與解密詳解

java結合keytool如何實現非對稱加密與解密詳解

2021-05-24 13:45imaidata Java教程

這篇文章主要給大家介紹了關于java結合keytool如何實現非對稱加密與解密的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面隨著小編來一起學習學習吧

前言

參考:java結合keytool實現非對稱簽名與驗證

那一篇講簽名,這一篇將加密解密。在java安全體系中,簽名屬于JAAS模塊,加解密屬于JCE模塊。

keytool的使用

keytool是JDK自帶的一個密鑰庫管理工具。這里只用到了keytool的部分功能,包括生成密鑰對,導出公鑰等。keytool生成的公鑰/私鑰對存放到一個到了一個文件中,這個文件有密碼保護,通稱為keystore。

生成密鑰對

?
1
$ keytool -genkey -alias signLegal -keystore examplestanstore2 -validity 1800 -keyalg RSA

生成別名為signLegal的密鑰對,存放在密鑰庫examplestanstore2中,證書的有效期是1800天(默認是90天)。

輸入一系列的參數。輸入的參數遵循了LDAP的風格和標準。可以想象,生成的密鑰對可以看成LDAP的一個條目。

命令執(zhí)行成功后會在當前目錄下創(chuàng)建一個叫examplestanstore2的文件。相對另一篇博文,增加了一個keyalg參數。因為keytool默認算法是DSA,而DSA只能用于簽名。RSA既能用于簽名,也能用于加密。而本文是研究加密問題,只能用RSA算法。

查看密鑰對

?
1
$ keytool -list -keystore examplestanstore2 -v

列出了examplestanstore2密鑰庫的中所有密鑰對。-v參數表示詳細信息,詳細信息中有證書的失效時間。

導出公鑰證書

?
1
$ keytool -export -keystore examplestanstore2 -alias signLegal -file StanSmith.crt -rfc

導出的公鑰存放在當前目錄的StanSmith.crt文件中。講“簽名”的那篇博文沒有加-rfc參數,導出是個二進制文件(CER格式)。

加上-rfc后,導出的是文本文件(PEM)格式。在下面的測試中,如果使用CER格式,會報錯 ` No installed provider supports this key: sun.security.provider.DSAPublicKeyImpl`。

java加密和解密

參考了這篇文章

在java程序中,首先從密鑰庫取出私鑰和公鑰,然后對測試字符串進行加密。二進制的密文轉換成字符串輸出到屏幕,然后解密成明文再輸出到屏幕。

GenSig2.java

?
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
52
53
54
55
56
57
58
59
60
61
62
import java.io.*;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
import sun.security.provider.*;
 
 
public class RSAEntry {
 public static void main(String[] args) {
 try {
 //1.從密鑰庫中取私鑰
 KeyStore ks = KeyStore.getInstance("JKS");
 FileInputStream ksfis = new FileInputStream("examplestanstore2");
 BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
 
 // open keystore and get private key
 // alias is 'signLeal', kpasswd/spasswd is 'vagrant'
 ks.load(ksbufin, "vagrant".toCharArray());
 PrivateKey prikey = (PrivateKey) ks.getKey("signLegal", "vagrant".toCharArray());
 
 //2.根據命令行參數取公鑰
 FileInputStream certfis = new FileInputStream(args[0]);
 java.security.cert.CertificateFactory cf =
  java.security.cert.CertificateFactory.getInstance("X.509");
 java.security.cert.Certificate cert = cf.generateCertificate(certfis);
 PublicKey pubKey = cert.getPublicKey();
 
 
 //3.使用公鑰進行加密
 String data = "測試數據";
 //構建加密解密類
 Cipher cipher = Cipher.getInstance("RSA");
 cipher.init(Cipher.ENCRYPT_MODE, pubKey);//設置為加密模式
 byte[] jmdata = cipher.doFinal(data.getBytes());
 //打印加密后數據
 System.out.println(bytesToHexString(jmdata));
 //改為解密模式進行解密
 cipher.init(Cipher.DECRYPT_MODE, prikey);//會用私鑰解密
 jmdata = cipher.doFinal(jmdata);
 System.out.println(new String(jmdata));
 }catch (Exception e) {
  e.printStackTrace();
 }
 }
 //這個方法用于把二進制轉換成ASCII字符串。
 public static String bytesToHexString(byte[] bytes) {
 if (bytes == null)
  return "null!";
 int len = bytes.length;
 StringBuilder ret = new StringBuilder(2 * len);
 
 for (int i = 0; i < len; ++i) {
  int b = 0xF & bytes[(i)] >> 4;
  ret.append("0123456789abcdef".charAt(b));
  b = 0xF & bytes[(i)];
  ret.append("0123456789abcdef".charAt(b));
 }
 
 return ret.toString();
 }
}

編譯,并運行:

?
1
2
3
4
$ javac RSAEntry.java
$ java RSAEntry StanSmith.crt
8fceea48e34fdc786bde05459f3366714b650ff04f4e81e52eca139d8ee0b4acbcad019cd496de3589765894b2d5f4a2af38914af614d9e9b73e551ae01830cd6f49505685d7e527e3adc2b7a2a75608068627c0a12b338d3c743a5de2af2de327a0de14b548604e5c8905747aef077852ecfd2eb4a134ca0f3a56b23db8ae4beb07add5ba3725ab3ee0ffa7481494856144ba5004a329cfe2c43078f0cd95aebcbbfc6c1894efafacac90615e549cb8432c125d912a5e54ce4884f633f3e96bd7b61c1d538e38713716367f7ec6f5ca01288e6d96ad9e3d6515147369144390e1d002b1beaf5797966e3b498cc7def754816c99456ef380b3a83366a44415f6
測試數據

本文展示的算法是一種非對稱算法,計算較慢。在SSL中,非對稱算法用于客戶端和服務器之間交換對稱加密的一次性密鑰??蛻舳藢⒁粋€隨機數用服務器的公鑰加密發(fā)給服務器,如果服務器持有私鑰,就能解開密文獲得隨機數(這個隨機數就是對稱算法的密鑰)。有了對稱算法密鑰,雙方就可以用對稱加密進行安全通信了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://imaidata.github.io/blog/2017/08/08/java結合keytool實現非對稱加密和解密/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产午夜精品一区二区三区视频 | 麻豆乱码国产一区二区三区 | 国产久 | 成人小视频在线播放 | 国产欧美精品一区二区三区四区 | 91av电影网 | 日韩精品一区二区三区四区 | 色女人的天堂 | 欧美成人免费在线视频 | 日韩高清中文字幕 | 欧美3区| 免费日本视频 | 亚洲依人 | 国产精品免费久久久久久久久 | 成人午夜视频在线 | 成人羞羞视频在线观看免费 | 国产一区二区精品在线观看 | 天堂久久精品 | 九色91九色porny永久 | 一区二区中文 | 天堂欧美城网站网址 | 久久人人爽爽爽人久久久 | 91久久精品国产91久久性色tv | 亚洲h视频 | 日本一区二区在线播放 | 亚洲免费在线播放 | 成人欧美一区二区三区白人 | 91免费看网站 | av中文字幕在线观看 | 欧美精品成人一区二区三区四区 | 国产在线观看免费 | 国产黄色av | 久久综合一区二区三区 | 国产欧美精品区一区二区三区 | 亚洲伊人伊色伊影伊综合网 | 日韩在线观看三区 | 成人免费大片黄在线播放 | 亚洲久草 | 国产精品尤物在线观看 | 国产成人99久久亚洲综合精品 | 国产精品中文字幕在线观看 |