JAVA实现经典的非对称加密算法--RSA加解密

本文介绍了非对称加密算法,特别是RSA算法的工作原理和优缺点。内容包括RSA加解密的过程,强调了PKCS1Padding填充方式的要求,并提供了两个不同的JAVA实现示例,适用于不同场景的RSA加密解密操作。
摘要由CSDN通过智能技术生成

一、什么是非对称加密算法?

  简单点讲,就是加密密钥和解密密钥不一样的一种加密算法。非对称加密是指通过特定算法获取一对密钥对:公钥和私钥,公钥可以对外公开,私钥由你自己保存。我们使用其中一个密钥对数据进行加密,使用另一个密钥对加密后的数据进行解密。

  优点:保密性比较好,不需要用户交换密钥,不适合于对文件加密;

  缺点:加密和解密花费时间长、速度慢,适用于对少量数据进行加密。

  常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

二、RSA加解密

  PKCS1Padding,最常用的填充方式,要求

  输入:必须 比 密钥长度 短至少11个字节, 也就是 KEYSIZE/8 – 11,如果输入的明文过长,必须切割,然后填充

  输出:和密钥长度一样长

  具体算法以及填充方式感兴趣的可以自己去网上找下。

在 pom.xml文件中加入:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

RSAUtil.java:

package com.su.mybatis.mysql.util;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
 
import javax.crypto.Cipher;
 
import org.apache.commons.codec.binary.Base64;
 
/**
 * @Title: RSAUtil.java
 * @author sucb
 * @date 2017年3月28日 下午8:09:41
 */
public final class RSAUtil {
 
    private RSAUtil() {
 
    }
    /**
     * 密钥长度(bit)
     */
    private static final int KEYSIZE = 1024;
 
    /**
    * CIPHER_ALGORITHM RSA
    */
    private static final String CIPHER_ALGORITHM_RSA = "RSA/ECB/PKCS1Padding";
 
    /**
    * RSA加密
    */
    public static final String KEY_ALGORITHM_RSA = "RSA";
 
    /**
    * RSAPublicKey
    */
    private static final String PUBLIC_KEY = "RSAPublicKey";
 
    /**
    * RSAPrivateKey
    */
    private static final String PRIVATE_KEY = "RSAPrivateKey";
 
    /**
    * 获取配对的公钥和私钥
    * @return keyMap
    * @throws Exception 异常
    * @author sucb
    * @date 2017年3月29日下午2:29:51
    */
    public static Map<String, Object> initKey() throws Exception {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA);
        keyPairGen.initialize(KEYSIZE);
        KeyPair keyPair = keyPairGen.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        Map<String, Object> keyMap = new HashMap<String, Object>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;
    }
 
    /**
    * 对公钥进行编码转换,并进行BASE64转码
    * @param keyMap 配对的公钥和私钥组成的map
    * @return 处理后的公钥
    * @throws Exception 异常
    * @author sucb
    * @date 2017年3月29日下午2:33:03
    */
    public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return encryptBASE64(key.getEncod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值