亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

聊聊公鑰私鑰

Stardustsky / 1816人閱讀

摘要:是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被推薦為公鑰數(shù)據(jù)加密標準。算法基于一個十分簡單的數(shù)論事實將兩個大素數(shù)相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。

在編程中,我們?yōu)榱吮WC數(shù)據(jù)安全,免不了要經(jīng)常進行數(shù)據(jù)加密,于是產(chǎn)生了各種各樣的加密算法.無論怎樣,都還是存在被破解的風險.今天就來說說RSA算法.
背景

RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發(fā)的。RSA取名來自開發(fā)他們?nèi)叩拿?。RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標準。RSA算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。

雖然上面的解釋很深奧,但是你只要知道,這個算法非常安全就行了.

加密解密過程

假設有兩個用戶A,B. B在它的一側(cè),生成了公鑰和私鑰,私鑰只有B自己知道,然后把公鑰分享給A,當然不僅是A,B的公鑰只要分享給了所有他信賴的人,那么這些人都將能解密A的數(shù)據(jù).

過程1:
A使用B的公鑰加密數(shù)據(jù),然后B使用私鑰解密數(shù)據(jù).這時所有擁有公鑰的用戶是不能解密數(shù)據(jù)的,因為他們沒有私鑰.這個數(shù)據(jù)只有A和B能夠獲取,這就保證了數(shù)據(jù)的安全.

過程2:
B使用私鑰加密數(shù)據(jù),那么所有有公鑰的用戶都可以使用公要解密數(shù)據(jù).其他沒有公鑰的人是沒有辦法獲取到數(shù)據(jù)的,這也保證了數(shù)據(jù)的安全性.

非對稱加密

通過上面的過程,我們可以看到這樣一個不同于以往加密算法的現(xiàn)象,那就是非對稱.什么是非對稱?

你不能通過自己的加密密鑰,反向解密,這個過程是不可逆的,正是因為如此才大大提高了它的安全性.公鑰和私鑰都可以進行加密解密,但他們必須配對使用.在私鑰被高度保護的情況下,永遠不會出現(xiàn)被破解的可能.

java實現(xiàn)
package com.mike;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;

/**
 * The class Rsa.java
 */
public class Rsa {

    private static String PUBLIC_KEY_FILE = "C:myPublicKey";
    private static String PRIVATE_KEY_FILE = "C:myPrivateKey";

    /**
     * 初始化密鑰
     *
     * @return
     */
    public static void productKey() {
        try {
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(1024);
            KeyPair keyPair = keyGen.generateKeyPair();// 生成密鑰對
            Key pubKey = keyPair.getPublic(); // 獲取公鑰
            Key priKey = keyPair.getPrivate(); // 獲取私鑰
            ObjectOutputStream oos1 = null;
            ObjectOutputStream oos2 = null;
            try {
                /** 用對象流將生成的密鑰寫入文件 */
                oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
                oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
                oos1.writeObject(pubKey);
                oos2.writeObject(priKey);
            } catch (Exception e) {
                throw e;
            } finally {
                /** 清空緩存,關(guān)閉文件輸出流 */
                oos1.close();
                oos2.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 公鑰加密方法 私鑰加密也一樣
     * 
     * @param source
     *            源數(shù)據(jù)
     * @return
     * @throws Exception
     */
    public static String encrypt(String source) throws Exception {
        Key publicKey;
        ObjectInputStream ois = null;
        try {
            /** 將文件中的公鑰對象讀出 */
            ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
            publicKey = (Key) ois.readObject();
        } catch (Exception e) {
            throw e;
        } finally {
            ois.close();
        }

        /** 得到Cipher對象來實現(xiàn)對源數(shù)據(jù)的RSA加密 */
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] b = source.getBytes();
        /** 執(zhí)行加密操作 */
        byte[] b1 = cipher.doFinal(b);
        return Base64.encodeBase64String(b1);
    }

    /**
     * 私鑰解密算法 公鑰解密一樣
     * 
     * @param cryptograph
     *            密文
     * @return
     * @throws Exception
     */
    public static String decrypt(String cryptograph) throws Exception {
        Key privateKey;
        ObjectInputStream ois = null;
        try {
            /** 將文件中的私鑰對象讀出 */
            ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
            privateKey = (Key) ois.readObject();
        } catch (Exception e) {
            throw e;
        } finally {
            ois.close();
        }

        /** 得到Cipher對象對已用公鑰加密的數(shù)據(jù)進行RSA解密 */
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] b1 = Base64.decodeBase64(cryptograph);

        /** 執(zhí)行解密操作 */
        byte[] b = cipher.doFinal(b1);
        return new String(b);
    }

    public static void main(String[] args) throws Exception {
        Rsa.productKey();
        String msg = "我是加密信息";
        String encryt = Rsa.encrypt(msg);
        System.out.println("加密后的字符:"+encryt);
        System.out.println("解密后的字符:"+Rsa.decrypt(encryt));
    }
}

這樣有了密鑰文件,你就可以進行加密和簽名了.歡迎公眾我的公眾號mike啥都想搞,學習更多有趣的東西.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73824.html

相關(guān)文章

  • 聊聊加密那點事——PHP加密最佳實踐

    摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變?yōu)橐欢慰瓷先]有任何意義的字符,必須通過事先約定的解密規(guī)則才能將...

    lcodecorex 評論0 收藏0
  • 聊聊加密那點事——PHP加密最佳實踐

    摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變?yōu)橐欢慰瓷先]有任何意義的字符,必須通過事先約定的解密規(guī)則才能將...

    Mr_zhang 評論0 收藏0
  • PHP RSA2 簽名算法

    摘要:什么是是在原來簽名算法的基礎上,新增了支持的簽名算法。的簽名算法會繼續(xù)提供支持,但為了您的應用安全,強烈建議使用的簽名算法。 什么是RSA2? RSA2是在原來SHA1WithRSA簽名算法的基礎上,新增了支持SHA256WithRSA的簽名算法。 該算法在摘要算法上比SHA1WithRSA有更強的安全能力。 SHA1WithRSA的簽名算法會繼續(xù)提供支持,但為了您的應用安全,強烈建議...

    derek_334892 評論0 收藏0
  • HTTP2和HTTPS來不來了解一下?

    摘要:一端用私鑰加密,另一端用公鑰解密,也確保了來源目前現(xiàn)在好像使用了數(shù)字簽名就萬無一失了,其實還有問題。如果公鑰被偽造了,后面的數(shù)字簽名其實就毫無意義了。具有校驗機制,一旦被篡改,通信雙方會立刻發(fā)現(xiàn)。配備身份證書,防止身份被冒充。 一、前言 只有光頭才能變強 HTTP博文回顧: PC端:HTTP就是這么簡單 PC端:HTTP面試題都在這里 微信公眾號端:HTTP就是這么簡單 微信公眾號端...

    asce1885 評論0 收藏0
  • 區(qū)塊鏈之公鑰、私鑰、地址之間的關(guān)系

    摘要:公鑰哈希和錢包地址可以通過互逆運算進行轉(zhuǎn)換,所以它們是等價的。使用私鑰對交易進行簽名比特幣錢包間的轉(zhuǎn)賬是通過交易實現(xiàn)的。使用公鑰對簽名進行驗證交易數(shù)據(jù)被廣播到比特幣網(wǎng)絡后,節(jié)點會對這個交易數(shù)據(jù)進行檢驗,其中就包括對簽名的校驗。 一句話解釋公鑰、私鑰、地址私鑰:實際上是一組隨機數(shù),關(guān)于區(qū)塊鏈中的隨機數(shù)我們已經(jīng)介紹過了公鑰:對私鑰進行橢圓曲線加密算法生成,但是無法通過公鑰倒推得到私鑰。公...

    104828720 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<