這可能是最簡單的RSA算法實現了

沒有任何第三方jar包依賴

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.Cipher;

/**
 * RSA非對稱加密算法
 * 
 * 本示例中有缺陷:
 *  1、RSA限制一次加密最大長度爲117字節,本例中沒有分塊處理
 *  2、RSA限制一次解密最大長度爲128字節,本例中沒有分塊處理
 */
public class RSA {

    private static PublicKey pubKey = null;
    private static PrivateKey priKey = null;

    public static void main(String[] args) throws Exception {
        //生成密鑰對
        generateKeyPair();
        System.out.println("公鑰:" + Base64.getEncoder().encodeToString(pubKey.getEncoded()));
        System.out.println("私鑰:" + Base64.getEncoder().encodeToString(priKey.getEncoded()));
        //加密數據
        String str = "I am YiMi";
        String encryptText = encrypt(str);
        System.out.println("密文:" + encryptText);
        //解密並打印
        System.out.println("解密:" + decrypt(encryptText));
    }

    /**
     * 生成祕鑰對
     * 
     * @throws NoSuchAlgorithmException
     */
    public static void generateKeyPair() throws NoSuchAlgorithmException {

        // 初始化生成器
        KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
        gen.initialize(1024, new SecureRandom());

        // 創建密鑰對
        KeyPair kp = gen.genKeyPair();
        // 拆分存儲祕鑰對
        priKey = kp.getPrivate();
        pubKey = kp.getPublic();

    }

    /**
     * 加密
     * @param data  原明文
     * @return      密文字符串
     * @throws Exception
     */
    public static String encrypt(String data) throws Exception {
        Cipher c = Cipher.getInstance("RSA");
        c.init(Cipher.ENCRYPT_MODE, pubKey);
        return Base64.getEncoder().encodeToString(c.doFinal(data.getBytes()));
    }

    /**
     * 解密
     * @param data  密文
     * @return      解密後的明文
     * @throws Exception
     */
    public static String decrypt(String data) throws Exception {
        Cipher c = Cipher.getInstance("RSA");
        c.init(Cipher.DECRYPT_MODE, priKey);
        return new String(c.doFinal(data.getBytes()));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章