一、什么是非对称加密算法?
简单点讲,就是加密密钥和解密密钥不一样的一种加密算法。非对称加密是指通过特定算法获取一对密钥对:公钥和私钥,公钥可以对外公开,私钥由你自己保存。我们使用其中一个密钥对数据进行加密,使用另一个密钥对加密后的数据进行解密。
优点:保密性比较好,不需要用户交换密钥,不适合于对文件加密;
缺点:加密和解密花费时间长、速度慢,适用于对少量数据进行加密。
常见的非对称加密算法有: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