最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)的RSA加密算法詳解

 更新時(shí)間:2017年06月26日 10:29:55   作者:聽(tīng)著music睡  
這篇文章主要介紹了java實(shí)現(xiàn)的RSA加密算法,結(jié)合實(shí)例形式詳細(xì)分析了RSA加密解密的原理、java實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了java實(shí)現(xiàn)的RSA加密算法。分享給大家供大家參考,具體如下:

一、什么是非對(duì)稱(chēng)加密

1、加密的密鑰與加密的密鑰不相同,這樣的加密算法稱(chēng)之為非對(duì)稱(chēng)加密

2、密鑰分為:公鑰,私鑰

公鑰:可以對(duì)外給任何人的加密和解密的密碼,是公開(kāi)的
私鑰:通過(guò)私鑰可以生成公鑰,但從公鑰被認(rèn)為無(wú)法生成公鑰(被推導(dǎo)出的概率小到不考慮)

3、當(dāng)將要加密的內(nèi)容用公鑰加密的時(shí)候,只能用私鑰來(lái)解密

當(dāng)將要加密的內(nèi)容用私鑰加密的時(shí)候,只能用公鑰來(lái)解密

4、公鑰與私鑰的關(guān)系,利用一個(gè)簡(jiǎn)單的公式來(lái)生成公鑰和私鑰,即非對(duì)稱(chēng)加密的公鑰和私鑰之間存在某一個(gè)公式關(guān)系

5、常見(jiàn)的非對(duì)稱(chēng)加密算法

RSA,DSA

二、什么是RSA算法

RSA算法是一種非對(duì)稱(chēng)密碼算法,所謂非對(duì)稱(chēng),就是指該算法需要一對(duì)密鑰,使用其中一個(gè)加密,則需要用另一個(gè)才能解密。

RSA的算法涉及三個(gè)參數(shù),n、e1、e2。

其中,n是兩個(gè)大質(zhì)數(shù)p、q的積,n的二進(jìn)制表示時(shí)所占用的位數(shù),就是所謂的密鑰長(zhǎng)度。

e1和e2是一對(duì)相關(guān)的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質(zhì);再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密鑰對(duì)。其中(n,e1)為公鑰,(n,e2)為私鑰。

RSA加解密的算法完全相同,設(shè)A為明文,B為密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)

e1和e2可以互換使用,即:

A=B^e1 mod n;B=A^e2 mod n;

三、RSA加密算法的使用

1、RSA密鑰的生成,返回一個(gè)KeyPair對(duì)象

KeyPair 用于非對(duì)稱(chēng)加密,KeyPair中包含了一個(gè)公鑰和一個(gè)私鑰

/**
* 通過(guò)指定的密鑰長(zhǎng)度生成非對(duì)稱(chēng)的密鑰對(duì)
* @param keySize 推薦使用1024,2048 ,不允許低于1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keySize){
    KeyPair ret = null;
    try {
      //1、準(zhǔn)備生成
      KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
      //2、初始化,設(shè)置秘鑰長(zhǎng)度
      generator.initialize(keySize);
      //3、生成,并且返回
      ret = generator.generateKeyPair();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return ret;
}

2、獲取私鑰和公鑰

PublicKey 和 PrivateKey 都是Key類(lèi)型的

KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024);
//獲取公鑰,可以給任何人
PublicKey publicKey = keyPair.getPublic();
 //獲取私鑰
PrivateKey privateKey = keyPair.getPrivate();

3、RSA加密

/**
* RSA 加密
* @param data 需要加密的數(shù)據(jù)
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaEncrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、創(chuàng)建Cipher 使用RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //設(shè)置Key
        cipher.init(Cipher.ENCRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

4、RSA解密

/**
* RSA 解密
* @param data 要解密的數(shù)據(jù)
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaDecrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、創(chuàng)建Cipher 使用RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //設(shè)置Key
        cipher.init(Cipher.DECRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

5、公鑰與私鑰的存儲(chǔ)

一對(duì)公鑰和私鑰創(chuàng)建好之后,我們需要存儲(chǔ)起來(lái)以后使用

//獲得公鑰 私鑰
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//編碼將PublicKey和PrivateKey對(duì)象轉(zhuǎn)換為字節(jié)數(shù)組,該字節(jié)數(shù)組為公鑰、私鑰的實(shí)際數(shù)據(jù)
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
//將字節(jié)數(shù)組通過(guò)Base64編碼算法 編碼成可見(jiàn)的字符形式
String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);
//進(jìn)行存儲(chǔ)操作
 。。。。

6、公鑰與私鑰的加載

通常 1、獲取密鑰對(duì) 2、獲取公鑰、私鑰 3、保存公鑰、私鑰,保存形式基本為字符串形式

那么在以后的使用中就需要獲取公鑰和私鑰來(lái)使用

需要知道:

6.1、KeyFactory可以來(lái)加載相應(yīng)的公鑰和私鑰
6.2、公鑰加載 使用 X509EncodedKeySpec(byte[])
6.3、私鑰加載 使用 PCKS8EncodedKeySpec(byte[])

//獲取公鑰
//str_publickey 為公鑰字符串形式數(shù)據(jù)(公鑰先編碼成byte[] 在 形成字符串)
//解碼
byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
//構(gòu)造X509EncodedKeySpec對(duì)象
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//取得公鑰
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//解碼
//獲取私鑰
//str_private 為私鑰字符串形式的數(shù)據(jù)
byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
//構(gòu)造X509EncodedKeySpec對(duì)象
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
//指定加密算法
keyFactory = KeyFactory.getInstance("RSA");
//取得私鑰
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:

MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password

迅雷、快車(chē)、旋風(fēng)URL加密/解密工具:
http://tools.jb51.net/password/urlrethunder

在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《java日期與時(shí)間操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • MyBatis discriminator標(biāo)簽原理實(shí)例解析

    MyBatis discriminator標(biāo)簽原理實(shí)例解析

    這篇文章主要為大家介紹了MyBatis discriminator標(biāo)簽實(shí)現(xiàn)原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java如何從不規(guī)則的字符串中截取出日期

    java如何從不規(guī)則的字符串中截取出日期

    這篇文章主要介紹了java從不規(guī)則的字符串中截取出日期的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java switch支持的數(shù)據(jù)類(lèi)型詳解

    Java switch支持的數(shù)據(jù)類(lèi)型詳解

    這篇文章主要介紹了Java switch支持的數(shù)據(jù)類(lèi)型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • @valid 無(wú)法觸發(fā)BindingResult的解決

    @valid 無(wú)法觸發(fā)BindingResult的解決

    這篇文章主要介紹了@valid 無(wú)法觸發(fā)BindingResult的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解JavaWeb中的過(guò)濾器Filter

    詳解JavaWeb中的過(guò)濾器Filter

    今天給大家講一下JavaWeb中的過(guò)濾器Filter,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java SpringBoot的相關(guān)知識(shí)點(diǎn)詳解

    Java SpringBoot的相關(guān)知識(shí)點(diǎn)詳解

    這篇文章主要介紹了SpringBoot的相關(guān)知識(shí)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • JavaSE?XML解析技術(shù)的使用方法詳解

    JavaSE?XML解析技術(shù)的使用方法詳解

    XML意為可擴(kuò)展標(biāo)記語(yǔ)言,被多數(shù)技術(shù)人員用以選擇作為數(shù)據(jù)傳輸?shù)妮d體,成為一種通用的數(shù)據(jù)交換格式,下面這篇文章主要給大家介紹了關(guān)于JavaSE?XML解析技術(shù)的使用方法,需要的朋友可以參考下
    2023-04-04
  • Spring、SpringMVC和SpringBoot的區(qū)別及說(shuō)明

    Spring、SpringMVC和SpringBoot的區(qū)別及說(shuō)明

    這篇文章主要介紹了Spring、SpringMVC和SpringBoot的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-10-10
  • Java線程池的分析和使用詳解

    Java線程池的分析和使用詳解

    本篇文章主要介紹了Java線程池的分析和使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • java繪制五子棋棋盤(pán)

    java繪制五子棋棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了java繪制五子棋棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評(píng)論

隆林| 张家港市| 尼木县| 郧西县| 云梦县| 大余县| 新巴尔虎右旗| 南昌县| 积石山| 邮箱| 宣城市| 宁安市| 蒲城县| 镇赉县| 潮州市| 澄城县| 花莲县| 霍林郭勒市| 汾西县| 宁安市| 绥中县| 平顺县| 汾阳市| 桃园市| 忻城县| 汝州市| 安泽县| 织金县| 巩义市| 襄汾县| 西畴县| 泽普县| 赣榆县| 白沙| 石林| 夹江县| 阿城市| 康平县| 新泰市| 淮滨县| 扎兰屯市|