博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取公钥对象
阅读量:2162 次
发布时间:2019-05-01

本文共 3583 字,大约阅读时间需要 11 分钟。

import com.sun.org.apache.xml.internal.security.utils.Base64;import org.apache.commons.io.FileUtils;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.File;import java.nio.charset.Charset;import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;public class RSAdemo {    public static void main(String[] args) throws Exception {        String input = "硅谷";        // 加密算法        String algorithm = "RSA";        PrivateKey privateKey = getPrivateKey("a.pri", algorithm);        PublicKey publicKey = getPublicKey("a.pub", algorithm);        String s = encryptRSA(algorithm, privateKey, input);        String s1 = decryptRSA(algorithm, publicKey, s);        System.out.println(s1);    }    public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{        // 将文件内容转为字符串        String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());        // 获取密钥工厂        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);        // 构建密钥规范 进行Base64解码        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decode(publicKeyString));        // 生成公钥        return keyFactory.generatePublic(spec);    }    /**     * 生成密钥对并保存在本地文件中     *     * @param algorithm : 算法     * @param pubPath   : 公钥保存路径     * @param priPath   : 私钥保存路径     * @throws Exception     */    public static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {        // 获取密钥对生成器        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);        // 获取密钥对        KeyPair keyPair = keyPairGenerator.generateKeyPair();        // 获取公钥        PublicKey publicKey = keyPair.getPublic();        // 获取私钥        PrivateKey privateKey = keyPair.getPrivate();        // 获取byte数组        byte[] publicKeyEncoded = publicKey.getEncoded();        byte[] privateKeyEncoded = privateKey.getEncoded();        // 进行Base64编码        String publicKeyString = Base64.encode(publicKeyEncoded);        String privateKeyString = Base64.encode(privateKeyEncoded);        // 保存文件        FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));        FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));    }    /**     * 解密数据     *     * @param algorithm      : 算法     * @param encrypted      : 密文     * @param key            : 密钥     * @return : 原文     * @throws Exception     */    public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{         // 创建加密对象        // 参数表示加密算法        Cipher cipher = Cipher.getInstance(algorithm);        // 私钥进行解密        cipher.init(Cipher.DECRYPT_MODE,key);        // 由于密文进行了Base64编码, 在这里需要进行解码        byte[] decode = Base64.decode(encrypted);        // 对密文进行解密,不需要使用base64,因为原文不会乱码        byte[] bytes1 = cipher.doFinal(decode);        return new String(bytes1);    }    /**     * 使用密钥加密数据     *     * @param algorithm      : 算法     * @param input          : 原文     * @param key            : 密钥     * @return : 密文     * @throws Exception     */    public static String encryptRSA(String algorithm,Key key,String input) throws Exception{        // 创建加密对象        // 参数表示加密算法        Cipher cipher = Cipher.getInstance(algorithm);        // 初始化加密        // 第一个参数:加密的模式        // 第二个参数:使用私钥进行加密        cipher.init(Cipher.ENCRYPT_MODE,key);        // 私钥加密        byte[] bytes = cipher.doFinal(input.getBytes());        // 对密文进行Base64编码        return Base64.encode(bytes);    }}

 

转载地址:http://pzfzb.baihongyu.com/

你可能感兴趣的文章
了解 Sklearn 的数据集
查看>>
用ARIMA模型做需求预测
查看>>
推荐系统
查看>>
TensorFlow-11-策略网络
查看>>
浅谈 GBDT
查看>>
如何选择优化器 optimizer
查看>>
一文了解强化学习
查看>>
CART 分类与回归树
查看>>
seq2seq 的 keras 实现
查看>>
seq2seq 入门
查看>>
什么是 Dropout
查看>>
用 LSTM 做时间序列预测的一个小例子
查看>>
用 LSTM 来做一个分类小问题
查看>>
详解 LSTM
查看>>
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>