Java实现RSA加解密工具

文章目录


依赖

<dependency>
	<groupId>commons-codec</groupId>
	<artifactId>commons-codec</artifactId>
	<version>1.15</version>
</dependency>

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.26</version>
	<optional>true</optional>
</dependency>

代码

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

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;

@Slf4j
public class RsaUtil {
    private static final String PUBLIC_KEY_DEFAULT = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlty0Ddpevqk2QpGDh1O4mfnMNFfrf60ln0Qsd3Z+eWh5yj/B15WtBPtb3s2Auftttjr6xjM9s2e+mPJBUp9Q99DdTMS0vcuwDDvDFT7vHb73vuf4wX98s1Mrvj87i10HL33M0DlE9DmWeDAC8nI8+YynCxKb6qNKLMPedq9WPwmvG8nSZa5NeOMcypdvrs8hY8JDaAtt1vGlIVYsTTd7X6ZHxdcGHPr0Qm9FCUaGdJdJH8xQ7xRn7eBoK6yMKJ+oYxqDaxPsqsRfMo6eXSDOrbIKSIvwAFeZZPK9ppLbz8/0kXfooJW1CbA0ufC5+mwv32akAFdddHCr1fEy6pu2hwIDAQAB";
    private static final String PRIVATE_KEY_DEFAULT = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCW3LQN2l6+qTZCkYOHU7iZ+cw0V+t/rSWfRCx3dn55aHnKP8HXla0E+1vezYC5+222OvrGMz2zZ76Y8kFSn1D30N1MxLS9y7AMO8MVPu8dvve+5/jBf3yzUyu+PzuLXQcvfczQOUT0OZZ4MALycjz5jKcLEpvqo0osw952r1Y/Ca8bydJlrk144xzKl2+uzyFjwkNoC23W8aUhVixNN3tfpkfF1wYc+vRCb0UJRoZ0l0kfzFDvFGft4GgrrIwon6hjGoNrE+yqxF8yjp5dIM6tsgpIi/AAV5lk8r2mktvPz/SRd+iglbUJsDS58Ln6bC/fZqQAV110cKvV8TLqm7aHAgMBAAECggEAbh9W85HGfUiJihgsObl8VDFKxZ60EjPy9YpPJzkA42DHHkJiHhts++j7y+yYnaoSEOaGre0zieUd9QlJc6VF9k+pauNfx/eKX7O0GKsi4sTGlb1BEQYdoc0BblM8BOP4XctnmUtksR3kX4E0dYO8TLFGMkf4NlPRzlF/74TX4RTxaJgFhDKefIr7Oshwq8rEb1vvXXR/CdgSysU2Zg8mY0dz0kFKrCRMVMUKCA5b++mPgf91jVn1MCueu+Bl8YHepBOx+p/RTZ4afSSzIT3/BLD+QffFiHrw2xMpa6DcMWgQTZSXqQr9tquXE8n9ffYn+QhC8UnXuKL6WOPYG7UBaQKBgQDX3Jzxa9vZbrCX3q7GNKZz9prexON4eUR2y0Hyu/9NmVeMI5CR5j4eAb11DXMuVZih++LGBdL5Vz1MEr50M8SdrVV+ws8kno/eNja4JrrdjyKSs7f8sdzPO5s6iHcuiqC6tjrXILCJU9WtBwB0fOxB9m73cNNytfBaDHp6k7PpjQKBgQCy6f8kDDP4rQSvzBjkBNs/n2v+IEZxK98a5VfwaI62RdnSrDegPenzeGj/pEbIKM+5qdbIjxbPvYKIGuHvud01U/OjZWJThWuQCD5cilUYOmyrAeRrQnKKpEV7JpKE4fhnVr8oIHObbPDXRp910WNoSDrRFeR7FkpnyAzL+yg5YwKBgF9tG8RuViZtFIxO2RyuMdeZ8SUCDT04/tc1S9Yu3dJEM7u0DTkye8twIX0ZkQ2usWcKn1nDQV0Q//wdXSyppgW+lskO/dvGbPtjJBWMqZdAq5wG7xM63c6PHzRlF6rvhdaEsMZhoSlUcmWnbsAQabFPbAbfTdqsK7DjS1Hc8fARAoGAfbIt4Up9fNk5cLSoTBIpYuKDAY/1TW8wGHpGNQ2QLfiXFw6NKhQ1eCsBQZFNdTRO9DahQlhdA2g1+58/WqevBNdNVV9WHC2hKxjPjz5UmGf7jo0OyFhvln3gnquzxo3ncdqdA/kAn5KDBguE3kZUW6BbSifiVKONdKo0a16xnNcCgYA0J0fSy1syK7tzBDt1yXP5IUOEm81/JtNuIiB0ycGA6b52MsYR3HbxLmjvFtz5ZnJT2/yaQp9KcnEcpCAYpjJ1zoacWIJ+WKCjlaFA6IoDziROmmipbn3Iriv8Dm6MVZxpLXu2M687QIa6BHiFzvHZodT2hxV3g0TY7oR/+3Rhjw==";

    /**
     * 私钥解密
     *
     * @param privateKeyStr 私钥
     * @param text          待解密文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String privateKeyStr, String text) {
        try {
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] result = cipher.doFinal(Base64.decodeBase64(text));
            return new String(result);
        } catch (Exception e) {
            log.error("decryptByPrivateKey error: ", e);
        }
        return null;
    }

    public static String decryptByPrivateKey(String text) {
        return decryptByPrivateKey(PRIVATE_KEY_DEFAULT, text);
    }

    /**
     * 公钥解密
     *
     * @param publicKeyStr 公钥
     * @param text         待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPublicKey(String publicKeyStr, String text) {
        try {
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
            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.decodeBase64(text));
            return new String(result);
        } catch (Exception e) {
            log.error("decryptByPublicKey error: ", e);
        }
        return null;
    }

    public static String decryptByPublicKey(String text) {
        return decryptByPublicKey(PUBLIC_KEY_DEFAULT, text);
    }

    /**
     * 私钥加密
     *
     * @param privateKeyStr 私钥
     * @param text          待加密的文本
     * @return 加密后的文本
     */
    public static String encryptByPrivateKey(String privateKeyStr, String text) {
        try {
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
            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.encodeBase64String(result);
        } catch (Exception e) {
            log.error("encryptByPrivateKey error: ", e);
        }
        return null;
    }

    public static String encryptByPrivateKey(String text) {
        return encryptByPrivateKey(PRIVATE_KEY_DEFAULT, text);
    }

    /**
     * 公钥加密
     *
     * @param publicKeyStr 公钥
     * @param text         待加密的文本
     * @return 加密后的文本
     */
    public static String encryptByPublicKey(String publicKeyStr, String text) {
        try {
            X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] result = cipher.doFinal(text.getBytes());
            return Base64.encodeBase64String(result);
        } catch (Exception e) {
            log.error("encryptByPublicKey error: ", e);
        }
        return null;
    }

    public static String encryptByPublicKey(String text) {
        return encryptByPublicKey(PUBLIC_KEY_DEFAULT, text);
    }

    
    @Getter
    @ToString
    @AllArgsConstructor
    public static class RsaKeyPair {
        private final String publicKey;
        private final String privateKey;
    }

    /**
     * 构建RSA密钥对
     *
     * @return 生成后的公私钥信息
     */
    public static RsaKeyPair generateKeyPair() {
        try {
            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.encodeBase64String(rsaPublicKey.getEncoded());
            String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
            return new RsaKeyPair(publicKeyString, privateKeyString);
        } catch (Exception e) {
            log.error("generateKeyPair error: ", e);
        }
        return null;
    }


    public static void main(String[] args) {
        // 生成密钥对
        RsaKeyPair keyPair = generateKeyPair();
        System.out.println("publicKey: " + keyPair.getPublicKey());
        System.out.println("privateKey: " + keyPair.getPrivateKey());
        System.out.println();
        // 私钥加密公钥解密
        String s = "私钥加密公钥解密 jx9j2jjkxw2xwx2`,z.;m,=4;'x..";
        System.out.println("加密前:" + s);
        String encryptByPrivateKey = encryptByPrivateKey(keyPair.getPrivateKey(), s);
        System.out.println("加密后: " + encryptByPrivateKey);
        System.out.println("解密后:" + decryptByPublicKey(keyPair.getPublicKey(), encryptByPrivateKey));
        System.out.println();
        // 公钥加密私钥解密
        s = "公钥加密私钥解密 28sis9ks202osmkzi2m[[1;a=`93.6=.";
        System.out.println("加密前:" + s);
        String encryptByPublicKey = encryptByPublicKey(keyPair.getPublicKey(), s);
        System.out.println("加密后: " +  encryptByPublicKey);
        System.out.println("解密后:" + decryptByPrivateKey(keyPair.getPrivateKey(), encryptByPublicKey));
    }
}
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了实现RSA加解密的图形用户界面,需要使用Java图形界面工具包(Java Swing)来创建窗口和组件。以下是一个简单的RSA加解密GUI示例: ```java import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import javax.crypto.Cipher; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class RSAGUI implements ActionListener { private JFrame frame; private JTextField publicKeyField; private JTextField privateKeyField; private JTextArea inputArea; private JTextArea outputArea; private JButton encryptButton; private JButton decryptButton; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { RSAGUI window = new RSAGUI(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public RSAGUI() { initialize(); } private void initialize() { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); frame = new JFrame(); frame.setBounds(100, 100, 600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); frame.getContentPane().add(panel, BorderLayout.CENTER); panel.setLayout(null); JLabel publicKeyLabel = new JLabel("Public Key:"); publicKeyLabel.setBounds(10, 10, 80, 20); panel.add(publicKeyLabel); publicKeyField = new JTextField(); publicKeyField.setBounds(100, 10, 400, 20); publicKeyField.setEditable(false); panel.add(publicKeyField); JLabel privateKeyLabel = new JLabel("Private Key:"); privateKeyLabel.setBounds(10, 40, 80, 20); panel.add(privateKeyLabel); privateKeyField = new JTextField(); privateKeyField.setBounds(100, 40, 400, 20); privateKeyField.setEditable(false); panel.add(privateKeyField); JLabel inputLabel = new JLabel("Input:"); inputLabel.setBounds(10, 70, 80, 20); panel.add(inputLabel); inputArea = new JTextArea(); inputArea.setBounds(100, 70, 400, 100); panel.add(inputArea); JLabel outputLabel = new JLabel("Output:"); outputLabel.setBounds(10, 190, 80, 20); panel.add(outputLabel); outputArea = new JTextArea(); outputArea.setBounds(100, 190, 400, 100); outputArea.setEditable(false); panel.add(outputArea); encryptButton = new JButton("Encrypt"); encryptButton.setBounds(100, 310, 100, 30); encryptButton.addActionListener(this); panel.add(encryptButton); decryptButton = new JButton("Decrypt"); decryptButton.setBounds(220, 310, 100, 30); decryptButton.addActionListener(this); panel.add(decryptButton); try { // 生成RSA密钥对 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC"); generator.initialize(2048); KeyPair keyPair = generator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); publicKeyField.setText(publicKey.toString()); privateKeyField.setText(privateKey.toString()); } catch (Exception e) { e.printStackTrace(); } } public void actionPerformed(ActionEvent e) { try { if (e.getSource() == encryptButton) { // 使用公钥加密数据 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, publicKeyField.getText()); byte[] input = inputArea.getText().getBytes(); byte[] cipherText = cipher.doFinal(input); outputArea.setText(new String(cipherText)); } else if (e.getSource() == decryptButton) { // 使用私钥解密数据 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC"); cipher.init(Cipher.DECRYPT_MODE, privateKeyField.getText()); byte[] cipherText = inputArea.getText().getBytes(); byte[] plainText = cipher.doFinal(cipherText); outputArea.setText(new String(plainText)); } } catch (Exception ex) { ex.printStackTrace(); } } } ``` 在上面的示例中,通过调用`initialize()`方法创建了一个包含公钥、私钥、输入、输出和加密、解密按钮的窗口。单击加密按钮将使用公钥加密输入区域中的文本,并将结果显示在输出区域中。单击解密按钮将使用私钥解密输入区域中的文本,并将结果显示在输出区域中。需要注意的是,上面的示例中使用的是Bouncy Castle作为Java加密扩展提供者,需要将Bouncy Castle库添加到项目中才能正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值