RSA加密介绍
2014-11-17 10:31
113 查看
RSA 算法: RSA是目前最有影响力的公钥加密算法,
明文--->公钥--->密文 密文-->密钥-->明文
通过这个我们可知
他是公钥对内容进行加密 进而借助密钥对文件进行解密 因为公钥和密钥是不一样的 所以 我们将其称为
非对称加密。
RSA由于public
key<公钥> 和private key<密钥>的不同<也叫非对称算法加解密>,极大的提高了文件的安全性。
代码如下
KeyPairGenerator是一个引擎类可以生成私钥及其相关利用公钥算法初始化。
1:
//设置使用何种加密算法
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
构造一个新实例的KeyPairGenerator算法使用的名称。
// 密钥位数
keyPairGen.initialize(1024);
// 密钥对
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
2:
为了公钥跟私钥可以传输和保存,因此可以设置为将他们转化成base64的编码,用到以下方法:
注意 这个地方就是将数据转化为base64编码
/****************************************
* 函数说明:getKeyString 根据key得到64位加密字符串
*
* @param key 密钥
* @throws Exception
* @return String 加密后的字符串
* @author 王洪贺 2013-8-21
***************************************/
public static String getKeyString(Key key) throws Exception
{
byte[] keyBytes = key.getEncoded();
String s = base64Enc(keyBytes);
return s;
}
但加密跟解密的时候需要将base64位的编码转化为key的对象,所以用到以下两个方法:
/****************************************
* 函数说明:getPublicKey 取得公钥
*
* @param key 公钥字符串
* @throws Exception
* @return PublicKey 返回公钥
* @author 王洪贺 2013-8-21
***************************************/
public static PublicKey getPublicKey(String key) throws Exception
{
byte[] keyBytes;
keyBytes = base64Dec(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
/****************************************
* 函数说明:getPrivateKey 取得私钥
*
* @param key 私钥字符串
* @throws Exception
* @return PrivateKey 返回私钥
* @author 王洪贺 2013-8-21
***************************************/
public static PrivateKey getPrivateKey(String key) throws Exception
{
byte[] keyBytes;
keyBytes = base64Dec(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
下面就是加密过程,很简单:
// 实例化加解密类
Cipher cipher = Cipher.getInstance("RSA");
// 明文
byte[] plainText = "明文".getBytes();
// 加密
cipher.init(Cipher.ENCRYPT_MODE, publicKe);
//将明文转化为根据公钥加密的密文,为byte数组格式
byte[] enBytes = cipher.doFinal(plainText);
//为了方便传输我们可以将byte数组转化为base64的编码
String str = base64Enc(enBytes );
复制代码
下面是解密过程,跟加密过程类似:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//先将转为base64编码的加密后的数据转化为byte数组
byte[] enBytes = base64Dec(str);
//解密称为byte数组,应该为字符串数组最后转化为字符串
byte[] deBytes = cipher.doFinal(enBytes);
String strdecoded = new String(deBytes);
复制代码
总结 可得
1:其实我们找个地方就是首先借助KeyPairGenerator来确定是何种加密方式
比如RSA
另外 我们此时获得我们的公钥和密钥
2:
但是我们为了传输数据的时候更加容易 所以我们就借助base64编码
3:借助 Cipher类实现我们的我们的对传输内容进行加密和解密。
明文--->公钥--->密文 密文-->密钥-->明文
通过这个我们可知
他是公钥对内容进行加密 进而借助密钥对文件进行解密 因为公钥和密钥是不一样的 所以 我们将其称为
非对称加密。
RSA由于public
key<公钥> 和private key<密钥>的不同<也叫非对称算法加解密>,极大的提高了文件的安全性。
代码如下
KeyPairGenerator是一个引擎类可以生成私钥及其相关利用公钥算法初始化。
1:
//设置使用何种加密算法
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
构造一个新实例的KeyPairGenerator算法使用的名称。
// 密钥位数
keyPairGen.initialize(1024);
// 密钥对
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
2:
为了公钥跟私钥可以传输和保存,因此可以设置为将他们转化成base64的编码,用到以下方法:
注意 这个地方就是将数据转化为base64编码
/****************************************
* 函数说明:getKeyString 根据key得到64位加密字符串
*
* @param key 密钥
* @throws Exception
* @return String 加密后的字符串
* @author 王洪贺 2013-8-21
***************************************/
public static String getKeyString(Key key) throws Exception
{
byte[] keyBytes = key.getEncoded();
String s = base64Enc(keyBytes);
return s;
}
但加密跟解密的时候需要将base64位的编码转化为key的对象,所以用到以下两个方法:
/****************************************
* 函数说明:getPublicKey 取得公钥
*
* @param key 公钥字符串
* @throws Exception
* @return PublicKey 返回公钥
* @author 王洪贺 2013-8-21
***************************************/
public static PublicKey getPublicKey(String key) throws Exception
{
byte[] keyBytes;
keyBytes = base64Dec(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
/****************************************
* 函数说明:getPrivateKey 取得私钥
*
* @param key 私钥字符串
* @throws Exception
* @return PrivateKey 返回私钥
* @author 王洪贺 2013-8-21
***************************************/
public static PrivateKey getPrivateKey(String key) throws Exception
{
byte[] keyBytes;
keyBytes = base64Dec(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
下面就是加密过程,很简单:
// 实例化加解密类
Cipher cipher = Cipher.getInstance("RSA");
// 明文
byte[] plainText = "明文".getBytes();
// 加密
cipher.init(Cipher.ENCRYPT_MODE, publicKe);
//将明文转化为根据公钥加密的密文,为byte数组格式
byte[] enBytes = cipher.doFinal(plainText);
//为了方便传输我们可以将byte数组转化为base64的编码
String str = base64Enc(enBytes );
复制代码
下面是解密过程,跟加密过程类似:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//先将转为base64编码的加密后的数据转化为byte数组
byte[] enBytes = base64Dec(str);
//解密称为byte数组,应该为字符串数组最后转化为字符串
byte[] deBytes = cipher.doFinal(enBytes);
String strdecoded = new String(deBytes);
复制代码
总结 可得
1:其实我们找个地方就是首先借助KeyPairGenerator来确定是何种加密方式
比如RSA
另外 我们此时获得我们的公钥和密钥
2:
但是我们为了传输数据的时候更加容易 所以我们就借助base64编码
3:借助 Cipher类实现我们的我们的对传输内容进行加密和解密。
相关文章推荐
- 高级扫描技术及原理介绍(转)
- XSL语法介绍
- 中文编码基础知识介绍
- Extjs - 介绍一个关于Extjs在.Net下的控件
- ActionContext的介绍
- Fritzing介绍
- 分布式文件系统FastDFS介绍安装配置
- sharepoint 2010 搜索功能介绍 -- 金大昊(jindahao)
- UriMatcher类使用介绍/ ContentUris类使用介绍
- LRU缓存介绍与实现 (Java)
- 关于RSA算法密钥长度/密文长度/明文长度的介绍
- JS获取html对象的几种方式介绍
- UBOOT介绍
- Oracle trunc()函数的详细使用介绍
- Cocos2d-x_CCControlSwitch(开关类)介绍
- C++各大有名库的介绍
- Android Paint类的介绍
- 数据结构01_数据结构基本知识介绍
- C#委托的介绍(delegate、Action、Func、predicate)
- 80211(b/a/n/ac)速率介绍