中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java結(jié)合keytool實現(xiàn)非對稱加密和解密

2018-08-09    來源:importnew

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

參考:Java結(jié)合keytool實現(xiàn)非對稱簽名與驗證

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

keytool的使用

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

生成密鑰對

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

生成別名為signLegal的密鑰對,存放在密鑰庫examplestanstore2中,證書的有效期是1800天(默認(rèn)是90天)。
輸入一系列的參數(shù)。輸入的參數(shù)遵循了LDAP的風(fēng)格和標(biāo)準(zhǔn)?梢韵胂,生成的密鑰對可以看成LDAP的一個條目。
命令執(zhí)行成功后會在當(dāng)前目錄下創(chuàng)建一個叫examplestanstore2的文件。相對另一篇博文,增加了一個keyalg參數(shù)。因為keytool默認(rèn)算法是DSA,而DSA只能用于簽名。RSA既能用于簽名,也能用于加密。而本文是研究加密問題,只能用RSA算法。

查看密鑰對

$ keytool -list -keystore examplestanstore2 -v

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

導(dǎo)出公鑰證書

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

導(dǎo)出的公鑰存放在當(dāng)前目錄的StanSmith.crt文件中。講“簽名”的那篇博文沒有加-rfc參數(shù),導(dǎo)出是個二進(jìn)制文件(CER格式)。加上-rfc后,導(dǎo)出的是文本文件(PEM)格式。在下面的測試中,如果使用CER格式,會報錯 ` No installed provider supports this key: sun.security.provider.DSAPublicKeyImpl`。

Java加密和解密

參考了這篇文章《Java-web下使用RSA進(jìn)行加密解密操作》。

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

GenSig2.java

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.根據(jù)命令行參數(shù)取公鑰
        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.使用公鑰進(jìn)行加密
        String data = "測試數(shù)據(jù)";
        //構(gòu)建加密解密類
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);//設(shè)置為加密模式
        byte[] jmdata = cipher.doFinal(data.getBytes());
        //打印加密后數(shù)據(jù)
        System.out.println(bytesToHexString(jmdata));
        //改為解密模式進(jìn)行解密
        cipher.init(Cipher.DECRYPT_MODE, prikey);//會用私鑰解密
        jmdata = cipher.doFinal(jmdata);
        System.out.println(new String(jmdata));
        }catch (Exception e) {
                e.printStackTrace();
        }
    }
    //這個方法用于把二進(jìn)制轉(zhuǎn)換成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();
    }
}

編譯,并運行

$ javac RSAEntry.java
$ java RSAEntry StanSmith.crt
8fceea48e34fdc786bde05459f3366714b650ff04f4e81e52eca139d8ee0b4acbcad019cd496de3589765894b2d5f4a2af38914af614d9e9b73e551ae01830cd6f49505685d7e527e3adc2b7a2a75608068627c0a12b338d3c743a5de2af2de327a0de14b548604e5c8905747aef077852ecfd2eb4a134ca0f3a56b23db8ae4beb07add5ba3725ab3ee0ffa7481494856144ba5004a329cfe2c43078f0cd95aebcbbfc6c1894efafacac90615e549cb8432c125d912a5e54ce4884f633f3e96bd7b61c1d538e38713716367f7ec6f5ca01288e6d96ad9e3d6515147369144390e1d002b1beaf5797966e3b498cc7def754816c99456ef380b3a83366a44415f6
測試數(shù)據(jù)

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

標(biāo)簽: ssl 安全 服務(wù)器 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:微服務(wù)框架 NutzBoot v2.2.4 "BD7OEC",原生支持多數(shù)據(jù)源

下一篇:JDK源碼閱讀:InterruptibleChannel與可中斷IO