Java实现RSA加密示例代码

系列文章目录



前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。公钥加密–私钥解密,私钥加密–公钥解密
在这里插入图片描述
示例代码

import cn.hutool.core.codec.Base64;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
 
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
 
/**
 * RSA加密解密
 **/
@Data
@Service
public class RsaUtils {
    public static void main(String[] args) throws Exception {
        RsaUtils rsaUtils = new RsaUtils();
        RsaKeyPair rsaKeyPair = rsaUtils.generateKeyPair();
 
        rsaUtils.setPrivateKey(rsaKeyPair.getPrivateKey());
        rsaUtils.setPublicKey(rsaKeyPair.getPublicKey());
 
        System.out.println("私钥:" + rsaKeyPair.getPrivateKey());
        System.out.println("公钥:" + rsaKeyPair.getPublicKey());
 
        // 公钥加密,私钥解密
        String rePub = rsaUtils.encryptByPublicKey("duosuna.com");
        System.out.println("公钥 加密后:" + rePub);
        System.out.println("私钥 解密后:" + rsaUtils.decryptByPrivateKey(rePub));
 
        // 私钥加密,公钥解密
        String rePri = rsaUtils.encryptByPrivateKey("duosuna.com");
        System.out.println("私钥 加密后:" + rePri);
        System.out.println("公钥 解密后:" + rsaUtils.decryptByPublicKey(rePri));
    }
 
    /**
     * Rsa 私钥
     */
    @Value("${rsa.privateKey}")
    private String privateKey;
    /**
     * Rsa 公钥
     */
    @Value("${rsa.publicKey}")
    private String publicKey;
 
    /**
     * 私钥加密
     * @param text             待加密的信息
     * @return 加密后的文本
     */
    public String encryptByPrivateKey(String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encode(result);
    }
 
    /**
     * 私钥解密
     * @param text             待解密的文本
     * @return 解密后的文本
     */
    public String decryptByPrivateKey(String text) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decode(text));
        return new String(result);
    }
 
    /**
     * 公钥加密
     * @param text            待加密的文本
     * @return 加密后的文本
     */
    public String encryptByPublicKey(String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(publicKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encode(result);
    }
 
    /**
     * 公钥解密
     * @param text            待解密的信息
     * @return 解密后的文本
     */
    public String decryptByPublicKey(String text) throws Exception {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(publicKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(Base64.decode(text));
        return new String(result);
    }
 
    /**
     * 构建RSA密钥对
     * @return 生成后的公私钥信息
     */
    public RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        String publicKeyString = Base64.encode(rsaPublicKey.getEncoded());
        String privateKeyString = Base64.encode(rsaPrivateKey.getEncoded());
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }
 
    /**
     * RSA密钥对对象
     */
    @Data
    @AllArgsConstructor
    public class RsaKeyPair {
        private String publicKey;
        private String privateKey;
    }
}

这里密钥对数是按2048进行的,可以修改为其他,也可以使用一些在线工具进行RSA加密解密的测试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java毕设王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值