非对称加密算法-RSA

非对称加密算法-RSA

编码文章call10242025-01-06 21:00:1018A+A-
    @Test
    public void test2() throws Exception {
        //原文
        String input = "明文魑魅魍魉";
        //算法
        String algorithm = "RSA";
        //获取私钥对象
        Key privateKey = getPrivateKey(algorithm);
        //获取公钥对象
        Key publicKey = getPublicKey(algorithm);
        //加密
        String encryption = encryption(algorithm, privateKey, input);
        System.out.println(encryption);
        //解密
        String decrypt = decrypt(algorithm, publicKey, encryption);
        System.out.println(decrypt);
    }

    /**
     * 获取私钥对象
     *
     * @param algorithm
     * @return
     * @throws Exception
     */
    public static Key getPrivateKey(String algorithm) throws Exception {
        StringBuilder privateKeyString = new StringBuilder();
        BufferedReader readerPrivate = new BufferedReader(new FileReader("private.txt"));
        String linePrivate;
        while ((linePrivate = readerPrivate.readLine()) != null) {
            privateKeyString.append(linePrivate);
        }
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString.toString()));
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     * 获取公钥对象
     *
     * @param algorithm
     * @return
     * @throws Exception
     */
    public static Key getPublicKey(String algorithm) throws Exception {
        StringBuilder publicKeyString = new StringBuilder();
        BufferedReader readerPublic = new BufferedReader(new FileReader("public.txt"));
        String linePublic;
        while ((linePublic = readerPublic.readLine()) != null) {
            publicKeyString.append(linePublic);
        }
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKeyString.toString()));
        return keyFactory.generatePublic(keySpec);
    }

    /**
     * 加密
     *
     * @param algorithm  算法
     * @param privateKey 私钥加密
     * @param input      明文
     * @return
     * @throws Exception
     */
    public static String encryption(String algorithm, Key privateKey, String input) throws Exception {
        //创建加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        //对加密进行初始化
        //第一个参数:加密的模式
        //第二参数:想使用公钥加密还是私钥加密
        //使用私钥进行加密
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        //加密 :密文
        byte[] bytes = cipher.doFinal(input.getBytes());
        //base64编码
        return Base64.encode(bytes);
    }

    /**
     * 解密
     *
     * @param algorithm 算法
     * @param publicKey 公钥解密
     * @param encode    密文
     * @return
     * @throws Exception
     */
    public static String decrypt(String algorithm, Key publicKey, String encode) throws Exception {
        //创建加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        //公钥解密
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        //base64解码
        byte[] decode = Base64.decode(encode);
        //解密:明文
        byte[] decodeByte = cipher.doFinal(decode);
        return new String(decodeByte);
    }

    /**
     * 生成公钥和私钥文件
     *
     * @throws Exception
     */
    @Test
    public void getPubliceKey() throws Exception {
        //算法
        String algorithm = "RSA";
        //创建密钥对生成器对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        //生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //生成私钥
        PrivateKey aPrivate = keyPair.getPrivate();
        //生成公钥
        PublicKey aPublic = keyPair.getPublic();
        //生成私钥子节数组
        byte[] privateEncoded = aPrivate.getEncoded();
        //生成公钥子节数组
        byte[] publicEncoded = aPublic.getEncoded();
        //对公私钥进行base64编码
        String privateEncodedString = Base64.encode(privateEncoded);
        String publicEncodedString = Base64.encode(publicEncoded);
        Files.write(Paths.get("private.txt"), privateEncodedString.getBytes());
        Files.write(Paths.get("public.txt"), publicEncodedString.getBytes());
    }

效果演示

本地生成公钥和密钥文件

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4