RSA是一种非对称加密算法,使用RSA前先生成一对公钥和私钥。

使用公钥加密的数据可以用私钥解密,同样私钥加密的数据也可以用公钥解密,

不同之处在于,私钥加密数据的同时还可以生成一组签名,签名是用来验证数据是否在传输过程中有变动的,使用公钥、签名、以及公钥加密后的数据,就可以验证是否有变动,当然也可以不验证。

代码示例如下,两个main方法:main和main1。加密解密都是针对byte数组的,考虑到我们实际使用的时候大部分场景应该是用字符串来传递数据,所以演示代码中频繁的将byte数组转化为字符串,有些byte数组不是从字符串直接转化来的,直接通过new String的方式转字符串会出现乱码,所以用到了Base64来解决这一问题。

另外,演示代码为了方便看到全过程,基本上没有抽出方法,实际使用的时候建议重构一下。

说明就到此为止,代码如下:

 package testEncrypt;

 import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
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.InvalidKeySpecException;
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; /**
*
* @ClassName: TestRsaEncrypt
* @Description: TODO
* @author: liuyx
* @date: 2016年4月28日上午10:20:59
*/
public class TestRsaEncrypt {
public static final String KEY_ALGORITHM = "RSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static KeyFactory keyFactory = null;
static {
try {
keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//公钥加密 私钥解密
public static void main(String[] args) throws Exception {
//生成密钥对 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(512); 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); String publicKeyStr = getBase64KeyEncodeStrFromKey(publicKey);
String privateKeyStr = getBase64KeyEncodeStrFromKey(privateKey);
System.out.println("公钥:"+publicKeyStr);
System.out.println("私钥:"+privateKeyStr); //数据加密过程演示
System.out.println("公钥加密——私钥解密"); //要加密的数据
String dataStr = "abcdefghhhhhhhopqrst";
System.out.println("要加密的数据:"+dataStr);
byte[] data = dataStr.getBytes(); // 对公钥解密
Key decodePublicKey = getPublicKeyFromBase64KeyEncodeStr(publicKeyStr); // 对数据加密
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, decodePublicKey);
byte[] encodedData = cipher.doFinal(data);
String encodedDataStr = Base64.encodeBase64String(encodedData);
System.out.println("公钥加密后的数据:"+encodedDataStr); //对私钥解密
Key decodePrivateKey = getPrivateKeyFromBase64KeyEncodeStr(privateKeyStr);
cipher.init(Cipher.DECRYPT_MODE, decodePrivateKey);
encodedData = Base64.decodeBase64(encodedDataStr);
byte[] decodedData = cipher.doFinal(encodedData);
String decodedDataStr = new String(decodedData);
System.out.println("私钥解密后的数据:"+decodedDataStr);
} //私钥加密 公钥解密,附带签名验证过程
public static void main1(String[] args) throws Exception {
//生成密钥对 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(512); 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); String publicKeyStr = getBase64KeyEncodeStrFromKey(publicKey);
String privateKeyStr = getBase64KeyEncodeStrFromKey(privateKey);
System.out.println("公钥:"+publicKeyStr);
System.out.println("私钥:"+privateKeyStr); //数据加密过程演示
System.out.println("私钥加密——公钥解密"); //要加密的数据
String dataStr = "abcdefghhhhhhhopqrst1";
System.out.println("要加密的数据:"+dataStr);
byte[] data = dataStr.getBytes(); //对私钥解密
Key decodePrivateKey = getPrivateKeyFromBase64KeyEncodeStr(privateKeyStr);
//对公钥解密
Key decodePublicKey = getPublicKeyFromBase64KeyEncodeStr(publicKeyStr); // 对数据加密
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, decodePrivateKey);
byte[] encodedData = cipher.doFinal(data); //插曲,加密后的数据+私钥,生成签名,验证签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign((PrivateKey)decodePrivateKey); //用的是私钥
signature.update(encodedData); //用的是加密后的数据字节数组 //取得签名
String sign = Base64.encodeBase64String((signature.sign())); //初始化验证签名
signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify((PublicKey )decodePublicKey); //用的是公钥
signature.update(encodedData); //用的是加密后的数据字节数组 //实际的验证过程,获取验证结果
boolean ret = signature.verify(Base64.decodeBase64(sign));
System.out.println("验证结果:"+ret);
//插曲结束 String encodedDataStr = Base64.encodeBase64String(encodedData);
System.out.println("私钥加密后的数据:"+encodedDataStr); cipher.init(Cipher.DECRYPT_MODE, decodePublicKey);
encodedData = Base64.decodeBase64(encodedDataStr);
byte[] decodedData = cipher.doFinal(encodedData);
String decodedDataStr = new String(decodedData);
System.out.println("公钥解密后的数据:"+decodedDataStr); } /*
* 获取key的base64加密后的字符串
*/
private static String getBase64KeyEncodeStrFromKey(Key key) {
return Base64.encodeBase64String(key.getEncoded());
} /*
* 获取base64加密后的字符串的原始公钥
*/
private static Key getPublicKeyFromBase64KeyEncodeStr(String keyStr) {
byte[] keyBytes = Base64.decodeBase64(keyStr);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
Key publicKey = null;
try {
publicKey = keyFactory.generatePublic(x509KeySpec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return publicKey;
} private static Key getPrivateKeyFromBase64KeyEncodeStr(String keyStr) {
byte[] keyBytes = Base64.decodeBase64(keyStr);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); Key privateKey=null;
try {
privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return privateKey;
}
}

加密算法使用(五):RSA使用全过程的更多相关文章

  1. 公钥加密算法那些事 | RSA 与 ECC 系统对比

    一.背景 据记载,公元前 400 年,古希腊人发明了置换密码.1881 年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用「恩尼格玛」密码机,密码学在战争中起着非常重要的作用. 随着 ...

  2. 加密算法—MD5、RSA、DES

    最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法.       MD5加密算法     定义:MD5算法是将任意长度的“字 ...

  3. 3个著名加密算法(MD5、RSA、DES)的解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来.    M ...

  4. 加密算法 DES 3DES RSA AES 简介

    数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...

  5. [转]3个著名加密算法(MD5、RSA、DES)的解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来.     ...

  6. java加密算法AES与RSA

    1.commons-codec使用 commons-codes 常用工具类:DigestUtils,Base64,Hex 1.1 md5 String text = "hello,md5&q ...

  7. [加密算法]为什么说RSA难以被破解

    RSA算法运用了数学“两个大的质数相乘,难以在短时间内将其因式分解”的这么一套看似简单事实上真的是很困难的一个数学难题...... 以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我 ...

  8. 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用(转载)

    加密技术通常分为两大类:"对称式"和"非对称式". 对称性加密算法:对称式加密就是加密和解密使用同一个密钥.信息接收双方都需事先知道密匙和加解密算法且其密匙是相 ...

  9. 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用

    加密技术通常分为两大类:"对称式"和"非对称式". 对称性加密算法:对称式加密就是加密和解密使用同一个密钥.信息接收双方都需事先知道密匙和加解密算法且其密匙是相 ...

随机推荐

  1. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  2. 安卓第十天笔记-fragment

    安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...

  3. linq扩展之动态排序

    前两天看QQ群里面,一位朋友问的问题,说在linq中怎么实现动态排序呢,自己想了半天,没有头绪,网上找了下相关的资料,看了下,收益挺多,记录下来. 之前我们没有如果不知道动态排序的方法的话,我们可能会 ...

  4. onmousedown,onmouseup,onclick同时应用于一个标签节点Element

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. ASP出500错误怎么办(理论上并不止500错误,其他错误可以同样可以获得更多信息以帮助解决问题)

    造成500错误常见原因有:ASP语法出错.ACCESS数据库连接语句出错.文件引用与包含路径出错.使用了服务器不支持的组件如FSO等. 为了定位500错误的具体原因,可以这样做: 让IE显示详细的出错 ...

  6. 《大话移动APP测试:Android与iOS应用测试指南》

    <大话移动app测试:android与ios应用测试指南> 基本信息 作者: 陈晔 出版社:清华大学出版社 ISBN:9787302368793 上架时间:2014-7-7 出版日期:20 ...

  7. oracle中的数值函数整理

    主要分为三块介绍(单值函数.聚合函数.列表函数) 一.单值函数(比较简单,看一遍基本也就理解记住了) 1.基本加减乘车没有什么可说的,只需要注意一点,任何值与null一起运算 ,结果都为null,因为 ...

  8. Struts2 Spring Hibernate等各个版本下载推荐

    推荐jar包下载地址: http://mvnrepository.com/ 应有尽有

  9. Jquery DataTables相关示例

    一.Jquery-DataTables DataTables 是jquery的一个开源的插件.它具有高度灵活的特性,基于渐进增强的基础,可以为任何表格添加交互.它特性如下: 提供分页,搜索和多列排序: ...

  10. oracle定时任务

    一.简介 当我们需要oracle数据库定时自动执行一些脚本,或进行数据库备份.数据库的性能优化,包括重建索引等工作是需要使用到定时任务. 定时任务可以使用以下两种完成. 1.操作系统级的定时任务,wi ...