非对称加密算法RSA
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法晚于DH算法,这五个字母全都是人名首字母.DH算法是第一个非对称密码体系.
RSA算法运算速度慢,不适宜加密大量数据.一种解决方案是,将RSA跟对称加密方式混合使用,将数据使用对称加密方式加密,对称加密的密钥使用RSA算法加密,因为密钥很短,所以时间费不了太多.实际上,对称加密方式唯一的弊端就是密钥不好传递,对称加密方式也很难破解.
RSA的适用情景一:
(1)服务器生成一个公钥和一个私钥,把公钥公开了.
(2)客户端使用公钥把数据进行加密,上交服务器.别人是没法理解加密后的数据的.
(3)服务器使用私钥将数据解密,查看用户提交的数据.
这种情景下,公钥像是一个信箱,每个人都可以往这个信箱里面放信,但是这个信箱里面的信只有掌握信箱钥匙的人才能开箱查看.
RSA适用情景二:
(1)皇上生成一个公钥和一个密钥,把公钥公开了.
(2)皇上发布了一封诏书,昭告天下.诏书右下角有两串数字,第一串数字是一个随机串,第二串数字是用私钥加密第一串数字所得的结果.
(3)有人不相信这诏书是皇上写的,就把第二串数字使用公钥解密,解密之后发现跟第一串数字一样,说明确实是皇上写的,因为一般人没有密钥,也就没法加密那些能够用公钥解密的数据.
这种情境下,公钥用于解密,私钥用于加密,这可以用于发布公告时,证明这个公告确实是某个人发的.相当于签名.
实际上,签名没有必要特别长,一般情况下,签名是定长的,要想定长,可以使用MessageDigest算法,如MD5和SHA系列.所以就有了多种签名算法,如MD5withRSA等.
下面给出java库中RSA的用法,这个程序包括六部分:公钥加密解密,私钥加密解密,私钥签名公钥验证.
public class RSA {
/**
* 定义加密方式
*/
private final static String KEY_RSA = "RSA";
/**
* 定义签名算法
*/
private final static String KEY_RSA_SIGNATURE = "MD5withRSA";
static PrivateKey toPrivateKey(byte[] b)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// 构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(b);
// 指定的加密算法
KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
// 取私钥对象
return factory.generatePrivate(pkcs);
}
static PublicKey toPublicKey(byte[] b) throws Exception {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
return factory.generatePublic(keySpec);
}
// 用私钥对data签名
public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {
Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
signature.initSign(toPrivateKey(privateKey));
signature.update(data);
return signature.sign();
}
// 公钥解密数据
public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)
throws Exception {
Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
signature.initVerify(toPublicKey(publicKey));
signature.update(data);
return signature.verify(sign);
}
public static byte[] decryptByPrivateKey(byte[] data, byte[] key)
throws Exception {
Cipher cipher = Cipher.getInstance(KEY_RSA);
cipher.init(Cipher.DECRYPT_MODE, toPrivateKey(key));
return cipher.doFinal(data);
}
public static byte[] decryptByPublicKey(byte[] data, byte[] key)
throws Exception {
Cipher cipher = Cipher.getInstance(KEY_RSA);
cipher.init(Cipher.DECRYPT_MODE, toPublicKey(key));
return cipher.doFinal(data);
}
public static byte[] encryptByPublicKey(byte[] data, byte[] key)
throws Exception {
Cipher cipher = Cipher.getInstance(KEY_RSA);
cipher.init(Cipher.ENCRYPT_MODE, toPublicKey(key));
return cipher.doFinal(data);
}
public static byte[] encryptByPrivateKey(byte[] data, byte[] key)
throws Exception {
Cipher cipher = Cipher.getInstance(KEY_RSA);
cipher.init(Cipher.ENCRYPT_MODE, toPrivateKey(key));
return cipher.doFinal(data);
}
static String tos(byte[] b) {
String ans = "";
for (int i = 0; i < b.length; i++) {
ans += String.format("%02X", b[i]);
}
return ans;
}
public static void main(String[] args) throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);
// generator.initialize(1024);//默认为1024
KeyPair keyPair = generator.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
System.out.println("公钥:" + tos(publicKey.getEncoded()));
System.out.println("私钥:" + tos(privateKey.getEncoded()));
byte[] data = "你好,世界!".getBytes();
System.out.println("公钥加密-------私钥解密");
byte[] enc = encryptByPublicKey(data, publicKey.getEncoded());
byte[] dec = decryptByPrivateKey(enc, privateKey.getEncoded());
System.out.println("加密前:" + tos(data));
System.out.println("解密后:" + tos(dec));
System.out.println("私钥加密--------公钥解密");
enc = encryptByPrivateKey(data, privateKey.getEncoded());
dec = decryptByPublicKey(enc, publicKey.getEncoded());
System.out.println("加密前:" + tos(data));
System.out.println("解密后:" + tos(dec));
System.out.println("私钥签名--------公钥验证签名");
byte[] sign = sign(data, privateKey.getEncoded());
boolean status = verify(data, publicKey.getEncoded(), sign);
System.out.println("签名:" + tos(sign));
System.out.println("状态:" + status);
}
}
非对称加密算法RSA的更多相关文章
- 非对称加密算法RSA使用注意事项
原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteg ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 非对称加密算法-RSA算法
一.概述 1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现 2.java6支持RSA算法 3.RSA算法可以用于数据加密和数字签名 4.RSA算法相对于DES/AES等对 ...
- JAVA 非对称加密算法RSA
非对称加密算法 RSA过程 : 以甲乙双方为例 1.初始化密钥 构建密钥对,生成公钥.私钥保存到keymap中 KeyPairGenerator ---> KeyPair --> RSAP ...
- Java加密技术(四)非对称加密算法RSA
RSA 这样的算法1978年就出现了.它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作.也非常流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir ...
- 非对称加密算法RSA 学习
非对称加密算法RSA 学习 RSA加密算法是一种非对称加密算法.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...
- 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- 信息加密之非对称加密算法RSA
前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...
- 第十二章 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- openssl 非对称加密算法RSA命令详解
1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...
随机推荐
- IE8兼容模式设置
设置---兼容性视图设置--添加此网站--在IE8中调试(防止调整IE内核后浏览器崩溃,360可通过设置极速模式-兼容模式 点击地址栏绿色图标)
- centos 更换软件源
最近都在使用国内的VPS.系统统一使用的都是Linux系统.但是,有一些服务商的系统给默认设置的是国外的.这样就会导致下载速度缓慢.于是,找到了国内几家比较热门的镜像点.奉献给大家.下面的镜像全部支持 ...
- gcc boost版本冲突解决日记
问题背景 项目在Ubuntu10 64位 boost 1.55,boost采用的是项目内包含相对目录的形式部署 项目采用了 -Wall -Wextra -Werror -Wconversion 最高的 ...
- SharePoint 2010 GridView/SPGridView完全应用系统样式
自定义开发页面如果用到了GridView或SPGridView默认跟列表的样式是不一样的,如要要一样,需要: 1)aspx <asp:GridView DataKeyNames="ID ...
- shiro 实现单用户登录,一个用户同一时刻只能在一个地方登录
我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件. shiro.ini [main] # Objects and their properties are defined ...
- IOS开发基础知识--碎片35
1:iOS视图控制对象生命周期 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidAp ...
- 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享
架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是 CI/CD.Dev ...
- 使用用户自定义类型 CLR UDT
一些复合类型进行范式分解是没有必要的,尤其是一些统一模型的情况下 SET NOCOUNT ON DECLARE @i TimeBalance SET @i = CAST(' ...
- python爬虫—爬取百度百科数据
爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数 ...
- Atitit.木马病毒websql的原理跟个设计
Atitit.木马病毒websql的原理跟个设计 1. Keyword Wsql { var sql="select "+p.txt+" as t,"+p.v+ ...