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

RSA雙向加解密(公鑰加密-私鑰解密;私鑰加密-公鑰解密)

這篇具有很好參考價值的文章主要介紹了RSA雙向加解密(公鑰加密-私鑰解密;私鑰加密-公鑰解密)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??????? 非對稱加密算法中,提供一個公鑰一個私鑰。一般情況下,采用公鑰加密、私鑰解密的方式。

??????? 假設有這樣一個場景:服務A與服務B需要通信,通信內容為了安全需要進行加密傳輸,并且服務A與服務B不能互相持有對方的鑰匙。

??????? 我首先想到的是能否利用RSA實現(xiàn)雙向的加解密,查閱了資料后做了一個簡單的實現(xiàn),下面貼出實現(xiàn)原理及代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-510925.html

public class RsaEncryptUtil{
    public static final String PUBLIC_KEY="publicKey";
    public static final String PRIVATE_KEY="privateKey";
    private static final String KEY_STORE = "JKS";

    private static final int MAX_ENCRYPT_LENGTH = 117;
    private static final int MAX_DECRYPT_LENGTH = 128;

    /**
     * 隨機生成RAS公鑰與私鑰字符串,直接返回
     */
    public static Map<String, String> getKeys() {
        KeyPairGenerator keyPairGen;
        try {
            keyPairGen = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RSAException("RSA獲取鑰匙對失敗", e);
        }

        // 初始化密鑰對生成器,密鑰大小為96-1024位
        keyPairGen.initialize(1024,new SecureRandom());
        // 生成一個密鑰對,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        Map<String,String> keyMap = new HashMap<>();
        keyMap.put(PUBLIC_KEY, RSACryptUtil.base64ToStr(keyPair.getPublic().getEncoded()));
        keyMap.put(PRIVATE_KEY, RSACryptUtil.base64ToStr(keyPair.getPrivate().getEncoded()));

        return keyMap;
    }

    /**
     * 獲得KeyStore
     *
     * @param keyStorePath
     * @param password
     */
    private static KeyStore getKeyStore(String keyStorePath, String password) throws Exception {
        FileInputStream is = new FileInputStream(keyStorePath);
        KeyStore ks = KeyStore.getInstance(KEY_STORE);
        ks.load(is, password.toCharArray());
        is.close();
        return ks;
    }

    /**
     * 由KeyStore獲得私鑰
     *
     * @param keyStorePath  KeyStore路徑
     * @param alias         別名
     * @param storePass     KeyStore訪問密碼
     * @param keyPass       私鑰的鑰匙密碼
     */
    private static PrivateKey loadPrivateKey(String keyStorePath, String alias, String storePass, String keyPass) throws Exception {
        KeyStore ks = getKeyStore(keyStorePath, storePass);
        PrivateKey key = (PrivateKey) ks.getKey(alias, keyPass.toCharArray());
        return key;
    }

    /**
     * 由Certificate獲得公鑰
     *
     * @param keyStorePath  KeyStore路徑
     * @param alias         別名
     * @param storePass     KeyStore訪問密碼
     */
    private static PublicKey loadPublicKey(String keyStorePath, String alias, String storePass) throws Exception {
        KeyStore ks = getKeyStore(keyStorePath, storePass);
        PublicKey key = ks.getCertificate(alias).getPublicKey();
        return key;
    }


    /**
     * 公鑰加密
     *
     * @param publicKey     公鑰
     * @param content       明文數(shù)據(jù)
     */
    public static String encryptByPublic(String publicKey, String content){
        if (StringUtils.isEmpty(publicKey)) {
            throw new RSAException("加密公鑰為空, 請設置");
        }
        if(StringUtils.isEmpty(content)){
            throw new RSAException("加密明文為空, 請設置");
        }
        Cipher cipher;
        StringBuilder result = new StringBuilder();
        try {
            // 使用默認RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, RSACryptUtil.loadPublicKey(publicKey));
            byte[] bytes = content.getBytes();
            for (int i = 0; i < bytes.length; i += MAX_ENCRYPT_LENGTH) {
                byte[] subarray = ArrayUtils.subarray(bytes, i, i + MAX_ENCRYPT_LENGTH);
                if(subarray != null && subarray.length > 0){
                    byte[] doFinal = cipher.doFinal(subarray);
                    result.append(RSACryptUtil.base64ToStr(doFinal));
                }
            }
            return result.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RSAException("無此加密算法",e);
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new RSAException("加密公鑰非法,請檢查",e);
        } catch (IllegalBlockSizeException e) {
            throw new RSAException("明文長度非法",e);
        } catch (BadPaddingException e) {
            throw new RSAException("明文數(shù)據(jù)已損壞",e);
        } catch (Exception e) {
            throw new RSAException("未知錯誤",e);
        }
    }

    /**
     * 私鑰解密
     *
     * @param privateKey    私鑰
     * @param content       密文數(shù)據(jù)
     */
    public static String decryptByPrivate(String privateKey, String content){
        if (StringUtils.isEmpty(privateKey)) {
            throw new RSAException("解密私鑰為空, 請設置");
        }
        if(StringUtils.isEmpty(content)){
            throw new RSAException("解密密文為空, 請設置");
        }
        if(content.length() < 4){
            throw new RSAException("解密密文有誤:" + content);
        }
        Cipher cipher;
        StringBuilder result = new StringBuilder();
        try {
            // 使用默認RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, RSACryptUtil.loadPrivateKey(privateKey));
            byte[] bytes = RSACryptUtil.strToBase64(content);
            for (int i = 0; i < bytes.length; i += MAX_DECRYPT_LENGTH) {
                byte[] subarray = ArrayUtils.subarray(bytes, i, i + MAX_DECRYPT_LENGTH);
                if(subarray != null && subarray.length > 0){
                    byte[] doFinal = cipher.doFinal(subarray);
                    result.append(new String(doFinal));
                }
            }
            return result.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RSAException("無此解密算法",e);
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new RSAException("解密私鑰非法,請檢查");
        } catch (IllegalBlockSizeException e) {
            throw new RSAException("密文長度非法",e);
        } catch (BadPaddingException e) {
            throw new RSAException("密文數(shù)據(jù)已損壞",e);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RSAException("未知錯誤",e);
        }
    }


    /**
     * 私鑰加密
     *
     * @param privateKey    私鑰
     * @param content       明文數(shù)據(jù)
     */
    public static String encryptByPrivate(String privateKey,String content){
        if (StringUtils.isEmpty(privateKey)) {
            throw new RSAException("加密私鑰為空, 請設置");
        }
        if(StringUtils.isEmpty(content)){
            throw new RSAException("加密明文為空, 請設置");
        }
        Cipher cipher;
        StringBuilder result = new StringBuilder();
        try {
            // 使用默認RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, RSACryptUtil.loadPrivateKey(privateKey));
            byte[] bytes = content.getBytes();
            for (int i = 0; i < bytes.length; i += MAX_ENCRYPT_LENGTH) {
                byte[] subarray = ArrayUtils.subarray(bytes, i, i + MAX_ENCRYPT_LENGTH);
                if(subarray != null && subarray.length > 0){
                    byte[] doFinal = cipher.doFinal(subarray);
                    result.append(RSACryptUtil.base64ToStr(doFinal));
                }
            }
            return result.toString();
        }catch (NoSuchAlgorithmException e) {
            throw new RSAException("無此加密算法",e);
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new RSAException("加密私鑰非法,請檢查",e);
        } catch (IllegalBlockSizeException e) {
            throw new RSAException("明文長度非法",e);
        } catch (BadPaddingException e) {
            throw new RSAException("明文數(shù)據(jù)已損壞",e);
        }
    }


    /**
     * 公鑰解密
     *
     * @param publicKey     公鑰
     * @param content       密文數(shù)據(jù)
     */
    public static String decryptByPublic(String publicKey, String content){
        if (StringUtils.isEmpty(publicKey)) {
            throw new RSAException("解密公鑰為空, 請設置");
        }
        if(StringUtils.isEmpty(content)){
            throw new RSAException("解密密文為空, 請設置");
        }
        if(content.length() < 4){
            throw new RSAException("解密密文有誤:" + content);
        }
        Cipher cipher;
        StringBuilder result = new StringBuilder();
        try {
            // 使用默認RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, RSACryptUtil.loadPublicKey(publicKey));
            byte[] bytes = RSACryptUtil.strToBase64(content);
            for (int i = 0; i < bytes.length; i += MAX_DECRYPT_LENGTH) {
                byte[] subarray = ArrayUtils.subarray(bytes, i, i + MAX_DECRYPT_LENGTH);
                if(subarray != null && subarray.length > 0){
                    byte[] doFinal = cipher.doFinal(subarray);
                    result.append(new String(doFinal));
                }
            }
            return result.toString();
        }catch (NoSuchAlgorithmException e) {
            throw new RSAException("無此解密算法",e);
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new RSAException("解密公鑰非法,請檢查",e);
        } catch (IllegalBlockSizeException e) {
            throw new RSAException("密文長度非法",e);
        } catch (BadPaddingException e) {
            throw new RSAException("密文數(shù)據(jù)已損壞",e);
        }
    }
}

到了這里,關于RSA雙向加解密(公鑰加密-私鑰解密;私鑰加密-公鑰解密)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 前端js使用jsrsasign,生成RSA秘鑰,獲取一系列信息(公鑰,私鑰,模數(shù),指數(shù)等)進行加密解密

    前言: 之前的項目里用的RSA加解密的時候是生成固定的公鑰(模數(shù),指數(shù))和私鑰放在代碼里進行數(shù)據(jù)的解密?,F(xiàn)在要修改成前端自己生成(模數(shù)和指數(shù))傳給后臺。后臺加密數(shù)據(jù)返回給我。我在用私鑰解密。 后面查了很多,開始的window.crypto里的方法可以生成公鑰和私鑰,

    2024年02月16日
    瀏覽(111)
  • RSA算法習題 (采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。)

    RSA算法習題 (采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。)

    1、采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。 2. 找出質數(shù) P、Q P=11 Q=13 3. 計算公共模數(shù) N = P * Q = 143 4. 歐拉函數(shù) Φ(N) = (P-1)*(Q-1) = 10 *12 = 120 5. 計算公鑰E 1Eφ(N) 所以1E120 E的取值范圍{3,7,9,11,13,17,19,...,117,119} E的取值必須和φ(N)互質 取

    2024年02月09日
    瀏覽(100)
  • 私鑰和公鑰到底是誰來加密、誰來解密?

    私鑰和公鑰到底是誰來加密、誰來解密?

    1.? 應用場景 場景1(第一種用法):用于信息加解密,此時使用公鑰加密,私鑰解密。 場景2(第二種用法):用于數(shù)字簽名,此時使用私鑰簽名,公鑰驗簽。 有點混亂,不要去硬記,你只要這樣想即可: - 既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解

    2023年04月15日
    瀏覽(96)
  • RSA加密,公鑰、私鑰的生成,前端使用公鑰加密,JSEncrypt返回值為false的原因以及解決方法,XML轉換Pkcs1、8

    RSA加密,公鑰、私鑰的生成,前端使用公鑰加密,JSEncrypt返回值為false的原因以及解決方法,XML轉換Pkcs1、8

    非對稱加密算法,兩個且不同的Key,一個公開,一個私密,公開加密,私密解密。 特點: 原文短,加密后密文長 生成相對較慢 安全性超強 我們使用.net進行生成公鑰、私鑰。 使用RSA.ToXmlString(Boolean) 方法生成公鑰以及私鑰,方法中接收一個參數(shù), true ?表示同時包含 RSA 公鑰

    2024年01月21日
    瀏覽(98)
  • 國密sm2公鑰加密 私鑰解密java代碼實現(xiàn)

    目錄 一、引入jar包 二、生成秘鑰對,加解密工具類

    2024年02月11日
    瀏覽(93)
  • 使用非對稱加密(RSA) 實現(xiàn)前端加密后端解密

    使用非對稱加密(RSA) 實現(xiàn)前端加密后端解密

    數(shù)據(jù)加密方式有: 單向加密、對稱加密、非對稱加密、加密鹽、散列函數(shù)、數(shù)字簽名。 1、單向加密 單向加密通過對數(shù)據(jù)進行摘要計算生成密文,密文不可逆推還原。只能加密,不能解密,常用于提取數(shù)據(jù)的指紋信息以此來驗證數(shù)據(jù)的完整性。但是會引發(fā)雪崩效應(雪崩效應

    2024年02月08日
    瀏覽(95)
  • PHP非對稱與對稱雙向加密解密的方式

    目錄 RSA非對稱加密解密: 什么是RSA非對稱加密解密解析: 解析: 為什么使用: 有什么優(yōu)點: DEMO: AES、DES、3DES等對稱加密解密: 解析: 為什么使用: 有什么優(yōu)點: DEMO: 什么是RSA非對稱加密解密解析: 解析: RSA非對稱加密解密算法是一種廣泛應用于信息安全領域的加密算法。它不同于

    2024年02月07日
    瀏覽(29)
  • C# 實現(xiàn)對稱加密算法(AES)與非對稱加密算法(RSA),包含前端加密對應算法實現(xiàn)

    C# 實現(xiàn)對稱加密算法(AES)與非對稱加密算法(RSA),包含前端加密對應算法實現(xiàn)

    一種既簡單速度又快的加密方式,加密與解密使用的都是同一個密鑰,別名又叫做:單密鑰加密;對稱加密有很多公開算法,并且因為它效率很高,所以適用于加密大量數(shù)據(jù)的場合;但其密鑰的傳輸過程是不安全的,并且容易被破解,密鑰管理起來也相對麻煩。 需要兩個密鑰

    2024年02月09日
    瀏覽(36)
  • 20.2 OpenSSL 非對稱RSA加解密算法

    20.2 OpenSSL 非對稱RSA加解密算法

    RSA算法是一種非對稱加密算法,由三位數(shù)學家 Rivest 、 Shamir 和 Adleman 共同發(fā)明,以他們三人的名字首字母命名。RSA算法的安全性基于大數(shù)分解問題,即對于一個非常大的合數(shù),將其分解為兩個質數(shù)的乘積是非常困難的。 RSA算法是一種常用的非對稱加密算法,與對稱加密算法

    2024年02月08日
    瀏覽(25)
  • 【openssl】RSA 生成公鑰私鑰 |通過私鑰獲取公鑰

    【openssl】RSA 生成公鑰私鑰 |通過私鑰獲取公鑰

    通過博客:Window系統(tǒng)如何編譯openssl?編譯出openssl.exe(位于apps文件夾下)。 現(xiàn)在需要使用它獲得公鑰私鑰、通過私鑰獲取公鑰 目錄 說明?。?! 一.定位openssl.exe目錄 二、進入命令cmd 三、生成私鑰 四、已知的私鑰替換模板私鑰 五、通過私鑰生成公鑰 a.生成公鑰私鑰:跳過第四

    2024年02月04日
    瀏覽(98)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包