import com.jfinal.log.Log;
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;
import java.util.HashMap;
import java.util.Map; /**
* RSA安全编码组件
*/
public abstract class ToolRSA { private static final Log log = Log.getLog(ToolRSA.class); /**
* 非对称加密密钥算法
*/
public static final String KEY_ALGORITHM = "RSA"; /**
* 公钥
*/
private static final String PUBLIC_KEY = "RSAPublicKey"; /**
* 私钥
*/
private static final String PRIVATE_KEY = "RSAPrivateKey"; /**
* RSA密钥长度 默认1024位, 密钥长度必须是64的倍数, 范围在512至65536位之间。
*/
private static final int KEY_SIZE = 512; /**
* 私钥解密
*
* @param data 待解密数据
* @param key 私钥
* @return byte[] 解密数据
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); // 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(data);
} /**
* 公钥解密
*
* @param data 待解密数据
* @param key 公钥
* @return byte[] 解密数据
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception { // 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 生成公钥
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); // 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicKey); return cipher.doFinal(data);
} /**
* 公钥加密
*
* @param data 待加密数据
* @param key 公钥
* @return byte[] 加密数据
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); // 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data);
} /**
* 私钥加密
*
* @param data 待加密数据
* @param key 私钥
* @return byte[] 加密数据
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); // 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data);
} /**
* 取得私钥
*
* @param keyMap 密钥Map
* @return byte[] 私钥
* @throws Exception
*/
public static byte[] getPrivateKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return key.getEncoded();
} /**
* 取得公钥
*
* @param keyMap 密钥Map
* @return byte[] 公钥
* @throws Exception
*/
public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return key.getEncoded();
} /**
* 初始化密钥
*
* @return Map 密钥Map
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
// 实例化密钥对生成器
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); // 初始化密钥对生成器
keyPairGen.initialize(KEY_SIZE); // 生成密钥对
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加密的公钥字符串
public static String getPublicKeyStr(Map<String, Object> keyMap) throws Exception {
//获得map中的公钥对象 转为key对象
Key key = (Key) keyMap.get(PUBLIC_KEY);
//编码返回字符串
return Base64.encodeBase64String(key.getEncoded());
} //获得base64加密的私钥字符串
public static String getPrivateKeyStr(Map<String, Object> keyMap) throws Exception {
//获得map中的私钥对象 转为key对象
Key key = (Key) keyMap.get(PRIVATE_KEY);
//编码返回字符串
return Base64.encodeBase64String(key.getEncoded());
} //还原byte数组的公钥
public static byte[] getPublicKeyByte(String publicKeyStr) {
return Base64.decodeBase64(publicKeyStr);
} //还原byte数组的私钥
public static byte[] getPrivateKeyByte(String privateKeyStr) {
return Base64.decodeBase64(privateKeyStr);
} public static void main(String[] args) {
try {
String dataStr = "今天天气很好";
Map<String, Object> keyMap = initKey();//初始化公钥和私钥
byte[] publicKey = getPublicKey(keyMap);
byte[] privateKey = getPrivateKey(keyMap); //利用base64生成String字符串的公钥和私钥
String publicKeyStr = Base64.encodeBase64String(publicKey);//生成字符串公钥
byte[] publicKey2 = Base64.decodeBase64(publicKeyStr);//base64还原了公钥publicKey
String privateKeyStr = Base64.encodeBase64String(privateKey);//生成字符串私钥
byte[] privateKey2 = Base64.decodeBase64(privateKeyStr);//base64还原了私钥privateKey
String gStr = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALni7Ge9AHPZKSIAaMmB5dh/3852ZyKWPQIe0VRU3xnymOI7+3XX3tXMMiH7xOYLG7YucaEPm9gUJYS8PFhOGU8CAwEAAQ==";
String pStr = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAueLsZ70Ac9kpIgBoyYHl2H/fznZnIpY9Ah7RVFTfGfKY4jv7ddfe1cwyIfvE5gsbti5xoQ+b2BQlhLw8WE4ZTwIDAQABAkEAl/U4+wkXwJyrMn+RKgHFqrnGdNp4L18QGpak20LSaztwDRUgDhYzGh6HEDhQNB+UG5v+RV2ZYCPuQvUlUjWImQIhAOxoXBGTbw8MbylCur7jOu/N0kEa8TfwDixLShWw64ozAiEAyUqztCQtaT8ZUd9DAl4oOJVucEoLwr5TdRH14RCoUHUCIFakbNHYOgTG5tq1ZSHev9PxmBRaXnvE1DzxnwZSIBE3AiEAvkGVSRdItMmnLPNRatOEQLc9A3V5WEB8sZKgTHJqJGECIHP5aL2buJBVbBMgn8f5wD11TPBKW1ZU9XZrCjGM0Hiw";

            byte[] beforData = encryptByPublicKey(dataStr.getBytes(), publicKey);
log.info(new String(beforData));
byte[] afterData = decryptByPrivateKey(beforData, privateKey);
log.info(new String(afterData)); } catch (Exception e) {
e.printStackTrace();
} }
private void test() {
try {
String password = "k4UUA7/bME/EgFUdNE+syvPX88rm2uFJonOP+7ekqbW0Vrz7lUA2zpw3wP+yKlPgc9xGXJKorBvYQ4F8n6EwXw==";//前台传入
String username = "IxpcxKe9D6w6aeNVwQAYtL6btjueTK44fmIt4yCq+Rlc3VxxvJLEKI814LkhvQTalduSKr3NMSAn5Wdl7hUc1Q==";//前台传入
String privateKeyStr = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAueLsZ70Ac9kpIgBoyYHl2H/fznZnIpY9Ah7RVFTfGfKY4jv7ddfe1cwyIfvE5gsbti5xoQ+b2BQlhLw8WE4ZTwIDAQABAkEAl/U4+wkXwJyrMn+RKgHFqrnGdNp4L18QGpak20LSaztwDRUgDhYzGh6HEDhQNB+UG5v+RV2ZYCPuQvUlUjWImQIhAOxoXBGTbw8MbylCur7jOu/N0kEa8TfwDixLShWw64ozAiEAyUqztCQtaT8ZUd9DAl4oOJVucEoLwr5TdRH14RCoUHUCIFakbNHYOgTG5tq1ZSHev9PxmBRaXnvE1DzxnwZSIBE3AiEAvkGVSRdItMmnLPNRatOEQLc9A3V5WEB8sZKgTHJqJGECIHP5aL2buJBVbBMgn8f5wD11TPBKW1ZU9XZrCjGM0Hiw";
byte[] privateKey = Base64.decodeBase64(privateKeyStr);//base64还原了私钥privateKey byte[] password2 = decryptByPrivateKey(Base64.decodeBase64(password), privateKey);
log.info(new String(password2));//fxgk@321
byte[] username2 = decryptByPrivateKey(Base64.decodeBase64(username), privateKey);
log.info(new String(username2));//P31170774
} catch (Exception e) {
e.printStackTrace();
}
}

}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

前端加密如要引入
jsencrypt.min.js
下载地址:http://travistidwell.com/jsencrypt/
该文件在解压后的bin目录下;
var username = $("#username").val();
var password = $("#password").val();
// 密钥加密
var publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALni7Ge9AHPZKSIAaMmB5dh/3852ZyKWPQIe0VRU3xnymOI7+3XX3tXMMiH7xOYLG7YucaEPm9gUJYS8PFhOGU8CAwEAAQ==";
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
password = encrypt.encrypt(password); var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
username = encrypt.encrypt(username);

												

RSA加密工具类(非对称加密算法)的更多相关文章

  1. java 加密工具类(MD5、RSA、AES等加密方式)

    1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...

  2. App开发流程之加密工具类

    科技优家 2016-09-08 18:10 从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累. 我建议先将基础的工具加入项目,后续的开发效率会呈指数增长.如果在专注功能开发过程中,才发现缺少 ...

  3. Java AES 加密工具类

    package com.microwisdom.utils; import java.security.NoSuchAlgorithmException; import java.security.S ...

  4. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

  5. android开发MD5加密工具类(一)

    MD5加密工具类整理: package com.gzcivil.utils; import java.io.UnsupportedEncodingException; import java.secu ...

  6. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  7. c# 加密工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  8. java MD5Utils 加密工具类

    package com.sicdt.library.core.utils; import java.io.File; import java.io.FileInputStream; import ja ...

  9. spring自带的MD5加密工具类

    Spring 自带的md5加密工具类,本来打算自己找一个工具类的,后来想起来Spring有自带的,就翻了翻 //导入包import org.springframework.util.DigestUti ...

随机推荐

  1. 表达式树(Expression Tree)

    你每创建一个表示表达式的实例时,都可以将该类型实例看成是一棵表达式树.每种表示表达式的类型都有一个具体的类型,如Expression的Variable()方法创建的是ParameterExpressi ...

  2. Android开发学习笔记-自定义组合控件的过程

    自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...

  3. Visual Code 调用Chrome 浏览HTML

    Code 使用快捷键:Ctrl+Shit+B 然后再Task.json,替换以下: { "version": "0.1.0", "command&qu ...

  4. Redis使用示例及在PHP环境中用redis存储session

    在文件夹redis-3.2.0下 1. 启动redis服务 nohup ./src/redis-server redis.conf & 2. 停止服务 #使用客户端 ./src/redis-c ...

  5. jquery获取元素颜色css('color')的值返回RGB

    css代码如下: a, a:link, a:visited { color:#4188FB; } a:active, a:focus, a:hover { color:#FFCC00; } js代码如 ...

  6. AngularJS------命令行

    如下:(‘$’符号不需要输入哦) $ ng build --发布项目

  7. Git Step by Step – (1) Git 简介

    由于工作的需要,代码版本控制工具要从Perforce换成Git.说实话,刚开始真的很不适应,要从一个可以很好的支持用户界面的工具转到一个命令行工具,而且Git中有几百个命令,一下子就傻眼了. 但是经过 ...

  8. python3.5 中Django框架连接mysql

    ps:mysqldb目前还不支持3.0python唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql.悲催的是在Python2.7时代连接MySq ...

  9. composer 更新指定包

    1)网上搜了大半天都不知道怎么更新 componser 包,update upgrade 命令根本不知道怎么用!! 2)其实用 require 命令就可以更新包(它会判断包存不存在,不存在就安装,存在 ...

  10. Python模块常用的几种安装方式 【转】

    转自:http://blog.chinaunix.net/uid-23500957-id-3781907.html 一. 单文件模块直接把文件拷贝到 $python_dir/Lib 二. 多文件模块, ...