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

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java加密解密和數(shù)字簽名完整代碼示例

Java加密解密和數(shù)字簽名完整代碼示例

2021-02-27 14:25zxgmdzz JAVA教程

這篇文章主要介紹了Java加密解密和數(shù)字簽名完整代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

常見(jiàn)的加密算法

基本的單向加密算法:

BASE64嚴(yán)格地說(shuō),屬于編碼格式,而非加密算法
MD5(MessageDigestalgorithm5,信息摘要算法)
SHA(SecureHashAlgorithm,安全散列算法)
HMAC(HashMessageAuthenticationCode,散列消息鑒別碼)

復(fù)雜的對(duì)稱(chēng)加密(DES、PBE)、非對(duì)稱(chēng)加密算法:

DES(DataEncryptionStandard,數(shù)據(jù)加密算法)
PBE(Password-basedencryption,基于密碼驗(yàn)證)
RSA(算法的名字以發(fā)明者的名字命名:RonRivest,AdiShamir和LeonardAdleman)
DH(Diffie-Hellman算法,密鑰一致協(xié)議)
DSA(DigitalSignatureAlgorithm,數(shù)字簽名)
ECC(EllipticCurvesCryptography,橢圓曲線密碼編碼學(xué))

數(shù)字簽名

算法簡(jiǎn)述

數(shù)字簽名算法可以看做是一種帶有密鑰的消息摘要算法,并且這種密鑰包含了公鑰和私鑰。也就是說(shuō),數(shù)字簽名算法是非對(duì)稱(chēng)加密算法和消息摘要算法的結(jié)合體。

特點(diǎn)

數(shù)字簽名算法要求能夠驗(yàn)證數(shù)據(jù)完整性、認(rèn)證數(shù)據(jù)來(lái)源,并起到抗否認(rèn)的作用。

原理

數(shù)字簽名算法包含簽名和驗(yàn)證兩項(xiàng)操作,遵循私鑰簽名,公鑰驗(yàn)證的方式。

簽名時(shí)要使用私鑰和待簽名數(shù)據(jù),驗(yàn)證時(shí)則需要公鑰、簽名值和待簽名數(shù)據(jù),其核心算法主要是消息摘要算法。

1. 消息摘要

?
1
2
3
4
5
6
7
8
9
10
11
12
13
String beforeDegist = "asdf"
System.out.println("摘要前:"+beforeDegist);    
//初始信息要轉(zhuǎn)換成字節(jié)流的形式 
byte[] plainText = beforeDegist.getBytes("UTF8");  
//使用getInstance("算法")來(lái)獲得消息摘要,這里使用SHA-1的160位算法或者M(jìn)D5算法
geDigest messageDigest = MessageDigest.getInstance("SHA-1"); 
MessageDigest messageDigest = MessageDigest.getInstance("MD5");   
System.out.println("/n" + messageDigest.getProvider().getInfo());   
//開(kāi)始使用算法 
messageDigest.update(plainText);   
//輸出算法運(yùn)算結(jié)果 
String afterDegist = new String(messageDigest.digest(),"UTF8"); 
System.out.println("摘要后:"+afterDegist);

2. 私鑰加密

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
  * 此例子是對(duì)一個(gè)字符串信息,用一個(gè)私鑰(key)加密,然后在用該私鑰解密,驗(yàn)證是否一致
  * 私鑰加密,是對(duì)稱(chēng)加密
  * 使用對(duì)稱(chēng)算法。比如:A用一個(gè)密鑰對(duì)一個(gè)文件加密,而B(niǎo)讀取這個(gè)文件的話,則需要和A一樣的密鑰,雙方共享一
  * 個(gè)私鑰(而在web環(huán)境下,私鑰在傳遞時(shí)容易被偵聽(tīng))
  
  * 附:主要對(duì)稱(chēng)算法有:DES(實(shí)際密鑰只用到56 位)
  * AES(支持三種密鑰長(zhǎng)度:128、192、256位),通常首先128位,其他的還有DESede等
  */
<span style="white-space: pre; ">  </span>String before = "asdf";     
    byte[] plainText = before.getBytes("UTF8");       
    // STEP 1.
?
1
2
3
4
5
6
7
8
System.out.println("Start generate AES key.");
//得到一個(gè)使用AES算法的KeyGenerator的實(shí)例 
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//定義密鑰長(zhǎng)度128位 
keyGen.init(128);
//通過(guò)KeyGenerator產(chǎn)生一個(gè)key(密鑰算法剛才已定義,為AES) 
Key key = keyGen.generateKey();
System.out.println("Finish generating AES key="+key);

//STEP 2.

?
1
2
3
    //獲得一個(gè)私鑰加密類(lèi)Cipher,定義Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
//System.out.println("/n" + cipher.getProvider().getInfo());

//STEP 3.

?
1
2
3
4
5
6
7
8
9
// 使用私鑰加密 
System.out.println("/n用私鑰加密...");
// 把剛才生成的key當(dāng)作參數(shù),初始化使用剛才獲得的私鑰加密類(lèi),Cipher.ENCRYPT_MODE意思是加密 
cipher.init(Cipher.ENCRYPT_MODE, key);
//私鑰加密類(lèi)Cipher進(jìn)行加密,加密后返回一個(gè)字節(jié)流byte[] 
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字節(jié)流轉(zhuǎn)化為String 
String after1 = new String(cipherText, "UTF8");
System.out.println("用私鑰加密完成:"+after1);

// STEP 4.

?
1
2
3
4
5
6
7
8
[java] view plain copy
//使用私鑰對(duì)剛才加密的信息進(jìn)行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密鑰 
System.out.println("/n用私鑰解密...");
cipher.init(Cipher.DECRYPT_MODE, key);
//對(duì)剛才私鑰加密的字節(jié)流進(jìn)行解密,解密后返回一個(gè)字節(jié)流byte[] 
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私鑰解密完成:"+after2);

3. 公鑰加密

?
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
String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
//產(chǎn)生一個(gè)RSA密鑰生成器KeyPairGenerator(顧名思義:一對(duì)鑰匙生成器) 
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//定義密鑰長(zhǎng)度1024位 
keyGen.initialize(1024);
//通過(guò)KeyPairGenerator產(chǎn)生密鑰,注意:這里的key是一對(duì)鑰匙?。?nbsp;
KeyPair key = keyGen.generateKeyPair();
//獲得一個(gè)RSA的Cipher類(lèi),使用公鑰加密 
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//System.out.println("/n" + cipher.getProvider().getInfo()); 
System.out.println("/n用公鑰加密...");
//Cipher.ENCRYPT_MODE意思是加密,從一對(duì)鑰匙中得到公鑰 key.getPublic() 
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
//用公鑰進(jìn)行加密,返回一個(gè)字節(jié)流 
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字節(jié)流轉(zhuǎn)化為String 
String after1 = new String(cipherText, "UTF8");
System.out.println("用公鑰加密完成:"+after1);
//使用私鑰解密 
System.out.println("/n用私鑰解密...");
//Cipher.DECRYPT_MODE意思是解密模式,從一對(duì)鑰匙中得到私鑰 key.getPrivate() 
cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
//用私鑰進(jìn)行解密,返回一個(gè)字節(jié)流 
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私鑰解密完成:"+after2);

4. 數(shù)字簽名

?
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
/**
 * 此例子是數(shù)字簽名的例子,使用RSA私鑰對(duì)消息摘要(這里指的是原始數(shù)據(jù))進(jìn)行簽名,然后使用公鑰驗(yàn)證簽名
 
 * A通過(guò)使用B的公鑰加密數(shù)據(jù)后發(fā)給B,B利用B的私鑰解密就得到了需要的數(shù)據(jù)(進(jìn)過(guò)B公鑰加密的數(shù)據(jù)只有B的私鑰能夠
 * 解開(kāi),C沒(méi)有B的私鑰,所以C解不開(kāi),但C可以使用B的公鑰加密一份數(shù)據(jù)發(fā)給B,這樣一來(lái),問(wèn)題來(lái)了,B收到的數(shù)據(jù)到
 * 底是A發(fā)過(guò)來(lái)的還是C發(fā)過(guò)來(lái)的呢)
 * 由于私鑰是唯一的,那么A就可以利用A自己的私鑰進(jìn)行加密,然后B再利用A的公鑰來(lái)解密,就可以確定:一定是A的消
 * 息,數(shù)字簽名的原理就基于此
 
 * 總結(jié):A想將目標(biāo)數(shù)據(jù)傳給B,此時(shí)A需要準(zhǔn)備1和2兩部分
 * 1:A使用B的公鑰將原始信息加密,以起到保密作用(只有B的私鑰能解開(kāi),其他人使用其他鑰匙都解不開(kāi),當(dāng)然就保密咯)
 * 2:A使用A的私鑰將原始信息的摘要進(jìn)行簽名,以起到接收方B確定是A發(fā)過(guò)來(lái)的作用(A用A的私鑰對(duì)目標(biāo)數(shù)據(jù)的摘要進(jìn)行簽
 * 名,然后傳給B,同時(shí),C用C的私鑰對(duì)任意信息進(jìn)行簽名也傳給B,B想接受的是A的數(shù)據(jù)(比如說(shuō)一個(gè)轉(zhuǎn)帳請(qǐng)求),于是B
 * 就通過(guò)A的公鑰對(duì)接受到的兩個(gè)信息進(jìn)行解密,解開(kāi)的就是A(A的公鑰能且只能解開(kāi)A的私鑰加密的數(shù)據(jù)))
 */
String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
//形成RSA公鑰對(duì) 
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();
//使用私鑰簽名********************************************************** 
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(key.getPrivate());
//sig對(duì)象得到私鑰 
//簽名對(duì)象得到原始數(shù)據(jù) 
sig.update(plainText);
//sig對(duì)象得到原始數(shù)據(jù)(現(xiàn)實(shí)中用的是原始數(shù)據(jù)的摘要,摘要的是單向的,即摘要算法后無(wú)法解密) 
byte[] signature = sig.sign();
//sig對(duì)象用私鑰對(duì)原始數(shù)據(jù)進(jìn)行簽名,簽名后得到簽名signature 
em.out.println(sig.getProvider().getInfo());
String after1 = new String(signature, "UTF8");
System.out.println("/n用私鑰簽名后:"+after1);
//使用公鑰驗(yàn)證 
sig.initVerify(key.getPublic());
//sig對(duì)象得到公鑰 
//簽名對(duì)象得到原始信息 
sig.update(plainText);
//sig對(duì)象得到原始數(shù)據(jù)(現(xiàn)實(shí)中是摘要) 
try {
    if (sig.verify(signature)) {
        //sig對(duì)象用公鑰解密簽名signature得到原始數(shù)據(jù)(即摘要),一致則true 
        System.out.println("簽名驗(yàn)證正確?。?quot;+new String(plainText, "UTF8"));
    } else {
        System.out.println("簽名驗(yàn)證失敗??!");
    }
}
catch (SignatureException e) {
    System.out.println("簽名驗(yàn)證失?。?!");
}

5. 數(shù)字證書(shū)

?
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
63
64
65
66
67
68
69
70
71
72
73
74
/**
 * 此例是對(duì)“數(shù)字證書(shū)”文件的操作
  * java平臺(tái)(在機(jī)器上安裝jdk)為你提供了密鑰庫(kù)(證書(shū)庫(kù)),cmd下提供了keytool命令就可以創(chuàng)建證書(shū)庫(kù)
  
  * 在運(yùn)行此例前:
  * 在c盤(pán)目錄下創(chuàng)建一個(gè)證書(shū),指定證書(shū)庫(kù)為BocsoftKeyLib,創(chuàng)建別名為T(mén)estCertification的一條證書(shū),它指定用 
  * RSA 算法生成,且指定密鑰長(zhǎng)度為1024,證書(shū)有效期為1年
  * 導(dǎo)出證書(shū)文件為T(mén)C.cer已存于本地磁盤(pán)C:/
  * 密碼是qazzaq
  */
try {
    //前提:將證書(shū)庫(kù)中的一條證書(shū)導(dǎo)出到證書(shū)文件(我寫(xiě)的例子里證書(shū)文件叫TC.cer) 
    //從證書(shū)文件TC.cer里讀取證書(shū)信息 
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    FileInputStream in = new FileInputStream("C:/TC.cer");
    //將文件以文件流的形式讀入證書(shū)類(lèi)Certificate中 
    Certificate c = cf.generateCertificate(in);
    System.err.println("轉(zhuǎn)換成String后的證書(shū)信息:"+c.toString());
    */ 
        //或者不用上面代碼的方法,直接從證書(shū)庫(kù)中讀取證書(shū)信息,和上面的結(jié)果一摸一樣 
    String pass="qazzaq";
    FileInputStream in2=new FileInputStream("C:/BocsoftKeyLib");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in2,pass.toCharArray());
    String alias = "TestCertification";
    //alias為條目的別名 
    Certificate c=ks.getCertificate(alias);
    System.err.println("轉(zhuǎn)換成String后的證書(shū)信息:"+c.toString());
    //獲取獲取X509Certificate類(lèi)型的對(duì)象,這是證書(shū)類(lèi)獲取Certificate的子類(lèi),實(shí)現(xiàn)了更多方法 
    X509Certificate t=(X509Certificate)c;
    //從信息中提取需要信息 
    System.out.println("版本號(hào):"+t.getVersion());
    System.out.println("序列號(hào):"+t.getSerialNumber().toString(16));
    System.out.println("主體名:"+t.getSubjectDN());
    System.out.println("簽發(fā)者:"+t.getIssuerDN());
    System.out.println("有效期:"+t.getNotBefore());
    System.out.println("簽名算法:"+t.getSigAlgName());
    byte [] sig=t.getSignature();
    //簽名值 
    PublicKey pk = t.getPublicKey();
    byte [] pkenc=pk.getEncoded();
    System.out.println("公鑰:");
    for (int i=0;i<pkenc.length;i++){
        System.out.print(pkenc[i]+",");
    }
    System.err.println();
    //證書(shū)的日期有效性檢查,頒發(fā)的證書(shū)都有一個(gè)有效性的日期區(qū)間 
    Date TimeNow=new Date();
    t.checkValidity(TimeNow);
    System.out.println("證書(shū)的日期有效性檢查:有效的證書(shū)日期!");
    //驗(yàn)證證書(shū)簽名的有效性,通過(guò)數(shù)字證書(shū)認(rèn)證中心(CA)機(jī)構(gòu)頒布給客戶(hù)的CA證書(shū),比如:caroot.crt文件 
    //我手里沒(méi)有CA頒給我的證書(shū),所以下面代碼執(zhí)行不了 
    /*FileInputStream in3=new FileInputStream("caroot.crt");  
    //獲取CA證書(shū)
    Certificate cac = cf.generateCertificate(in3);
    //獲取CA的公鑰  
    PublicKey pbk=cac.getPublicKey();  
    //c為本地證書(shū),也就是待檢驗(yàn)的證書(shū),用CA的公鑰校驗(yàn)數(shù)字證書(shū)c的有效性
    c.verify(pbk);       
  } catch(CertificateExpiredException e){//證書(shū)的日期有效性檢查:過(guò)期  
    System.out.println("證書(shū)的日期有效性檢查:過(guò)期");    
  } catch(CertificateNotYetValidException e){ //證書(shū)的日期有效性檢查:尚未生效  
    System.out.println("證書(shū)的日期有效性檢查:尚未生效");  
  } catch (CertificateException ce) { 
    ce.printStackTrace(); 
  } catch (FileNotFoundException fe) { 
    fe.printStackTrace(); 
  } /*catch (IOException ioe){
  } catch (KeyStoreException kse){
  }*/
    catch (Exception e){
        e.printStackTrace();
    }
}

總結(jié)

以上就是本文關(guān)于Java加密解密和數(shù)字簽名完整代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

原文鏈接:http://blog.csdn.net/zxgmdzz/article/details/78416639

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲性视频 | 久久夜精 | 国产中文视频 | 国产精品视频导航 | 免费观看黄视频网站 | 奇米成人 | 日本a级片网站 | 久久综合久久久 | 国产精品亚洲视频 | 亚洲淫视频 | 日韩在线精品 | 成人免费的视频 | 国产成人无遮挡在线视频 | 亚洲 精品 综合 精品 自拍 | 成人午夜电影在线观看 | 国产午夜精品视频 | 精品国产乱码久久久久久牛牛 | 亚洲精品视频在线 | 国产一区二区三区 | 91精品国产91久久久久 | 毛片免费看电影 | 高清国产视频 | 日韩有码av | 亚洲精品久久久久久一区二区 | 欧美一区二区三区在线观看视频 | 一区视频 | 国产毛片毛片毛片 | 欧美成人免费在线视频 | 欧美a在线| 91小视频| 久久久看片 | 国产精品视频在线播放 | 欧美一级一区 | 日韩高清在线一区 | 特黄特黄aaaa级毛片免费看 | 日韩在线观看视频一区二区三区 | 亚洲精品一区二区三区 | 久久午夜影院 | 九九九九精品九九九九 | 亚洲综合精品 | 国产2区|