一、什么是非对称加密

1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密

2、密钥分为:公钥,私钥

   公钥:可以对外给任何人的加密和解密的密码,是公开的

私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)

3、当将要加密的内容用公钥加密的时候,只能用私钥来解密

当将要加密的内容用私钥加密的时候,只能用公钥来解密

4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系

5、常见的非对称加密算法

  RSA,DSA

二、什么是RSA算法

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。[1] 
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
 
三、RSA加密算法的使用
1、RSA密钥的生成,返回一个KeyPair对象
KeyPair 用于非对称加密,KeyPair中包含了一个公钥和一个私钥
    /**
* 通过指定的密钥长度生成非对称的密钥对
* @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);

相关知识:

浅谈DES加密算法

浅谈RSA加密算法的更多相关文章

  1. 浅谈DES加密算法

    一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...

  2. 浅谈RSA加密

    RSA背景 在1976年以前,传统的加解密过程是: 1.A采用某种手段对数据进行加密. 2.数据传输到B的手中. 3.B逆向的实施A加密采用的步骤. 4.数据被还原. 这就是所谓的对称加密. 解密和加 ...

  3. (转)浅谈MD5加密算法中的加盐值(SALT)

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...

  4. Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)

    转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散 ...

  5. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  6. 浅谈HTTPS以及Fiddler抓取HTTPS协议

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  7. [转]浅谈https\ssl\数字证书

    浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...

  8. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. 浅谈HTTPS以及Fiddler抓取HTTPS协议(摘抄)

    一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...

随机推荐

  1. 字符集与Mysql字符集处理(二)

    接着上篇文章继续讲字符集的故事.这一篇文章主要讲MYSQL的各个字符集设置,关于基础理论部分,参考于这里.   1. MYSQL的系统变量 – character_set_server:默认的内部操作 ...

  2. Android ActionBar Home按钮返回事件处理的两种方式

    今早无聊查看了一下android官方文档,最近对ActionBar很感兴趣,它确实对我们的日常开发起到了很便捷的作用. 对于通过点击ActionBar的Home按钮返回,以前我只知道有一种方式:也就是 ...

  3. 20款优秀的国外 Mobile App 界面设计案例

    在下面给大家分享的移动应用程序界面设计作品中,你可以看到不同创意类型的视觉效果.如果你想获得灵感,那很有必要看看下面20个优秀用户体验的移动应用 UI 设计.想要获取更多的灵感,可以访问移动开发分类, ...

  4. thread_fork/join并发框架2

    转自  http://blog.csdn.net/mr_zhuqiang/article/details/48300229 三.使用异步方式 invokeAll(task1,task2); 是同步方式 ...

  5. 进入IT企业必读的200个.NET面试题

    点击打开链接 点击打开链接 版权声明:本文为博主原创文章,未经博主允许不得转载.

  6. sql: table,view,function, procedure created MS_Description in sql server

    --添加描述 geovindu --https://msdn.microsoft.com/en-us/library/ms180047.aspx --https://msdn.microsoft.co ...

  7. asp.net 前台绑定后台变量方法总结:<%= %> 和<%# %>的区别

    经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教.  一 ...

  8. FreeBSD暂时用9.X系列为宜

    今天尝试在FreeBSD10 上编译c代码,发现gcc被换成llvm后,环境配置需要重新学习.

  9. jQuery获取Select选择的Text和 Value(转)用时比较方便寻找

    ---恢复内容开始--- jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code. ...

  10. jquery 拓展

    1. 概述 jquery允许拓展自定义的方法, 绑定到$.fn对象上, 编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要return this;以支持链式调用 ...