博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RSA典型非对称加密算法
阅读量:6311 次
发布时间:2019-06-22

本文共 3944 字,大约阅读时间需要 13 分钟。

私钥加密-->公钥解密,反之亦然,但不安全。也可以当做数字签名。
public 
class 
RSACoder {
        
//非对称加密算法
        
public 
static 
final 
String 
KEY_ALGORITHM
= 
"RSA"
;
        
//公钥
        
private 
static 
final 
String 
PUBLIC_KEY
= 
"RSAPublicKey"
;
        
//私钥
        
private 
static 
final 
String 
PRIVATE_KEY
= 
"RSAPrivateKey"
;
        
//密钥长度,默认1024位,512~65536位,必须是64的倍数
        
private 
static 
final 
int 
KEY_SIZE
=512;
       
        
//私钥解密
        
public 
static 
byte
[] decryptByPrivateKey(
byte
[] data, 
byte
[] key) 
throws 
KeyException, Exception{
               
//取得私钥,
              PKCS8EncodedKeySpec pkcs8KeySpec= 
new 
PKCS8EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(
KEY_ALGORITHM
);
              PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
              
               
//对数据解密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. 
DECRYPT_MODE
, privateKey);
               
return 
cipher.doFinal(data);
       }
       
        
//公钥解密
        
public 
static 
byte
[] decryptByPublicKey(
byte
[] data, 
byte
[] key) 
throws 
Exception{
              X509EncodedKeySpec x509= 
new 
X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(
KEY_ALGORITHM
);
              
               
//生成公钥
              PublicKey publicKey=keyFactory.generatePublic(x509);
               
//对数据解密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. 
DECRYPT_MODE
, publicKey);
               
return 
cipher.doFinal(data);
       }
       
        
//公钥加密
        
public 
static 
byte
[] encrpytByPublicKey(
byte
[] data, 
byte
[] key) 
throws 
Exception{
               
//取得公钥
              X509EncodedKeySpec x509= 
new 
X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(
KEY_ALGORITHM
);
              PublicKey pubKey=keyFactory.generatePublic(x509);
               
//对数据加密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. 
ENCRYPT_MODE
, pubKey);
               
return 
cipher.doFinal(data);
       }
       
        
//私钥加密
        
public 
static 
byte
[] encryptByPrivate(
byte
[] data, 
byte
[] key) 
throws 
Exception, GeneralSecurityException{
               
//取得私钥
              PKCS8EncodedKeySpec pkcs8= 
new 
PKCS8EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(
KEY_ALGORITHM
);
               
//生成私钥
              PrivateKey privateKey=keyFactory.generatePrivate(pkcs8);
               
//对数据加密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. 
ENCRYPT_MODE
, privateKey);
               
return 
cipher.doFinal(data);
       }
       
        
//取得私钥
        
public 
static 
byte
[] getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( 
PRIVATE_KEY
);
               
return 
key.getEncoded();
       }
        
//取得公钥
        
public 
static 
byte
[] getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( 
PUBLIC_KEY
);
               
return 
key.getEncoded();
       }
       
        
//初始化密钥
        
public 
static 
Map<String,Object> initKey() 
throws 
Exception{
              KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance( 
KEY_ALGORITHM
);
              keyPairGen.initialize( 
KEY_SIZE
);
              KeyPair keyPair=keyPairGen.generateKeyPair();
              
               
//公钥
              RSAPublicKey publicKey=(RSAPublicKey)keyPair.getPublic();
               
//私钥
              RSAPrivateKey privateKey=(RSAPrivateKey)keyPair.getPrivate();
              
               
//封装密钥
              Map<String,Object> keyMap= 
new 
HashMap<String,Object>(2);
              keyMap.put( 
PRIVATE_KEY
, privateKey);
              keyMap.put( 
PUBLIC_KEY
, publicKey);
               
return 
keyMap;
       }
}

public 
class 
RSATest {
        
private 
static 
byte
[] 
privateKey
;
        
private 
static 
byte
[] 
publicKey
;
       
        
public 
static 
void 
initKey() 
throws 
Exception{
               
//初始化密钥
              Map<String,Object> keyMap=RSACoder. initKey();
               
publicKey
=RSACoder.getPublicKey(keyMap);
               
privateKey
=RSACoder.getPrivateKey(keyMap);
              
              System. 
out
.println(
"公钥:\n" 
+Base64.encodeBase64String (
publicKey 
));
              System. 
out
.println(
"私钥:\n" 
+Base64.encodeBase64String (
privateKey 
));
       }
        
public 
static 
void 
main(String[] args) 
throws 
GeneralSecurityException, Exception {
               
// 
TODO 
Auto-generated method stub
               initKey();
              String inputStr1= 
"RSA加密算法" 
;
               
byte
[] data1=inputStr1.getBytes();
              System. 
out
.println(
"原文:\n" 
+inputStr1);
              
               
//私钥加密
               
byte
[] encodeData1=RSACoder.encryptByPrivate(data1, 
privateKey
);
              System. 
err
.println(
"加密后:\n" 
+Base64.encodeBase64String (encodeData1));
              
               
//公钥解密
               
byte
[] decodeData1=RSACoder.decryptByPublicKey(encodeData1, 
publicKey
);
              String outputStr1= 
new 
String(decodeData1);
              System. 
err
.println(
"解密后:\n" 
+outputStr1);
              
               assertEquals(inputStr1,outputStr1);
              
       }
}

转载于:https://www.cnblogs.com/littlefishxu/p/3969186.html

你可能感兴趣的文章
Java Web-----JSP与Servlet(一)
查看>>
Maven搭建SpringMVC+Mybatis项目详解
查看>>
关于量子理论:最初无意的简化,和一些人有意的强化和放大
查看>>
CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
查看>>
“区块链”并没有什么特别之处
查看>>
没有功能需求设计文档?对不起,拒绝开发!
查看>>
4星|《先发影响力》:影响与反影响相关的有趣的心理学研究综述
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
python之 列表常用方法
查看>>
vue-cli脚手架的搭建
查看>>
在网页中加入百度搜索框实例代码
查看>>
在Flex中动态设置icon属性
查看>>
采集音频和摄像头视频并实时H264编码及AAC编码
查看>>
3星|《三联生活周刊》2017年39期:英国皇家助产士学会于2017年5月悄悄修改了政策,不再鼓励孕妇自然分娩了...
查看>>
高级Linux工程师常用软件清单
查看>>
堆排序算法
查看>>
folders.cgi占用系统大量资源
查看>>
路由器ospf动态路由配置
查看>>
zabbix监控安装与配置
查看>>
python 异常
查看>>