浅谈RSA加密算法
一、什么是非对称加密
1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密
2、密钥分为:公钥,私钥
公钥:可以对外给任何人的加密和解密的密码,是公开的
私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)
3、当将要加密的内容用公钥加密的时候,只能用私钥来解密
当将要加密的内容用私钥加密的时候,只能用公钥来解密
4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系
5、常见的非对称加密算法
RSA,DSA
二、什么是RSA算法
/**
* 通过指定的密钥长度生成非对称的密钥对
* @param keySize 推荐使用1024,2048 ,不允许低于1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keySize){
KeyPair ret = null;
try {
//1、准备生成
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
//2、初始化,设置秘钥长度
generator.initialize(keySize);
//3、生成,并且返回
ret = generator.generateKeyPair(); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return ret;
}
2、获取私钥和公钥
PublicKey 和 PrivateKey 都是Key类型的
KeyPair keyPair = EncryptUtil.generateRSAKeyPair();
//获取公钥,可以给任何人
PublicKey publicKey = keyPair.getPublic();
//获取私钥
PrivateKey privateKey = keyPair.getPrivate();
3、RSA加密
/**
* RSA 加密
* @param data 需要加密的数据
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaEncrypt(byte[] data ,Key key){
byte[] ret = null;
if (data != null
&& data.length>
&& key!=null) {
// 1、创建Cipher 使用RSA
try {
Cipher cipher = Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.ENCRYPT_MODE,key);
ret = cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
}
return ret;
}
4、RSA解密
/**
* RSA 解密
* @param data 要解密的数据
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaDecrypt(byte[] data ,Key key){
byte[] ret = null; if (data != null
&& data.length>
&& key!=null) {
// 1、创建Cipher 使用RSA
try {
Cipher cipher = Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.DECRYPT_MODE,key);
ret = cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
}
return ret;
}
5、公钥与私钥的存储
一对公钥和私钥创建好之后,我们需要存储起来以后使用
//获得公钥 私钥
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//编码将PublicKey和PrivateKey对象转换为字节数组,该字节数组为公钥、私钥的实际数据
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
//将字节数组通过Base64编码算法 编码成可见的字符形式
String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);
//进行存储操作
。。。。
6、公钥与私钥的加载
通常 1、获取密钥对 2、获取公钥、私钥 3、保存公钥、私钥,保存形式基本为字符串形式
那么在以后的使用中就需要获取公钥和私钥来使用
需要知道:
6.1、KeyFactory可以来加载相应的公钥和私钥
6.2、公钥加载 使用 X509EncodedKeySpec(byte[])
6.3、私钥加载 使用 PCKS8EncodedKeySpec(byte[])
//获取公钥
//str_publickey 为公钥字符串形式数据(公钥先编码成byte[] 在 形成字符串)
//解码
byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//取得公钥
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//解码
//获取私钥
//str_private 为私钥字符串形式的数据
byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
//指定加密算法
keyFactory = KeyFactory.getInstance("RSA");
//取得私钥
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
相关知识:
浅谈RSA加密算法的更多相关文章
- 浅谈DES加密算法
一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...
- 浅谈RSA加密
RSA背景 在1976年以前,传统的加解密过程是: 1.A采用某种手段对数据进行加密. 2.数据传输到B的手中. 3.B逆向的实施A加密采用的步骤. 4.数据被还原. 这就是所谓的对称加密. 解密和加 ...
- (转)浅谈MD5加密算法中的加盐值(SALT)
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...
- Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)
转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散 ...
- Android应用安全开发之浅谈加密算法的坑
<Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题 Android开发中,难免会遇到需要加解密一些数据内 ...
- 浅谈HTTPS以及Fiddler抓取HTTPS协议
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- [转]浅谈https\ssl\数字证书
浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 浅谈HTTPS以及Fiddler抓取HTTPS协议(摘抄)
一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...
随机推荐
- [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence
一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...
- JS移动端滑屏事件
来看看在pc上面的几个事件:onmousedown,onmousemove,onmouseup 我相信大家对这几个事件一定不陌生,第一个onmousedown表示鼠标按下,第二个onmousemove ...
- 封装系统自带的Debug
Unity3d的Debug.Log函数用于打印日志,一般项目中都会对其作如下两件事情: (1)希望有一个总的开关来控制整个游戏中日志的打印与否: (2)有的系统会将Log封一层并添加统一的标记,比如S ...
- [OpenCV] Basic data types - Matrix
http://docs.opencv.org/2.4.13/ Basis 矩形 "modules/core/src/drawing.cpp" CV_IMPL void cvRect ...
- Hadoop第12周练习—HBase安装部署
1 1.1 1.2 :安装HBase 2.1 内容 运行环境说明 1.1 硬软件环境 线程,主频2.2G,6G内存 l 虚拟软件:VMware® Workstation 9.0.0 build-8 ...
- MySQL安全问题(防范必知)
对于任何一种数据库来说,安全问题都是非常重要的.如果数据库出现安全漏洞,轻则数据被窃取,重则数据被破坏,这些后果对于一些重要的数据库都是非常严重的.下面来从操作系统和数据库两个层对MySQL的安全问题 ...
- 一秒钟生成自己的iOS客户端
原谅我这个标题党 想当年我也是亲自学过几天Objective-c的程序猿,我一眼就知道我是在骗人,但那有怎样呢!还不是满大街都是各种<十分钟让你明白Objective-C的语法>.< ...
- zabbix配fpmmm(mpm)数据传送不了问题解决
我们环境用zabbix mpm来监控mysql,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was renamed ...
- 基于GTID Replication主从数据不一致操作
基本的M-S结构 现在master与slave主机数据一致: mysql> select * from t1; +------+ | id | +------+ | 1 | | ...
- js获取url参数的两种方法
js获取参数,在以前我都是用正在去拆分,然后获取,这种方式感觉是最简单的 方式1: function QueryString(item) { var sValue=location.search.ma ...