特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

1、生成公钥私钥对

 package com.mao.common.util;

 import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; import org.apache.tomcat.util.codec.binary.Base64; /**
*
* 描述:密钥生成器
* @author mao2080@sina.com
* @created 2017年4月20日 下午8:32:20
* @since
*/
public class Generator { public static final String ALGORITHM_RSA = "RSA"; public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM_RSA);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
byte[] keyBs = rsaPublicKey.getEncoded();
String publicKey = encodeBase64(keyBs);
System.out.println("生成的公钥:\r\n" + publicKey);
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
keyBs = rsaPrivateKey.getEncoded();
String privateKey = encodeBase64(keyBs);
System.out.println("生成的私钥:\r\n" + privateKey);
} /**
*
* 描述:byte数组转String
* @author mao2080@sina.com
* @created 2017年4月9日 下午8:43:05
* @since
* @param source
* @return
* @throws Exception
*/
public static String encodeBase64(byte[] source) throws Exception {
return new String(Base64.encodeBase64(source), "UTF-8");
} /**
*
* 描述:String转byte数组
* @author mao2080@sina.com
* @created 2017年4月9日 下午8:42:59
* @since
* @param target
* @return
* @throws Exception
*/
public static byte[] decodeBase64(String target) throws Exception {
return Base64.decodeBase64(target.getBytes("UTF-8"));
} }

运行结果:

生成的公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHj1kf4EV0zCVdleIq/3pSm+tV0xuDGaXDzDyjVhDmrSptFv3MkBRY73qxbs/ZHGsVAwsY1kvh5qrFLdUesGMw92PgWwSXrNfBxYBLECweG0iIe8vTtvo824KdrJK3/1jPSXMJ0jYRaWXGr0qtEv5ak81kF/pDMiDG86wLKnq1jQIDAQAB
生成的私钥:
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMePWR/gRXTMJV2V4ir/elKb61XTG4MZpcPMPKNWEOatKm0W/cyQFFjverFuz9kcaxUDCxjWS+HmqsUt1R6wYzD3Y+BbBJes18HFgEsQLB4bSIh7y9O2+jzbgp2skrf/WM9JcwnSNhFpZcavSq0S/lqTzWQX+kMyIMbzrAsqerWNAgMBAAECgYAo33xiof232WRB0cQcCG2WY+cEkhONe4BPJRK6ZZNam9cXtuDOuCfiu1IG62pYzpBEInZwZNvv7d3GOwfunDQEY1Zt6TC6D8E59aRGE+2HofVwA47X3ulXz8EsV9ZXYd/Eq/P0tpDci6DtWC/Gh0UZSgcUhwM6DXwa9ctMo3VxoQJBAPvHQ0SbapSOxqALc9WNrG/dq2wvQaecCnuVqhrl7ZuIeGronQMvsxFHMBp2OPcK/64jESZ9LoAoPnwlYuIs33kCQQDK5/E4YnBjzb6w//l1e1dhIbRwMZHkn8VNMorYjTQemX9m7gsJeAPSBF11lo1XGWR84M0nPMnrnyeG8zl68B21AkEA81Cf+19OYn6QCP7IVGpzaDAKh6QriLTNlJ0QJKprM1FxPa/KfNfN7zaikBAMAQIKENkmq9Fx7Lv3lrXyl6zR0QJAeSLb+kOawZrVm6pWbfMDCbQrm0ecyBcynZHtHre+Q/5z9ylqYW7LKRj+CvOk0jkQqxUypZg/HHJaENEooeK0eQJAVckJuNXO+XQsMo1J+dkthmAbJY1u8ylDW6V/ofpvCIkZwWagbDhqrb2lt0Mc/JaL/+5HtM3boMRXGcleTDFWZQ==

2、使用加解密方法

 package com.mao.common.util;

 import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import org.apache.tomcat.util.codec.binary.Base64; /**
*
* 描述:安全工具类
* @author mao2080@sina.com
* @created 2017年4月20日 下午8:32:42
* @since
*/
public final class SecurityUtil { private static final String ALGORITHM_RSA = "RSA"; /**RSA-charset*/
private static final String RSA_CHARSET = "UTF-8"; /**
*
* 描述:将字符串通过RSA算法公钥加密
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param content 需要加密的内容
* @param pubKey 公钥
* @return 加密后字符串
* @throws Exception
*/
private static String EncryptByRSAPubKey(String content, String pubKey) throws Exception {
try {
PublicKey publicKey = SecurityUtil.getRSAPubKey(pubKey);
Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.update(content.getBytes(SecurityUtil.RSA_CHARSET));
return SecurityUtil.encodeBase64(cipher.doFinal());
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
*
* 描述:将字符串通过RSA算法公钥解密
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param content 需要解密的内容
* @param pubKey 公钥
* @return 解密后字符串
* @throws Exception
*/
private static String DecryptByRSAPubKey(String content, String pubKey) throws Exception {
try {
PublicKey publicKey = SecurityUtil.getRSAPubKey(pubKey);
Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
cipher.update(SecurityUtil.decodeBase64(content));
return new String(cipher.doFinal(), RSA_CHARSET);
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
*
* 描述:将字符串通过RSA算法私钥加密
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param content 需要加密的内容
* @param priKey 私钥
* @return 加密后字符串
* @throws Exception
*/
public static String EncryptByRSAPriKey(String content, String priKey) throws Exception {
try {
PrivateKey privateKey = SecurityUtil.getRSAPriKey(priKey);
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
cipher.update(content.getBytes(SecurityUtil.RSA_CHARSET));
return SecurityUtil.encodeBase64(cipher.doFinal());
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
*
* 描述:将字符串通过RSA算法私钥解密
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param content 需要解密的内容
* @param priKey 私钥
* @return 解密后字符串
* @throws Exception
*/
public static String DecryptByRSAPriKey(String content, String priKey) throws Exception {
try {
PrivateKey privateKey = SecurityUtil.getRSAPriKey(priKey);
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
cipher.update(SecurityUtil.decodeBase64(content));
return new String(cipher.doFinal(), SecurityUtil.RSA_CHARSET);
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
*
* 描述:获取RSA公钥
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param priKey 私钥
* @return PublicKey
* @throws Exception
*/
private static PublicKey getRSAPubKey(String pubKey) throws Exception {
try {
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(SecurityUtil.decodeBase64(pubKey));
KeyFactory keyFactory = KeyFactory.getInstance(SecurityUtil.ALGORITHM_RSA);
return keyFactory.generatePublic(publicKeySpec);
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
*
* 描述:获取RSA私钥
* @author mao2080@sina.com
* @created 2017年4月9日 上午09:18:51
* @since
* @param priKey 私钥
* @return PrivateKey
* @throws Exception
*/
private static PrivateKey getRSAPriKey(String priKey) throws Exception {
try {
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(SecurityUtil.decodeBase64(priKey));
KeyFactory keyFactory = KeyFactory.getInstance(SecurityUtil.ALGORITHM_RSA);
return keyFactory.generatePrivate(privateKeySpec);
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
} /**
* base64编码
* @param source
* @return
* @throws Exception
*/
public static String encodeBase64(byte[] source) throws Exception {
return new String(Base64.encodeBase64(source), "UTF-8");
} /**
* Base64解码
* @param target
* @return
* @throws Exception
*/
public static byte[] decodeBase64(String target) throws Exception {
return Base64.decodeBase64(target.getBytes("UTF-8"));
} public static void main(String[] args) throws Exception {
String pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHj1kf4EV0zCVdleIq/3pSm+tV0xuDGaXDzDyjVhDmrSptFv3MkBRY73qxbs/ZHGsVAwsY1kvh5qrFLdUesGMw92PgWwSXrNfBxYBLECweG0iIe8vTtvo824KdrJK3/1jPSXMJ0jYRaWXGr0qtEv5ak81kF/pDMiDG86wLKnq1jQIDAQAB";
String priKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMePWR/gRXTMJV2V4ir/elKb61XTG4MZpcPMPKNWEOatKm0W/cyQFFjverFuz9kcaxUDCxjWS+HmqsUt1R6wYzD3Y+BbBJes18HFgEsQLB4bSIh7y9O2+jzbgp2skrf/WM9JcwnSNhFpZcavSq0S/lqTzWQX+kMyIMbzrAsqerWNAgMBAAECgYAo33xiof232WRB0cQcCG2WY+cEkhONe4BPJRK6ZZNam9cXtuDOuCfiu1IG62pYzpBEInZwZNvv7d3GOwfunDQEY1Zt6TC6D8E59aRGE+2HofVwA47X3ulXz8EsV9ZXYd/Eq/P0tpDci6DtWC/Gh0UZSgcUhwM6DXwa9ctMo3VxoQJBAPvHQ0SbapSOxqALc9WNrG/dq2wvQaecCnuVqhrl7ZuIeGronQMvsxFHMBp2OPcK/64jESZ9LoAoPnwlYuIs33kCQQDK5/E4YnBjzb6w//l1e1dhIbRwMZHkn8VNMorYjTQemX9m7gsJeAPSBF11lo1XGWR84M0nPMnrnyeG8zl68B21AkEA81Cf+19OYn6QCP7IVGpzaDAKh6QriLTNlJ0QJKprM1FxPa/KfNfN7zaikBAMAQIKENkmq9Fx7Lv3lrXyl6zR0QJAeSLb+kOawZrVm6pWbfMDCbQrm0ecyBcynZHtHre+Q/5z9ylqYW7LKRj+CvOk0jkQqxUypZg/HHJaENEooeK0eQJAVckJuNXO+XQsMo1J+dkthmAbJY1u8ylDW6V/ofpvCIkZwWagbDhqrb2lt0Mc/JaL/+5HtM3boMRXGcleTDFWZQ==";
String content = "12345678";
String s = EncryptByRSAPubKey(content, pubKey);
System.out.println("公钥加密后:"+s);
System.out.println("私钥解密后:"+DecryptByRSAPriKey(s, priKey));
content = "12345678";
s = EncryptByRSAPriKey(content, priKey);
System.out.println("私钥加密后:"+s);
System.out.println("公钥解密后:"+DecryptByRSAPubKey(s, pubKey));
} }

运行结果:

公钥加密后:hTsS0vrBpaQgp+T1dyoTQ8jJKt6qAmE5Np3URgYjRuA0vrib9fElFz8BFX5NHOlcmDMZKuudulfehQ3P43DNA0k9dAMStIuofQIA70fY5GQxNjLTu0S7/J510wYPAtopMDqO9eriVg39R3KzJUPwgMKQGELBCOWstK9nO1F6z0w=
私钥解密后:12345678
私钥加密后:xaKKEf6eC80Zh3MbrQA13hbpIv57IFvW2N1oMshojZYqGNTbGQvyZcHOkVzAsVlZJDyexDKdD82kP8lfZ/729BC/7EGwtXlND8w68pfOsSDYtknRLrXpflNU7C+EqzUQBUsruj+tUc7m050eZmJw7u6DF3lIIviIICWV/O1OiDw=
公钥解密后:12345678

3、本文demo下载

数据加密之RSA的更多相关文章

  1. Android数据加密之Rsa加密

    前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

  2. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...

  3. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  4. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  5. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  6. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  7. 4、DES和RSA简介

    DES是分组加密算法,速度快,使用单一密钥,加密解密都使用同一个密钥,一般用于大量数据加密,目前处于半淘汰状态. RSA算法是流式加密算法,速度慢,但是使用成对的密钥,加密解密使用不同的密钥,有利于保 ...

  8. Android数据加密之Aes加密

    前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...

  9. Android数据加密之Des加密

    前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

随机推荐

  1. css背景图自适应全屏显示

    前几天我在写一个前端页面的时候,需要用到全屏背景图,但是怎么写都不行(要么不全屏,要么不兼容Bootstrap的响应式布局).对,是我腊鸡 后来我在网上找的时候找到一个大神写的笔记,参(照)考(抄)之 ...

  2. hdu 6399 City Development

    vjudge 读进来可能会有相同的\(n_i\),不过在相同的\(n_i\)中只有最后一个是有用的,所以其他的要缩起来,缩完后这些\(n\)的数量不会超过19个 可以发现一个城市的答案为所有城市初始权 ...

  3. node-images Windows 64-bit with Unsupported runtime 错误解决办法 及 node 历史版本下载

    在做项目的时候下载的最新的10.16[2019.6.12]版本,出现了模块不兼容的问题[node-images]. 在git上发现了相同问题 https://github.com/zhangyuanw ...

  4. Spring的基本应用(1):IDEA版本

    一.Spring概述: 1.什么是Spring? Spring是分层的JavaSE/EE应用full-stack(一站式)轻量级开源框架,以IoC(Inverse Of Control:控制反转)和A ...

  5. Hyperledger Fabric(1)基础架构

    前言 在区块链的家谱里,第一代区块链系统是以比特币为代表的公链,主要实现的是数字货币的功能:第二代区块链系统是以以太坊平台为代表的公链,创造性的实现了智能合约.而第三代区块链系统,则是HyperLed ...

  6. idea使用问题总结

    一.创建Spring 的配置文件需要加入一个pom.xml 的依赖 <dependency> <groupId>org.springframework</groupId& ...

  7. 解决 android studio 出现:"AndroidStudio:Could not GET 'https://dl.google.com Received status code 400 from server: Bad Request"问题

    一.android studio 编译项目时出现"AndroidStudio:Could not GET 'https://dl.google.com Received status cod ...

  8. table 边框问题

    对table设置css样式边框,分为几种情况:1.只对table设置边框2.对td设置边框3.对table和td技巧性设置表格边框4.对table和td设置背景,实现完美表格边框 以下DIVCSS5对 ...

  9. 【hdu 6071】Lazy Running

    菜鸡永远都在做着变聚的梦. 题意 有 \(4\) 个点连成一个环,连接顺序依次为 \(1-2-3-4-1\).相邻两个点之间有个距离 \(d_{i,i+1}\)(特别地,当 \(i=4\) 时为 \( ...

  10. radio赋值法

    一般都会使用attr来使选中: $("#DIV的ID input[name='radio的name'][value="'+动态传的radio的value值+'"]&quo ...