1、代码
package com.zhaochao.utill;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
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;
public class RSACoder {
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
public static String sign(byte[] data, String privateKey) throws Exception {
// 解密由base64编码的私钥
byte[] keyBytes = decryptBASE64(privateKey);
// 构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取私钥匙对象
PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 用私钥对信息生成数字签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);
return encryptBASE64(signature.sign());
}
public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
// 解密由base64编码的公钥
byte[] keyBytes = decryptBASE64(publicKey);
// 构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取公钥匙对象
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);
// 验证签名是否正常
return signature.verify(decryptBASE64(sign));
}
public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
// 对公钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
private static byte[] decryptBASE64(String key) throws Exception {
// TODO Auto-generated method stub
return Base64Utill.decodeBase64(key);
}
public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
private static String encryptBASE64(byte[] encoded) throws Exception {
// TODO Auto-generated method stub
return Base64Utill.encodeBase64(encoded);
}
public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
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;
}
public static void testEncode(String publicKey, String privateKey) throws Exception {
System.err.println("公钥加密——私钥解密");
String inputStr = "abc";
byte[] data = inputStr.getBytes();
byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr);
System.err.println("加密后:" + new String(encodedData));
System.err.println("解密后:" + outputStr);
System.err.println(inputStr.equals(outputStr));
}
public static void testSign(String publicKey, String privateKey) throws Exception {
System.err.println("私钥加密——公钥解密");
String inputStr = "sign";
byte[] data = inputStr.getBytes();
byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "==" + "解密后: " + outputStr);
System.err.println(inputStr.equals(outputStr));
System.err.println("私钥签名——公钥验证签名");
// 产生签名
String sign = RSACoder.sign(encodedData, privateKey);
System.err.println("签名:" + sign);
// 验证签名
boolean status = RSACoder.verify(encodedData, publicKey, sign);
System.err.println("状态:" + status);
}
public static void main(String[] rags) throws Exception {
Map<String, Object> keyMap = RSACoder.initKey();
String publicKey = RSACoder.getPublicKey(keyMap);
String privateKey = RSACoder.getPrivateKey(keyMap);
System.err.println("公钥: nr" + publicKey);
System.err.println("私钥: nr" + privateKey);
testEncode(publicKey, privateKey);
testSign(publicKey, privateKey);
}
}
2、BASE64加密文章
3、测试结果
公钥: nrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcL1QiqQi6cR7FN61u8JxZrGuHUhQcCd5xinbLYRjLuriA1OY3SqnnUZAJQ7xQSIyPhufX7DjZTUqIux9RxSHsoOUPglxqLPudp4bXrVmICXiTeX7XlqlEJ3iBMIbWd9QXWfi9j6awX/8rBkssgnL7rVvYcJxqUN/6iMbRP6L0GQIDAQAB
私钥: nrMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJwvVCKpCLpxHsU3rW7wnFmsa4dSFBwJ3nGKdsthGMu6uIDU5jdKqedRkAlDvFBIjI+G59fsONlNSoi7H1HFIeyg5Q+CXGos+52nhtetWYgJeJN5fteWqUQneIEwhtZ31BdZ+L2PprBf/ysGSyyCcvutW9hwnGpQ3/qIxtE/ovQZAgMBAAECgYBrMSRqYV7HLunyawMSF/sGpIpsJk387F0JygE8FljBQlZsvTF/kzPGubjEUwPEifZGb01haROfOCfGbb7SDRz5SvRK+O5+id7m9jxssqE0RaneWn+DPgaqiuVjHUFdYCYQpz9LrZvleennMZcT4v82jqrj7wS095e36L1uA7hrcQJBAMtwNVTt5VPNA8jV/VQQ7d9vTyHa2eBM5Ndz/tb+LCi7tEs/C/qiuPTnNaILS7J0O+3dCxBV2+JgelIjpesXTQ0CQQDEibB9xs8ntK1/zg0JkAx5VHsKrLHl3OyLiNT0AtMzJbNaIJMQh7bAiGxBt6X5Dahfn9gMWaJvipizl+PX9fg9AkEAhuEnSt7LTAtCNhbCdckfnSMUaRLLn237z2klje9I4dzJRZZQX+UhEaZ1pbEth+yOiz8hhbwXI/jpQKpH6B0zxQJBAMAxRX455GoXrXLFtModK5Wan5gYuP7nxAnPjS/xc0cZHwKLyETp8jTlM7gwNwYN7RFV5phtLwOUrS8y4YRW7KECQG/fO2HsWmZf/iF9sUa5lCeqt9KjHTQMmFC7j7ktaWuwXeqx27to/JfPe3kU0CWwWsKTrBYLYcY1ClM/za+yuuU=
公钥加密——私钥解密
加密前: abc
加密后:?"]Tރ���7��iJ����Cc�[ɠ�,��C�~EQ^w�\_B�S��M���r�S'ڲl7Z1��L��T�E��7�T�_�l%ѭ�L�|f��k��c�p,r��w�A
]�1U���Q|�
解密后:abc
true
私钥加密——公钥解密
加密前: sign==解密后: sign
true
私钥签名——公钥验证签名
签名:c4s5fSVDa6IrEIamAuJ5MxPADq7xsvJ5sVR3KguTLxWfsGZKTS4fCh01neiqZuRB/0e0d6n++cdDNwVwYrR6DQHINg2Uv3Y8mMzG0Sp/EnJAjqRmOP/b2kkIzAAS/UEuEdPLFSLex9cvVggdRK9V57XEeO0f7Qy7qaEcz+JmAZs=
状态:true