国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVA 解密被密碼保護(hù)的pem私鑰文件

這篇具有很好參考價(jià)值的文章主要介紹了JAVA 解密被密碼保護(hù)的pem私鑰文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

0、說明:只能讀取PKCS8格式的加密私鑰

JAVA 解密被密碼保護(hù)的pem私鑰文件

1、解密使用的依賴:

        <!-- RAS私鑰解密相關(guān) -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.68</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.68</version>
        </dependency>
        <!-- 工具 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.22</version>
        </dependency>

JAVA版本:1.8.0_261

SpringBoot版本:2.6.4

2、代碼:

讀取PKCS8格式的秘鑰


    private static final String PRIVATE_KEY_FILE = "prikey.pem";

    /**
     * 讀取帶密碼保護(hù)的私鑰文件
     * @param passwd 保護(hù)密碼
     * @return 私鑰的byte數(shù)組,可以通過Base64編碼轉(zhuǎn)為字符串
     */
    public static byte[] readPrivateKeyFromPem(String passwd) throws Exception {
        File file = ResourceUtils.getFile("classpath:".concat(PRIVATE_KEY_FILE));
        String encrypted = FileUtil.readString(file, StandardCharsets.UTF_8);
        // 讀取帶密碼保護(hù)的私鑰:https://cloud.tencent.com/developer/article/2186682?from=15425
        PrivateKeyInfo pki;
        try (PEMParser pemParser = new PEMParser(new StringReader(encrypted))) {
            Object o = pemParser.readObject();
            PKCS8EncryptedPrivateKeyInfo epki = (PKCS8EncryptedPrivateKeyInfo) o;
            // 手動添加BC的安全模式:https://blog.csdn.net/Roy_70/article/details/70842322
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            JcePKCSPBEInputDecryptorProviderBuilder builder =
                    new JcePKCSPBEInputDecryptorProviderBuilder().setProvider("BC");
            InputDecryptorProvider idp = builder.build(passwd.toCharArray());
            pki = epki.decryptPrivateKeyInfo(idp);
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
            return converter.getPrivateKey(pki).getEncoded();
        }
     }

秘鑰文件放置在模塊的resource目錄下,也可以自行更改文件讀取方式

3、另外附上自己寫的完整的RSA分段加解密

import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.io.FileUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.operator.InputDecryptorProvider;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;

import org.bouncycastle.pkcs.jcajce.JcePKCSPBEInputDecryptorProviderBuilder;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.StringReader;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Arrays;

public class RsaBigDataUtil {

    private static final String PUBLIC_KEY_FILE = "pubkey.pem";
    private static final String PRIVATE_KEY_FILE = "prikey.pem";

    /**
     * 私鑰分段解密
     *
     * @param privateKey 私鑰
     * @param context    密文
     * @param len        公鑰長度
     * @return 解密后的明文比特流
     */
    public static byte[] decrypt(byte[] privateKey, byte[] context, int len) {
        RSA rsa = new RSA(privateKey, null);
        ByteBuffer srcByteBuffer = ByteBuffer.wrap(context);
        int splitCount = (int) Math.ceil((double) context.length / (double) (len * 2));        // 向上取整得分段數(shù)
        ByteBuffer resByteBuffer = ByteBuffer.allocate(splitCount * len);
        int splitIndex = 1;
        int length = 0;
        while (splitIndex <= splitCount) {
            // 當(dāng)本次被解密數(shù)據(jù)的最后一位長度擴(kuò)張后會超過緩沖區(qū)長度的時候減小數(shù)據(jù)容器的長度
            byte[] temp_mi = new byte[srcByteBuffer.limit() < splitIndex * len * 2 ? len : len * 2];
            srcByteBuffer.get(temp_mi, 0, temp_mi.length);
            byte[] temp_min = rsa.decrypt(temp_mi, KeyType.PrivateKey);
            resByteBuffer.put(temp_min, 0, temp_min.length);
            length += temp_min.length;
            splitIndex++;
        }
        return Arrays.copyOfRange(resByteBuffer.array(), 0, length);
    }

    /**
     * 公鑰分段加密
     *
     * @param publicKey 公鑰
     * @param context   明文
     * @param len       公鑰長度
     * @return 加密后的密文比特?cái)?shù)組
     */
    public static byte[] encrypt(byte[] publicKey, byte[] context, int len) {
        RSA rsa = new RSA(null, publicKey);
        ByteBuffer srcByteBuffer = ByteBuffer.wrap(context);
        int splitCount = (int) Math.ceil((double) context.length / (double) len);
        // 由于加密后密文會膨脹,但最大大小是切片數(shù)*兩倍的塊大小
        ByteBuffer resByteBuffer = ByteBuffer.allocate(splitCount * len * 2);
        int splitIndex = 1;
        int length = 0;
        while (splitIndex <= splitCount) {
            byte[] temp_min = new byte[splitCount == splitIndex ? (context.length - (splitCount - 1) * len) : len];
            srcByteBuffer.get(temp_min, 0, temp_min.length);
            byte[] temp_mi = rsa.encrypt(temp_min, KeyType.PublicKey);
            resByteBuffer.put(temp_mi, 0, temp_mi.length);
            length += temp_mi.length;
            splitIndex++;
        }
        return Arrays.copyOfRange(resByteBuffer.array(), 0, length);
    }

    /**
     * 讀取公鑰文件
     * @return 公鑰的byte數(shù)組,可以通過Base64編碼轉(zhuǎn)為字符串
     * */
    public static byte[] readPublicKeyFromPem() throws Exception {
        File file = ResourceUtils.getFile("classpath:".concat(PUBLIC_KEY_FILE));
        String encrypted = FileUtil.readString(file, StandardCharsets.UTF_8);
        encrypted = encrypted.replace("-----BEGIN PUBLIC KEY-----","");
        encrypted = encrypted.replace("-----END PUBLIC KEY-----","");
        return Base64Decoder.decode(encrypted);
    }

    /**
     * 讀取帶密碼保護(hù)的私鑰文件
     * @param passwd 保護(hù)密碼
     * @return 私鑰的byte數(shù)組,可以通過Base64編碼轉(zhuǎn)為字符串
     */
    public static byte[] readPrivateKeyFromPem(String passwd) throws Exception {
        File file = ResourceUtils.getFile("classpath:".concat(PRIVATE_KEY_FILE));
        String encrypted = FileUtil.readString(file, StandardCharsets.UTF_8);
        // 讀取帶密碼保護(hù)的私鑰:https://cloud.tencent.com/developer/article/2186682?from=15425
        PrivateKeyInfo pki;
        try (PEMParser pemParser = new PEMParser(new StringReader(encrypted))) {
            Object o = pemParser.readObject();
            PKCS8EncryptedPrivateKeyInfo epki = (PKCS8EncryptedPrivateKeyInfo) o;
            // 手動添加BC的安全模式:https://blog.csdn.net/Roy_70/article/details/70842322
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            JcePKCSPBEInputDecryptorProviderBuilder builder =
                    new JcePKCSPBEInputDecryptorProviderBuilder().setProvider("BC");
            InputDecryptorProvider idp = builder.build(passwd.toCharArray());
            pki = epki.decryptPrivateKeyInfo(idp);
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
            return converter.getPrivateKey(pki).getEncoded();
        }
    }
}

代碼只實(shí)現(xiàn)了基礎(chǔ)功能,還有很多不足,歡迎各位大佬指正

4、附上一個基礎(chǔ)的使用案例

    void encrypt() throws Exception {
        String content = "114514";
        System.out.println("原文:"+content);
        byte[] mi = RsaBigDataUtil.encrypt(RsaBigDataUtil.readPublicKeyFromPem(), content.getBytes(StandardCharsets.UTF_8), 256);
        String base64 = Base64Encoder.encode(mi);
        System.out.println("加密:"+base64);
        byte[] min = RsaBigDataUtil.decrypt(RsaBigDataUtil.readPrivateKeyFromPem("yourPasswd"),mi,256);
        System.out.println("解密:"+new String(min, StandardCharsets.UTF_8));
    }

測試用的密鑰對可以在RSA加密/解密 - 在線工具 (try8.cn)在線生成

JAVA 解密被密碼保護(hù)的pem私鑰文件

下載好的秘鑰放置在項(xiàng)目的resource目錄下(或者自己重寫文件讀取方法)

JAVA 解密被密碼保護(hù)的pem私鑰文件

記得將代碼中的文件名替換為自己的?

JAVA 解密被密碼保護(hù)的pem私鑰文件文章來源地址http://www.zghlxwxcb.cn/news/detail-459948.html

到了這里,關(guān)于JAVA 解密被密碼保護(hù)的pem私鑰文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 密碼管家:保護(hù)你的密碼安全的最佳選擇

    密碼管家:保護(hù)你的密碼安全的最佳選擇

    在現(xiàn)代社會中,我們每個人都面臨著一個共同的問題:賬號密碼太多,記不住。同時,我們也擔(dān)心密碼泄露,導(dǎo)致個人信息的安全受到威脅。為了解決這些問題,我向大家推薦一款最專業(yè)安全的本地密碼管理工具——密碼管家。 密碼管家是一款簡單實(shí)用的專業(yè)密碼管理軟件,

    2024年02月09日
    瀏覽(25)
  • Excel去除表格密碼保護(hù)

    表格受密碼保護(hù)時,我們修改數(shù)據(jù)Excel彈出“您試圖更改的單元格或圖表受保護(hù),因而是只讀的。 若要修改受保護(hù)單元格或圖表,請先使用‘撤消工作表保護(hù)’命令(在‘審閱’選項(xiàng)卡的‘更改’組中)來取消保護(hù)。 可能會提示輸入密碼。這時候我們可以用VBA宏代碼破解法來破

    2024年02月16日
    瀏覽(24)
  • Excel表格密碼保護(hù)解除

    表格受密碼保護(hù)時,我們修改數(shù)據(jù)Excel彈出“您試圖更改的單元格或圖表受保護(hù),因而是只讀的。 若要修改受保護(hù)單元格或圖表,請先使用‘撤消工作表保護(hù)’命令(在‘審閱’選項(xiàng)卡的‘更改’組中)來取消保護(hù)。 可能會提示輸入密碼。這時候我們可以用VBA宏代碼破解法來破

    2024年02月06日
    瀏覽(21)
  • 私密相冊管家-加密碼保護(hù)私人相冊照片安全

    私密相冊管家-加密碼保護(hù)私人相冊照片安全

    App Store史上最安全、最強(qiáng)大、最卓越的私密相冊App!再也不用擔(dān)心私密照片視頻被別人看見了!?私密相冊為你提供多重密碼保護(hù)機(jī)制、簡單便捷的照片存儲空間,完美地將你的私密照片遠(yuǎn)離一切惡意偷窺者的窺探!? 【產(chǎn)品功能】? √ 支持登陸密碼:沒有你的密碼,任何

    2024年02月12日
    瀏覽(20)
  • 加固密碼安全:保護(hù)您的個人信息

    加固密碼安全:保護(hù)您的個人信息

    一、引言 在數(shù)字化時代,密碼安全是保護(hù)個人信息和數(shù)據(jù)的重要環(huán)節(jié)。然而,許多人在創(chuàng)建和管理密碼時存在一些常見的安全漏洞,如使用弱密碼、重復(fù)使用密碼等。本文將詳細(xì)介紹密碼安全的重要性,并提供一些有效的方法和技巧,幫助您加固密碼安全,保護(hù)個人信息不被

    2024年01月21日
    瀏覽(17)
  • 密碼學(xué)的社會網(wǎng)絡(luò):如何保護(hù)社交網(wǎng)絡(luò)的安全

    社交網(wǎng)絡(luò)已經(jīng)成為了現(xiàn)代人們生活中不可或缺的一部分,它們?yōu)槲覀兲峁┝艘环N與家人、朋友和同事保持聯(lián)系的方式。然而,這種聯(lián)系也帶來了一些挑戰(zhàn),因?yàn)樯缃痪W(wǎng)絡(luò)上的數(shù)據(jù)經(jīng)常被盜、篡改或泄露。因此,保護(hù)社交網(wǎng)絡(luò)的安全至關(guān)重要。 在這篇文章中,我們將探討密碼學(xué)

    2024年02月20日
    瀏覽(36)
  • 如何在NodeJs中使用Bcrypt來保護(hù)用戶密碼

    ? ? ? ? 不管你給你的程序進(jìn)行了多少加密,黑客都可能有一萬種辦法黑進(jìn)你的數(shù)據(jù)庫。一個成熟的軟件必須要有額外的加密系統(tǒng)。這樣,即使數(shù)據(jù)庫真的被攻破,我們也可以更好地保護(hù)我們的用戶信息。這就是Bcrypt的作用,加鹽salt和散列hash 注意:本文僅僅講解Bcrypt的作用

    2024年02月09日
    瀏覽(24)
  • 讀所羅門的密碼筆記14_數(shù)據(jù)隱私保護(hù)

    讀所羅門的密碼筆記14_數(shù)據(jù)隱私保護(hù)

    1.2.6.1.??????????? 將數(shù)據(jù)隱私作為除了自己的公司和他對抓捕壞人的熱情以外的又一追求目標(biāo) 2.3.3.1.??????????? 隨著認(rèn)知機(jī)器進(jìn)一步融入我們的生活,這種困境只會加劇,還會導(dǎo)致新的兩難局面 2.3.3.2.??????????? 如果沒有想清楚這些問題和其他代表性問題,

    2024年04月09日
    瀏覽(23)
  • 保護(hù)網(wǎng)絡(luò)安全的新方法:密碼技術(shù)創(chuàng)新與發(fā)展

    保護(hù)網(wǎng)絡(luò)安全的新方法:密碼技術(shù)創(chuàng)新與發(fā)展

    ? ? ? ?隨著互聯(lián)網(wǎng)的日益普及,我們的生活和工作越來越離不開網(wǎng)絡(luò)。然而,隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡(luò)安全問題也逐漸變得越來越嚴(yán)重。在這樣的背景下,密碼技術(shù)和加密技術(shù)顯得尤為重要。不同于傳統(tǒng)的加密技術(shù),現(xiàn)代的密碼技術(shù)和加密技術(shù)已經(jīng)投入大量的研究,旨在提

    2024年02月04日
    瀏覽(28)
  • 密碼安全:保護(hù)你的數(shù)據(jù)不被入侵的重要性

    密碼安全:保護(hù)你的數(shù)據(jù)不被入侵的重要性

    在數(shù)字時代,密碼安全是保護(hù)個人和機(jī)構(gòu)數(shù)據(jù)的關(guān)鍵。然而,不安全的密碼可能導(dǎo)致嚴(yán)重的后果,包括個人隱私泄露、金融損失和聲譽(yù)受損等。本文將探討密碼安全的重要性,揭示不安全密碼的危害,列舉一些因密碼不安全而發(fā)生的真實(shí)事件,介紹安全的密碼特征以及不安全

    2024年03月09日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包