java 非对称加密(公钥加密)

我夕

在实际的应用中单单只有对称加密是不够的,更多的时候是对称加密与非对称加密结合使用,非对称加密(公钥加密)特点速度慢、加密和解密的钥匙不相同,加密的方式是:

* 公钥加密-私钥解密

* 私钥加密-公钥解密

这两种,这里给大家演示下第一种方式,剩下一种大家自己测试下。

步骤:

得到keyPairGenerator的实例对象,并调用其generateKeyPair()方法创建KeyPair对象。

调用KeyPair对象的getPrivate和getPublic方法,分别得到PrivateKey对象和PublicKey对象。

得到Cipher的实例对象,并调用其init()方法指定PrivateKey对象或PublicKey对象,并指定要进行加密、还是进行解密操作。

调用Cipher对象的doFinal()方法完成加密或解密操作。

代码如下:

[html] view plaincopy

package com.study.security;

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.security.Key;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import javax.crypto.Cipher;

import javax.crypto.CipherInputStream;

/**

* 非对称加密-公钥加密

* 公钥加密-私钥解密

* 私钥加密-公钥解密

* @author 我夕

*

*/

public class PublicSecret {

/**

* @param args

*/

public static void main(String[] args) throws Exception{

publicEncrypt();

privatecEncrypt();

}

/**

* 公钥加密

* @throws Exception

*/

private static void publicEncrypt() throws Exception{

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

//产生钥匙对

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

KeyPair keyPair=keyPairGenerator.generateKeyPair();

PublicKey publicKey= keyPair.getPublic();

PrivateKey privateKey=keyPair.getPrivate();

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

//前面做加密时都是用默认的编码,如果加密的数据是中文会出现乱码,现在改成中文的数据进行测试以下

byte[] results=cipher.doFinal("我是要被加密的数据!".getBytes("UTF-8"));

//保存密钥,由于是公钥加密,解密时得用私钥,所以这里要对产生的私钥进行存盘

saveKey(privateKey, "key_public.key");

saveData(results, "key_pubData.data");

System.out.println("加密后的数据:"+new String(results));

}

/**

* 私钥解密

* @throws Exception

*/

private static void privatecEncrypt() throws Exception{

//读取key与data

Key privateKey=readKey("key_public.key");

byte[] results=readData("key_pubData.data");

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

cipher.init(Cipher.DECRYPT_MODE, privateKey);

//不要忘记了加编码格式,不然乱码

System.out.println("解密后的数据:"+new String(cipher.doFinal(results),"UTF-8"));

//===================读数据的另一种写法,如以下========================

FileInputStream fis=new FileInputStream("key_pubData.data");

CipherInputStream cis=new CipherInputStream(fis,cipher);

ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();

int len=0;

byte[] data=new byte[1024];

while((len=cis.read(data))!=-1){

arrayOutputStream.write(data, 0, len);

}

byte[] result2=arrayOutputStream.toByteArray();

arrayOutputStream.close();

cis.close();

System.out.println("解密后的数据(读取数据的另一种方式):"+new String(result2,"UTF-8"));

}

/**

* 保存数据的方法

* @param results

* @param dataName

* @throws Exception

*/

public static void saveData(byte[] results,String dataName)throws Exception{

FileOutputStream fosData=new FileOutputStream(dataName);

fosData.write(results);

fosData.close();

}

/**

* 读取数据的方法

* @param dataName

* @return byte[]

* @throws Exception

*/

public static byte[] readData(String dataName)throws Exception{

FileInputStream fisDat= new FileInputStream(dataName);

//读二进制数据

ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();

int len=0;

byte[] data=new byte[1024];

while((len=fisDat.read(data))!=-1){

arrayOutputStream.write(data, 0, len);

}

byte[] result=arrayOutputStream.toByteArray();

arrayOutputStream.close();

fisDat.close();

return result;

}

/**

* 保存密钥的方法

* @param key

* @param keyName

* @throws Exception

*/

public static void saveKey(Key key,String keyName) throws Exception{

FileOutputStream foskey=new FileOutputStream(keyName);

ObjectOutputStream oos=new ObjectOutputStream(foskey);

oos.writeObject(key);

oos.close();

foskey.close();

}

/**

* 读取密钥的方法

* @param keyName

* @return Key

* @throws Exception

*/

public static Key readKey(String keyName) throws Exception{

FileInputStream fiskey=new FileInputStream(keyName);

ObjectInputStream oiskey=new ObjectInputStream(fiskey);

Key key=(Key)oiskey.readObject();

oiskey.close();

fiskey.close();

return key;

}

}

运行结果:


相关文章

  • 电子商务技术基础课后习题及答案
  • 电子商务技术基础课后习题及参考答案 第一章:参考答案 1. 传统的商务与现代电子商务有什么区别? 参考答案:电子商务将传统商业活动中物流.资金流.信息流的传递方式利用网络科技整合,企业将重要的信息通过全球信息网(WWW ).企业内部网(intranet) 或外联网(extranet) 直接与颁布各地 ...

  • java学习心得笔记
  • j2ee学习笔记 注:框架可以用word菜单中的 "视图/文档结构图" 看到 j2ee模式 value object(值对象) 用于把数据从某个对象/层传递到其他对象/层的任意java对象. 通常不包含任何业务方法. 也许设计有公共属性,或者提供可以获取属性值的get方法. js ...

  • 数字证书详解
  • 数字证书 一. 什么是数字证书? 数字证书就是网络通讯中标志通讯各方身份信息的一系列数据,其作用类似于现实生活中的身份证.它是由一个权威机构发行的,人们可以在互联网上用它来识别对方的身份. 最简单的证书包含一个公开密钥.名称以及证书授权中心的数字签名.一般情况下证书中还包括密钥的有效时间,发证机关( ...

  • 一种电子商务安全解决方案的研究与实现
  • 第21400瓣4翱期年5月 微机发展 MicrocomputerDevelopment V()1.14No.5 Mav2004 一种电子商务安全解决方案的研究与实现 徐东伟,须德 (北京交通大学计算机与信息技术学院,北京100044) 摘要:随着计算机技术的发展,电子商务逐渐显示出其相对于传统商务活 ...

  • 加密协议的原理4
  • http(超文本传输协议)Encryption protocolEncryption 一种属于应用层的协议 缺点: 1.通信使用明文(不加密),内容可能会被窃听 2.不验证通信方的身份,因此有可能遭遇伪装 3.无法证明报文的完整性,所以有可能已遭篡改 优点: 1.传输速度快 https(加密协议 E ...

  • 电子签名的技术实现
  • 电子签名的技术实现 <中华人民共和国电子签名法(草案)>于2004年4月2日提交全国人大常委会第八次会议首次审议,最近的第十次会议又对该<草案>进行了二读,原预计今年底出台的<中华人民共和国电子签名法>,在业内专家.各相关企业乃至政府部门的大力推动下,有望提前出台 ...

  • 基于PKI技术的文件保密系统的实现
  • 编号 毕业论文 基于PKI 技术的文件保密系统题 目 的实现 学生姓名 学 号 学 院 专 业 班 级 指导教师 计算机科学与技术学院 讲师 二〇 年 月 诚信承诺书 本人郑重声明:所呈交的毕业设计(论文)(题目: 基于PKI 技术的文件保密系统的实现)是本人在导师的指导下独立进行研究所取得的成果. ...

  • 基于网络的主动防泄密文件加密技术
  • 基于网络的主动防泄密文件加密技术 作者:葛 春 项兆军 宋洪娟等 来源:<现代电子技术>2009年第22期 摘 要:分析信息安全防护现状,提出基于网络的系统密钥加密机制,在加密与eKey模块应用设计基础上,研制一种密钥安全获取通信协议,实现了密钥的安全管理,设计了缜密的加解密流程,使得文 ...

  • 数字摘要与数字证书
  • 数字摘要与数字证书 1. 数字摘要 定义:数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是 消息的函数,也就是Hash 函数. 一个Hash 函数的好坏是由发生碰撞的概率决定的.如果攻击者能够轻易地构造出两个消息具有相同的Hash 值,那么这样的Hash 函数是很危险的.一般来说 ...

© 2024 范文中心 | 联系我们 webmaster# onjobs.com.cn