91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RSA加密算法如何在java項目中實現

發布時間:2020-11-24 17:02:22 來源:億速云 閱讀:176 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關RSA加密算法如何在java項目中實現,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、什么是非對稱加密

1、加密的密鑰與加密的密鑰不相同,這樣的加密算法稱之為非對稱加密

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

公鑰:可以對外給任何人的加密和解密的密碼,是公開的
私鑰:通過私鑰可以生成公鑰,但從公鑰被認為無法生成公鑰(被推導出的概率小到不考慮)

3、當將要加密的內容用公鑰加密的時候,只能用私鑰來解密

當將要加密的內容用私鑰加密的時候,只能用公鑰來解密

4、公鑰與私鑰的關系,利用一個簡單的公式來生成公鑰和私鑰,即非對稱加密的公鑰和私鑰之間存在某一個公式關系

5、常見的非對稱加密算法

RSA,DSA

二、什么是RSA算法

RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。

RSA的算法涉及三個參數,n、e1、e2。

其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。

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

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

RSA加解密的算法完全相同,設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密鑰的生成,返回一個KeyPair對象

KeyPair 用于非對稱加密,KeyPair中包含了一個公鑰和一個私鑰

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

2、獲取私鑰和公鑰

PublicKey 和 PrivateKey 都是Key類型的

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

3、RSA加密

/**
* RSA 加密
* @param data 需要加密的數據
* @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、創建Cipher 使用RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //設置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 要解密的數據
* @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、創建Cipher 使用RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //設置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、公鑰與私鑰的存儲

一對公鑰和私鑰創建好之后,我們需要存儲起來以后使用

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

6、公鑰與私鑰的加載

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

那么在以后的使用中就需要獲取公鑰和私鑰來使用

需要知道:

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

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

關于RSA加密算法如何在java項目中實現就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万山特区| 长白| 普安县| 闵行区| 尼玛县| 张掖市| 陈巴尔虎旗| 洪雅县| 汝阳县| 柘荣县| 勐海县| 息烽县| 宜兴市| 内江市| 布尔津县| 即墨市| 安康市| 河东区| 明溪县| 江门市| 沙洋县| 阜康市| 永年县| 东乌珠穆沁旗| 永川市| 和田市| 岗巴县| 广河县| 九寨沟县| 梓潼县| 武汉市| 济阳县| 阜平县| 思南县| 永春县| 尼勒克县| 岑巩县| 宝山区| 易门县| 乌审旗| 泌阳县|