java rsa加密

生成公钥和私钥

复制代码
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(1024);
KeyPair keyPair = generator.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

// base64编码的公私钥字符串 主要为了存储和还原
// base64编码的的私钥字符串 
System.out.println(new String(Base64.encodeBase64(privateKey.getEncoded())));
// base64编码的公钥字符串
System.out.println(new String(Base64.encodeBase64(publicKey.getEncoded())));
复制代码

 

使用公钥加密 使用私钥解密(或者使用私钥加密  公钥解密)

复制代码
// 使用公钥加密
byte[] obj = "你好".getBytes(StandardCharsets.UTF_8);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] enbs = cipher.doFinal(obj);


// 使用私钥解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] debs = cipher.doFinal(enbs);
复制代码

根据私钥的modules 和 privateExponent 还原私钥

// 一个密钥对 公钥和私钥的modules是一摸一样的
BigInteger bigM = new BigInteger("私钥的modules");
BigInteger bigPriE = new BigInteger("私钥的privateExponent");
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(bigM, bigPriE);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);

根据公钥的modules 和 publicExponent 还原公钥

BigInteger bigM = new BigInteger("公钥的modules");
BigInteger bigPubE = new BigInteger("公钥的publicExponent");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigM, bigPubE);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);

 base64编码公私钥字符串还原公私钥

复制代码
 /**
     * 从base64编码的私钥字符串还原出私钥
     *
     * @param base64EncodePrivateKey base64编码的私钥
     */
    public RSAPrivateKey getPrivateKey(String base64EncodePrivateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] bytes = Base64.decodeBase64(base64EncodePrivateKey);
        // Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys
        // 私钥仅支持 RSAPrivate(Crt)KeySpec 和 PKCS8EncodedKeySpec
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
    }

    /**
     * 从base64编码的公钥字符串还原出公钥
     * @param base64EncodePublicKey base64编码的公钥
     */
    public RSAPublicKey getPublicKey(String base64EncodePublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] bytes = Base64.decodeBase64(base64EncodePublicKey);
        // Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys
        // 公钥仅支持 RSAPublicKeySpec 和 X509EncodedKeySpec
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPublicKey) keyFactory.generatePublic(keySpec);
    }
复制代码

 

posted @   荣超  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示