有时项目中需要用到一些加密和解密工具,这里之前整理了一个demo,记录一下,方便查询

 package com.test;

 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.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
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; public class RSAsecurity { public static Map<String,String> getKey(int length){
try {
//1.初始化秘钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); //秘钥长度
keyPairGenerator.initialize(length);
//初始化秘钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//公钥
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
//私钥
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); byte[] publicKeyByte = rsaPublicKey.getEncoded(); byte[] privateKeyByte = rsaPrivateKey.getEncoded(); String publicKey = Base64.encodeBase64String(publicKeyByte); String privateKey = Base64.encodeBase64String(privateKeyByte); Map<String,String> map = new HashMap<String,String>(); map.put("publicKey", publicKey); map.put("privateKey", privateKey); return map; } catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new HashMap<String,String>();
} public static void main(String[] args) {
//Map<String,String> map = RSAsecurity.getKey(1024);
//System.out.println(map.get("publicKey"));
RSAsecurity.pubENpriDE();
//System.out.println("---");
} /*RSA 工具类。提供加密,解密,生成密钥对等方法。
RSA加密原理概述
RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。
据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积
密钥的产生:
1.选择两个大素数 p,q ,计算 n=p*q;
2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质
3.利用 Euclid 算法计算解密密钥 d , 使其满足 e*d = 1(mod(p-1)*(q-1)) (其中 n,d 也要互质)
4:至此得出公钥为 (n,e) 私钥为 (n,d)
RSA速度
* 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论 是软件还是硬件实现。
* 速度一直是RSA的缺陷。一般来说只用于少量数据 加密。*/ public static void priENpubDE() {
String src="RSA 加密字符串";
try {
//1.初始化秘钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//秘钥长度
keyPairGenerator.initialize(1024);
//初始化秘钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//公钥
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
String publicKeyStr = Base64.encodeBase64String(rsaPublicKey.getEncoded());
//私钥
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String privateKeyStr = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); //2.私钥加密,公钥解密----加密
//生成私钥
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
KeyFactory keyFactory =KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
Cipher cipher =Cipher.getInstance("RSA");
//初始化加密
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("私钥加密,公钥解密----加密:"+Base64.encodeBase64String(result)); //3.私钥加密,公钥解密----解密
//生成公钥
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
keyFactory=KeyFactory.getInstance("RSA");
PublicKey publicKey= keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
//初始化解密
cipher.init(Cipher.DECRYPT_MODE,publicKey);
result = cipher.doFinal(result);
System.out.println("私钥加密,公钥解密----解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
} public static void pubENpriDE() {
String src="RSA 加密字符串";
try {
//1.初始化秘钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//秘钥长度
keyPairGenerator.initialize(512);
//初始化秘钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//公钥
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
//私钥
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); //2.公钥加密,私钥解密----加密
X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
//初始化加密
//Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
Cipher cipher =Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
//加密字符串
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("公钥加密,私钥解密----加密:"+Base64.encodeBase64String(result)); //3.公钥加密,私钥解密-----解密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//初始化解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//解密字符串
result = cipher.doFinal(result);
System.out.println("公钥加密,私钥解密-----解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

总结:公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。

RSA加密、解密、公钥私钥生成的更多相关文章

  1. RSA 加密 解密 公钥 私钥 签名 加签 验签

    http://blog.csdn.net/21aspnet/article/details/7249401# http://www.ruanyifeng.com/blog/2013/06/rsa_al ...

  2. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  3. 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#

    前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...

  4. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  5. RSA加密解密和读取公钥、私钥

    /// <summary>     /// RSA加密解密及RSA签名和验证    /// </summary>     public class RSADE    {    ...

  6. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  7. iOS and JAVA 的 RSA 加密解密 (转载整理 )

    参考原文地址:http://www.cnblogs.com/makemelike/articles/3802518.html (至于RSA的基本原理,大家可以看 阮一峰的网络日志 的 RSA算法原理( ...

  8. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  9. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  10. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

随机推荐

  1. wxWidgets界面开发工具wxFormBuilder的使用

    wxFormBuilder 下载地址:http://download.csdn.net/detail/lsmallstop/7013401 安装完成后,打开wxFormBuilder,可以在左侧工程子 ...

  2. Hadoop Mapreduce分区、分组、二次排序过程详解

    转载:http://blog.tianya.cn/m/post.jsp?postId=53271442 1.MapReduce中数据流动 (1)最简单的过程:  map - reduce (2)定制了 ...

  3. 根据DatabaseMetaData确定数据库类型

    根据DatabaseMetaData确定数据库类型 DataSource dataSource = dataSourceTransactionManager.getDataSource(); conn ...

  4. mongodb副本集的基础概念和各种机制

         从一开始我们就在讲如何使用一台服务器.一个mongod服务器进程,如果只用做学习和开发,这是可以的,但如果在生产环境中,这是很危险的,如果服务器崩溃了怎么办?数据库至少要一段时间不可用,如果 ...

  5. centos下lvs配置

    一.lvs-nat模式 网络配置: lvs-server eth0 :host-only adapter 192.168.56.101 lvs-server eth1 :Internal 192.16 ...

  6. vue2 axios 接口函数封装

    封装 axios 工具,编辑 src/api/index.js 文件 首先,我们要使用 axios 工具,就必须先安装 axios 工具.执行下面的命令进行安装 npm install axios - ...

  7. Android Touch事件传递机制具体解释 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  8. 怎样在编译的时候,控制删除apk不用的资源?

    1.改动alps/meidatek/config/xxx/ProjectConfig.mk下的MTK_PRODUCT_LOCALS,去掉不用的资源,比方屏幕密度或语言等.  2. nodpi和mipm ...

  9. 【ORACLE】ORA-27102: out of memory报错的处理

    ************************************************************************ ****原文:blog.csdn.net/clark_ ...

  10. linux 源代码安装mysql5.5

    linux下源代码安装mysql过程例如以下: yum update yum upgrade yum install -y vim man wget yum install -y gcc gcc-c+ ...