java加密与解密的艺术 第2版 源码_java 加密与解密艺术二

packagecom.weiyuan.test;importjava.io.ByteArrayOutputStream;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.PrivateKey;importjava.security.PublicKey;importjavax.crypto.Cipher;importjavax.crypto.NoSuchPaddingException;public classRSACrypt {public static voidmain(String[] args) {//生成RSA的密钥对

try{

String input="我爱黑马程序文件和将服务很纠结二十夫君今何伤方法反倒是积极上进发动机号的时间较慢的方式结算单夫君今何伤的今君得所附渐觉受东风基金会的深井冻痕生解决好多说几句话的实践活动睡觉觉";

KeyPairGenerator keyPairGenerator= KeyPairGenerator.getInstance("RSA");

KeyPair keyPair=keyPairGenerator.generateKeyPair();

PrivateKey privateKey=keyPair.getPrivate();

PublicKey publicKey=keyPair.getPublic();

String encryptByPublicKey=encryptByPublicKey(publicKey, input);

String privateKey2=decryptByPrivateKey(privateKey, encryptByPublicKey);

System.out.println(privateKey2);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/*** 接下来我们来实现私钥加密

*@throwsNoSuchPaddingException

*@throwsException

*

**/

public static String encryptByPublicKey(PublicKey publicKey,String input) throwsException, NoSuchPaddingException{

Cipher cipher= Cipher.getInstance("RSA");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);//这里要采用分段加密的方式对数据进行加密//RSA分段加密最大的分段大小是117个字节//加密的偏移量

int offset = 0;byte[] buffer = new byte[1024];

ByteArrayOutputStream bOutputStream= newByteArrayOutputStream();//判断加密数据是否结束

while(input.getBytes().length - offset > 0){//判断是否到了最后一个分段块

if(input.getBytes().length - offset > 117){

buffer= cipher.doFinal(input.getBytes(),offset,117);

bOutputStream.write(buffer);

offset= offset +117;

}else{//说明最后一个分段快

buffer = cipher.doFinal(input.getBytes(),offset,input.getBytes().length -offset);

bOutputStream.write(buffer);

offset=input.getBytes().length;

}

}//将加密之后的数据进行base64编码,输出

String result =Base64Util.encode(bOutputStream.toByteArray());returnresult;

}/*** 接下来我们来实现公钥加密

*@throwsNoSuchPaddingException

*@throwsException

*

**/

public static String encryptByPrivateKey(PrivateKey privateKey,String input) throwsException, NoSuchPaddingException{

Cipher cipher= Cipher.getInstance("RSA");

cipher.init(Cipher.ENCRYPT_MODE, privateKey);//这里要采用分段加密的方式对数据进行加密//RSA分段加密最大的分段大小是117个字节//加密的偏移量

int offset = 0;byte[] buffer = new byte[1024];

ByteArrayOutputStream bOutputStream= newByteArrayOutputStream();//判断加密数据是否结束

while(input.getBytes().length - offset > 0){//判断是否到了最后一个分段块

if(input.getBytes().length - offset > 117){

buffer= cipher.doFinal(input.getBytes(),offset,117);

bOutputStream.write(buffer);

offset= offset +117;

}else{//说明最后一个分段快

buffer = cipher.doFinal(input.getBytes(),offset,input.getBytes().length -offset);

bOutputStream.write(buffer);

offset=input.getBytes().length;

}

}//将加密之后的数据进行base64编码,输出

String result =Base64Util.encode(bOutputStream.toByteArray());returnresult;

}/*** 接下来我们来实现私钥解密

*@throwsNoSuchPaddingException

*@throwsException

*

**/

public static String decryptByPrivateKey(PrivateKey privateKey,String input) throwsException, NoSuchPaddingException{//传入的参数是经过base64加密的数据,首先需要对数据进行base64解密

byte[] inputCode =Base64Util.decode(input);

Cipher cipher= Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey);//这里要采用分段加密的方式对数据进行加密//RSA分段解密最大的分段大小是128个字节//加密的偏移量

int offset = 0;byte[] buffer = new byte[1024];

ByteArrayOutputStream bOutputStream= newByteArrayOutputStream();//判断加密数据是否结束

while(inputCode.length - offset > 0){//判断是否到了最后一个分段块

if(inputCode.length - offset > 128){

buffer= cipher.doFinal(inputCode,offset,128);

bOutputStream.write(buffer);

offset= offset +128;

}else{//说明最后一个分段快

buffer = cipher.doFinal(inputCode,offset,inputCode.length -offset);

bOutputStream.write(buffer);

offset=inputCode.length;

}

}//将加密之后的数据进行base64编码,输出

String result =bOutputStream.toString();returnresult;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值