原文地址: http://blog.csdn.net/furongkang/article/details/6882039

Java中加密分为两种方式一个是对称加密,另一个是非对称加密。对称加密是因为加密和解密的钥匙相同,而非对称加密是加密和解密的钥匙不同。

对称加密与非对称加密的区别:

对称加密称为密钥加密,速度快,但加密和解密的钥匙必须相同,只有通信双方才能知道密钥。

非对称加密称为公钥加密,算法更加复杂,速度慢,加密和解密钥匙不相同,任何人都可以知道公钥,只有一个人持有私钥可以解密。

对称加密解密:

     /*
* 对称加密
*/
private static void secretEncrypt() throws Exception {
//使用Cipher的实例
Cipher cipher =Cipher.getInstance("AES"); //得到加密的钥匙
SecretKey key =KeyGenerator.getInstance("AES").generateKey(); //初始化加密操作,传递加密的钥匙
cipher.init(Cipher.ENCRYPT_MODE,key); //将加密的钥匙写入secretKey.key文件中
FileOutputStream fosKey=new FileOutputStream("secretKey.key");
ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
oosSecretKey.writeObject(key);
oosSecretKey.close();
fosKey.close(); //将加密的内容传递进去,返回加密后的二进制数据
byte [] results =cipher.doFinal("哈哈哈哈哈".getBytes()); //将加密后的二进制数据写入到secretContent.dat文件中
FileOutputStream fosData=new FileOutputStream("secretContent.dat");
fosData.write(results);
fosData.close();
} /*
* 对称解密
*/
private static void secretDecrypt() throws Exception{
Cipher cipher =Cipher.getInstance("AES"); //获取文件中的key进行解密
FileInputStream fisKey=new FileInputStream("secretKey.key");
ObjectInputStream oisKey =new ObjectInputStream(fisKey);
Key key =(Key)oisKey.readObject();
oisKey.close();
fisKey.close(); //初始化解密操作,传递加密的钥匙
cipher.init(Cipher.DECRYPT_MODE,key); //获取文件中的二进制数据
FileInputStream fisDat=new FileInputStream("secretContent.dat");
//获取数据第一种方式
byte [] src=new byte [fisDat.available()];
int len =fisDat.read(src);
int total =0;
while(total<src.length){
total +=len;
len=fisDat.read(src,total,src.length-total);
}
//执行解密
byte [] result=cipher.doFinal(src);
fisDat.close();
System.out.println(new String(result)); // 读文件中的数据第二种方式
// ByteArrayOutputStream baos =new ByteArrayOutputStream();
// copyStream(fisDat, baos);
// byte [] result=cipher.doFinal(baos.toByteArray());
// fisDat.close();
// baos.close();
} // private static void copyStream(InputStream ips,OutputStream ops) throws Exception{
// byte [] buf =new byte[1024];
// int len=ips.read(buf);
// while(len!=-1){
// ops.write(buf,0,len);
// len =ips.read(buf);
// }
// }

基于口令的对称加密与解密

系统自动生成的Key不容易记忆,我们可以使用我们容易记忆的口令同过java自带的一个工具将它转换成Key,在解密的时候我们就可以通过口令进行解密。

     /*
* 基于口令的对称加密
*/
private static void secretEncrypt() throws Exception {
//实例化工具
Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES"); //使用该工具将基于密码的形式生成Key
SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000); //初始化加密操作,同时传递加密的算法
cipher2.init(Cipher.ENCRYPT_MODE,key2,parameterspec); //将要加密的数据传递进去,返回加密后的数据
byte [] results =cipher2.doFinal("哈哈哈哈哈".getBytes()); //将加密后的数据写入到文件中
FileOutputStream fosData=new FileOutputStream("zxx.dat");
fosData.write(results);
fosData.close();
} /*
* 基于口令的对称解密
*/
private static void secretDecrypt() throws Exception{
Cipher cipher2=Cipher.getInstance("PBEWithMD5AndDES");
SecretKey key2=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec("123".toCharArray()));
PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000);
cipher2.init(Cipher.DECRYPT_MODE,key2,parameterspec);
FileInputStream fisDat=new FileInputStream("zxx.dat");
byte [] src=new byte [fisDat.available()];
int len =fisDat.read(src);
int total =0;
while(total<src.length){
total +=len;
len=fisDat.read(src,total,src.length-total);
}
byte [] result=cipher2.doFinal(src);
fisDat.close();
System.out.println(new String(result));
}

非对称加密解密:

非对称加密是公钥加密,私钥来解密,这个个人做用的少一点,主要针对于大型的网站大型的企业

     /*
* 公钥加密
*/
private static void PublicEnrypt()throws Exception {
Cipher cipher =Cipher.getInstance("RSA");
//实例化Key
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
//获取一对钥匙
KeyPair keyPair=keyPairGenerator.generateKeyPair();
//获得公钥
Key publicKey=keyPair.getPublic();
//获得私钥
Key privateKey=keyPair.getPrivate();
//用公钥加密
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte [] result=cipher.doFinal("传智播客".getBytes("UTF-8"));
//将Key写入到文件
saveKey(privateKey,"zxx_private.key");
//加密后的数据写入到文件
saveData(result,"public_encryt.dat");
} /*
* 私钥解密
*/
private static void privateDecrypt() throws Exception {
Cipher cipher=Cipher.getInstance("RSA");
//得到Key
Key privateKey=readKey("zxx_private.key");
//用私钥去解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//读数据源
byte [] src =readData("public_encryt.dat");
//得到解密后的结果
byte[] result=cipher.doFinal(src);
//二进制数据要变成字符串需解码
System.out.println(new String(result,"UTF-8"));
} private static void saveData(byte[] result, String fileName) throws Exception {
// TODO Auto-generated method stub
FileOutputStream fosData=new FileOutputStream(fileName);
fosData.write(result);
fosData.close();
}
public static void saveKey(Key key,String fileName)throws Exception{
FileOutputStream fosKey=new FileOutputStream(fileName);
ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
oosSecretKey.writeObject(key);
oosSecretKey.close();
fosKey.close();
}
private static Key readKey(String fileName) throws Exception {
FileInputStream fisKey=new FileInputStream(fileName);
ObjectInputStream oisKey =new ObjectInputStream(fisKey);
Key key=(Key)oisKey.readObject();
oisKey.close();
fisKey.close();
return key;
}
private static byte[] readData(String filename) throws Exception {
FileInputStream fisDat=new FileInputStream(filename);
byte [] src=new byte [fisDat.available()];
int len =fisDat.read(src);
int total =0;
while(total<src.length){
total +=len;
len=fisDat.read(src,total,src.length-total);
}
fisDat.close();
return src;
}

数字签名: 

数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密的消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人。

要证明这段数据是你发过来的,并且没有被别人改过,这就需要用到数字签名,首先我们对整个文档进行md5加密得到16个字节,然后把消息摘要和文档发过去,解密者首先对发过来的文档进行解密,解密后得到一个摘要(md5),对接收的文档进行md5加密,得到的md5结果匹配解密后的摘要,如果匹配成功的话证明没有修改过,我们使用Signature进行签名

     /*
* 使用私钥签名
*/
private static void sign()throws Exception {
//实例化Key
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
//获取一对钥匙
KeyPair keyPair=keyPairGenerator.generateKeyPair();
//获得公钥
PublicKey publicKey=keyPair.getPublic();
//获得私钥
PrivateKey privateKey=keyPair.getPrivate(); //数字签名
Signature signature =Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);//用私钥签名
signature.update("这里签名".getBytes());//对怎样的数据进行签名
byte [] sign=signature.sign(); //获取签名的结果 //保存公钥并写入文件中
saveKey(publicKey,"zxx_private.key");
//将签名后的数据写入到文件
saveData(sign,"public_encryt.dat");
} /*
* 公钥解密
*/
private static void verify() throws Exception {
Signature signture =Signature.getInstance("SHA1withRSA");
//获取到公钥
PublicKey publicKey=(PublicKey)readKey("zxx_private.key");
//初始化校验
signture.initVerify(publicKey);
//初始化签名对象
signture.update("这里签名".getBytes());
//读数据源
byte [] sign =readData("public_encryt.dat");
//返回匹配结果
boolean isYouSigned=signture.verify(sign);
//如果返回数据为true则数据没有发生修改,否则发生修改
System.out.println(isYouSigned);
}

Java安全之对称加密、非对称加密、数字签名的更多相关文章

  1. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

  2. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密

    1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...

  3. HTTPS加密那点事-对称、非对称加密、数字证书

    转自:[漫画]https 加密那点事 首先,HTTP协议的缺点:没有对数据进行加密,都是明文传输的.如果要改进这种明文传输的协议,该如何做呢? 对称加密: 在每次发送真实数据之前,服务器先生成一把密钥 ...

  4. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  5. Java对称与非对称加密解密,AES与RSA

    加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么 ...

  6. 对称、非对称加密算,openssl生成证书(笔记)

    对称加密算法 1.密钥只有一个,加密和解密都需要同一个密钥2.DES,IDEA,AES3.明文+密钥=密文, 密文+密钥=明文4.加密速度快,系统开销小,适用大量数据的加密 非对称加密算法1.密钥由公 ...

  7. [svc]对称加密/非对称加密细枝末节-如何做到数据传输的authentication/data integrity/confidentiality(私密)

    对称/非对称/混合加密的冷知识 数据在互联网上传输,要考虑安全性. 讲到安全,要从三方面考虑: 1.authentication 每一个IP包的认证,确保合法源的数据 2.data integrity ...

  8. java中的数据加密3 非对称加密

    非对称加密也加公钥加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密):同时,使用私钥加密的数据,只有公钥能解开(签名).但是速度很慢(比私钥加密慢10 ...

  9. 个人理解c#对称加密 非对称加密 散列算法的应用场景

    c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...

  10. Android Keystore 对称-非对称加密

    Android数据加密: Anroid数据加密方式 Android 提供了 KeyStore 等可以长期存储和检索加密密钥的机制,Android KeyStore 系统特别适合于存储加密密钥. “An ...

随机推荐

  1. 如何解决MySQLAdministrator 启动报错

    运行环境:MySQL 5.1.41 win32 ZIP 非安装版MySQL GUI Tools 5.0(版本1.2.17.0) 运行MySQLAdministrator时提示:服务器服务或配置文件不能 ...

  2. 一步一步制作yaffs/yaffs2根文件系统(四)---构建etc、dev等剩余目录

    开发环境:Ubuntu 12.04 开发板:mini2440  256M NandFlash   64M SDRAM 交叉编译器:arm-linux-gcc 4.4.3点此可下载 BusyBox版本: ...

  3. 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)

    第一眼就想到DP,然后想了N久就想不到可以不重算的DP  最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...

  4. Andriod x86 4,4

    用 vbox 装了下Andriod x86 4,4 ,能用的App真心少,反正我只是用来看看安卓浏览器里网站效果,海豚浏览器还有qq浏览器x86版,还能用用,主要要换UA为iphone和ipad之类的 ...

  5. 巧用CSS文件愚人节恶搞(转)

    明天就是4月1日愚人节了,也就是那个可适度开玩笑.整蛊的日子了.如果你想和那些要上网的朋友或同事开个极客式玩笑,那就来试试这个国外网友Wes Bos分享的 CSS 文件吧. 一.打开浏览器的 Cust ...

  6. 也用 Log4Net 之将日志记录到数据库的后台实现 (二)

    也用 Log4Net 之将日志记录到数据库的后台实现 (二)  大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之 ...

  7. Algorithm for Maximum Subsequence Sum z

    MSS(Array[],N)//Where N is the number of elements in array { sum=; //current sum max-sum=;//Maximum ...

  8. (转载)HTML与XHTML有什么区别

    转自:http://zhidao.baidu.com/link?url=8wvu7Jbzr-wjeKdWCwWkIiJNSpO3HHLERkgQu1QzuLOPT0zvzkHn9HbAFEjPdchP ...

  9. 卡特兰数 BZOJ3907 网格 NOIP2003 栈

    卡特兰数 卡特兰数2 卡特兰数:主要是求排列组合问题 1:括号化矩阵连乘,问多少种方案 2:走方格,不能过对角线,问多少种方案 3:凸边型,划分成三角形 4:1到n的序列进栈,有多少种出栈方案 NOI ...

  10. Magento 头部的演示信息去除

    进入后台: 系统-配置, 然后选择左栏的“设计”, 选择右栏的HTML头信息里面有个“Display Demo Store Notice”, 默认是yes,设置为“no”就可以了.