RSA 非對稱加密

RSA 介紹

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

實現

1.生成密鑰對

    /**
     * 隨機生成RSA密鑰對
     *
     * @param keyLength 密鑰長度,範圍:512~2048
     *                  一般1024
     * @return
     */
    public static KeyPair generateRSAKeyPair(int keyLength) {
        try {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
            kpg.initialize(keyLength);
            return kpg.genKeyPair();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

2.使用公鑰對數據進行加密

 /**
     * 使用公鑰對數據進行加密
     *
     * @param publicKeys 公鑰
     * @param data       數據
     * @return
     */
    public static String encrypt(String publicKeys, byte[] data) {

        X509EncodedKeySpec pubX509 = null;
        PublicKey publicKey = null;
        byte[] bytes = new byte[0];
        try {
            pubX509 = new X509EncodedKeySpec(hexToString(publicKeys));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(pubX509);

            // 加密數據
            Cipher cp = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cp.init(Cipher.ENCRYPT_MODE, publicKey);
            bytes = cp.doFinal(data);

        } catch (Exception e) {
        }
        String string = byteArrayToHexString(bytes);
        return string;
    }

3.用公鑰對字符串進行加密

    /**
     * 用公鑰對字符串進行加密
     *
     * @param data 原文
     */
    public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
        // 得到公鑰
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
        KeyFactory kf = KeyFactory.getInstance(RSA);
        PublicKey keyPublic = kf.generatePublic(keySpec);
        // 加密數據
        Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
        cp.init(Cipher.ENCRYPT_MODE, keyPublic);
        return cp.doFinal(data);
    }

4.用私鑰對字符串進行加密

   /**
     * 私鑰加密
     *
     * @param data       待加密數據
     * @param privateKey 密鑰
     * @return byte[] 加密數據
     */
    public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {
        // 得到私鑰
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
        KeyFactory kf = KeyFactory.getInstance(RSA);
        PrivateKey keyPrivate = kf.generatePrivate(keySpec);
        // 數據加密
        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
        cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);
        return cipher.doFinal(data);
    }

5.用公鑰對字符串進行解密

   /**
     * 公鑰解密
     *
     * @param data      待解密數據
     * @param publicKey 密鑰
     * @return byte[] 解密數據
     */
    public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
        // 得到公鑰
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
        KeyFactory kf = KeyFactory.getInstance(RSA);
        PublicKey keyPublic = kf.generatePublic(keySpec);
        // 數據解密
        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
        cipher.init(Cipher.DECRYPT_MODE, keyPublic);
        return cipher.doFinal(data);
    }

6.用私鑰進行解密

    /**
     * 使用私鑰進行解密
     */
    public static byte[] decryptByPrivateKey(String encrypted, String privateKey) throws Exception {
        // 得到私鑰
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(hexToString(privateKey));
        KeyFactory kf = KeyFactory.getInstance(RSA);
        PrivateKey keyPrivate = kf.generatePrivate(keySpec);

        // 解密數據
        Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
        cp.init(Cipher.DECRYPT_MODE, keyPrivate);

        byte[] arr = cp.doFinal(hexToString(encrypted));
        return arr;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章