java加密-解密小结
加密算法可以分为
双向加密(对称加密、不对称加密)
单向加密(不可逆加密)—— MD5、sha、hmac...
在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密
有: DES AES。。
不对称加密算法使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。在使用不对称加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程
RSA、DSA。。
================ 上面的全是废话 =============
主要参照http://zhangyiqian.iteye.com/blog/1470713
Md5 消息摘要5 —— MessageDigest
好像还有一个版本是MessageDigest4、3 ,不过当然没有5好,现在已经被弃用。
关键点:
1 借助java.security.MessageDigest,这是jdk自带的。加密要点只有两个:MessageDigest的update、digest方法(MessageDigest比较‘单纯’,只提供几个简单方法)
2 无论要加密的数据的长短,结果长度都是固定的(32或者16)。—— 加密过程是十分快速的。据我测试,无论加密的数据的长短,加密时间几乎一样。
3 将byte[]组装string有2个方法: 1 借助 Hex ;2 自己组装
4 md5是单向加密,原理上是可以极难破解的,不过听说只要解密的'md5数据库'足够大,我们也很快可以反查出原始加密信息。。。
5 密码是可能出现重复的? 就是不同字符串的加密结果可能一样?
6 MessageDigest.getInstance("MD5"); —— 除了md5还有其他的 SHA-1 or SHA-256 —— 不知道什么区别。。
7 sha的加密结果长度固定,同md5.
8 一般用来加密用户的密码,通常我们可能还需要对密码加盐或者随机盐,然后加密。。
不知道其底层原理,—— 某些很大的几十几百M下载包、文件等都是通过md5加密的(其中还有sha加密选项。。),可能是其加密速度快的原因吧!
package basic.security;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Hex; public class EncrypMD5 { public byte[] eccrypt(String info) throws NoSuchAlgorithmException{
//���MD5�㷨���MessageDigest����
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] srcBytes = info.getBytes();
//ʹ��srcBytes����ժҪ
md5.update(srcBytes);
//��ɹ�ϣ���㣬�õ�result
byte[] resultBytes = md5.digest();
return resultBytes;
} public static void main(String args[]) throws NoSuchAlgorithmException{
String msg = "aaa";
EncrypMD5 md5 = new EncrypMD5();
byte[] b = md5.eccrypt(msg);
//System.out.println(((b)));
//System.out.println(new String((b)));
//System.out.println((new Hex().encode(b))); //[B@58ea58e3: byte[]没法直接显示成string // 将byte[]组装string ?
// 1 借助 Hex
System.out.println(new String(new Hex().encode(b))); // 2 自己组装
int i;
StringBuffer buf = new StringBuffer();
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
// 将整型 十进制 i 转换为16位,用十六进制参数表示的无符号整数值的字符串表示形式。
buf.append(Integer.toHexString(i));
} // 32位的加密
String md5Str = buf.toString();
System.out.println(""+ md5Str);
// 16位的加密
md5Str = buf.toString().substring(8,24);
System.out.println(""+ md5Str); } }
Base64/32 我也不知道这个什么用。。。
1 实现借助sun.misc.BASE64Decoder/ sun.misc.BASE32Decoder 是jdk自带的
2 调用非常简单:加密encode,解密是静态方法decodeBuffer
3 不同于md5,加密结果随着要加密的字符串长短不同而不同。
package basic.security; import java.io.IOException; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; public class Base64Test { public String encode(String toEncodeContent){
if(toEncodeContent == null){
return null;
}
BASE64Encoder encoder = new BASE64Encoder();
// BASE32Encoder encoder32 = new BASE32Encoder();
return encoder.encode(toEncodeContent.getBytes());
} public String decode(String toDecodeContent){
if(toDecodeContent == null) {
return null;
}
byte[] buf = null;
try {
buf = new BASE64Decoder().decodeBuffer(toDecodeContent);
} catch(IOException e){
e.printStackTrace();
} finally {
}
return new String(buf);
} public static void main(String[] args) throws Exception {
Base64Test test = new Base64Test();
String toEncodeContent = "I12313";
String encodeRet = test.encode(toEncodeContent);
System.out.println(encodeRet);
System.out.println(test.decode(encodeRet));
}
}
参考http://www.iteye.com/topic/1122076 写得非常好!
http://723242038.iteye.com/blog/1813853 good,有清晰的图解
对称加密算法 DES/3DES/AES (es结尾。。)
1 主要借助javax.crypto.包的 KeyGenerator 对称密钥生成器,其generateKey方法以获取密钥,——SecretKey 保存对称密钥。javax.crypto包的Cipher 负责完成加密或解密工作
2 加密 c.init(Cipher.ENCRYPT_MODE, deskey); cipherByte = c.doFinal(src); --- ENCRYPT_MODE 即表示加密! doFinal完成加密
3 解密 c.init(Cipher.DECRYPT_MODE, deskey); cipherByte = c.doFinal(buff); ----DECRYPT_MODE 表示解密
4 加密解密使用的是同一个deskey,——- 表明是对称加密算法。!!!
5 比起最初的DES,3DES更为安全.跟早期常用于wifi密码加密的wes貌似。不过现在似乎被认为不安全,被wpa2加密了。。。
6 各个加密算法本质上有很大的实现不同,但是sun给我们封装了, 使用上区别仅仅在于keygen = KeyGenerator.getInstance("算法名字"); 其中名字的不同。
7 加密结果不是长度固定的,大概是加密字符越长,结果就越长。。
package basic.security; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey; public class EncrypDES { //KeyGenerator 提供对称密钥生成器的功能,支持各种算法
private KeyGenerator keygen;
//SecretKey 负责保存对称密钥
private SecretKey deskey;
//Cipher负责完成加密或解密工作
private Cipher c;
//该字节数组负责保存加密的结果
private byte[] cipherByte; public EncrypDES() throws NoSuchAlgorithmException, NoSuchPaddingException{
Security.addProvider(new com.sun.crypto.provider.SunJCE());
//实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
keygen = KeyGenerator.getInstance("DES");
//生成密钥
deskey = keygen.generateKey();
//生成Cipher对象,指定其支持的DES算法
c = Cipher.getInstance("DES");
} /**
* 对字符串加密
*
* @param str
* @return
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public byte[] Encrytor(String str) throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
// 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
c.init(Cipher.ENCRYPT_MODE, deskey);
byte[] src = str.getBytes();
// 加密,结果保存进cipherByte
cipherByte = c.doFinal(src);
return cipherByte;
} /**
* 对字符串解密
*
* @param buff
* @return
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
// 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式
c.init(Cipher.DECRYPT_MODE, deskey);
cipherByte = c.doFinal(buff);
return cipherByte;
} /**
* @param args
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws InvalidKeyException
*/
public static void main(String[] args) throws Exception {
EncrypDES de1 = new EncrypDES();
String msg ="lkasddad艾弗森的";
byte[] encontent = de1.Encrytor(msg);
byte[] decontent = de1.Decryptor(encontent);
System.out.println("明文是:" + msg);
System.out.println("加密后:" + new String(encontent));
System.out.println("解密后:" + new String(decontent));
} }
非对称加密算法 RSA/DSA(sa结尾。。)
1 代码类似上面,只涉及jdk的java.security和javax.crypto,RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥(即公钥)—————— 即哥德巴赫猜想!!
2 关键代码
初始化:
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//初始化密钥对生成器,密钥大小为1024位
keyPairGen.initialize(1024);
//生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
//得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
//得到公钥
RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic(); 加密:
//Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
//根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 采用加密模式ENCRYPT_MODE
byte[] resultBytes = cipher.doFinal(srcBytes); 解密
//Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
//根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.DECRYPT_MODE, privateKey);// 采用解密模式DECRYPT_MODE
byte[] resultBytes = cipher.doFinal(srcBytes);
1 主要有KeyPairGenerator,KeyPair,RSAPublicKey,RSAPrivateKey,Cipher
2 实际运用此算法的时候,RSAPublicKey,RSAPrivateKey同时被生成出来,保存不同地方--可能是文件里面
URLEncoding
URLDecoding
其他的一些加密算法
=======================
加密算法和SSL等安全协议的关系:
ssl加密要比上面的复杂得多,它是一种协议,是一个过程,多种算法的集合。。 可以理解为其主要运用了RSA等算法来存储密钥、对称算法来传输数据的ssl协议实现
一般ssl的加密过程:
我的详细的加密过程如下
1:client created RSA key pair
2:client sent RSA public key to Server
3:server generated an AES key (AESKey)
4:server sent RSA encrypted AESKey to client
5:client got AESKey with RSA decryption
6:client and server use AESkey to encrypt and decrypt net data
====
SSL协议通讯时候是对称算法的,可以使用AES128做期间的通讯。
只有密钥协商的时候才是非对称的
===
你的思路基本上和SSL差不多了,当然没有SSL那么完善。
SSL的主要优点是防御中间人攻击,而对称加密还有你后来的RSA方法都无法做到这点
===
,SSL的握手过程中加入了HMAC,能有效防范重放攻击 (如果采用双向认证?)
见 http://www.iteye.com/topic/213512
http://www.iteye.com/topic/1125183 非常棒,非常详细,可惜没耐心看完。貌似其过程跟我另一篇关于ssh的文章相似
=======================
加密解密与SSH
首先要明白ssh、ssl的区别
http://www.cnblogs.com/haitao-fan/archive/2012/08/31/2665211.html
http://www.cnblogs.com/FanTasYX/archive/2013/03/22/2976473.html
其实,发现和ssl差别不是很大。。。
java加密-解密小结的更多相关文章
- java加密解密的学习
注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...
- Java加密解密字符串
http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串 旧文重发:http://www.blogjava ...
- java加密解密
java加密解密 public class MD5Util { /** * @param args */ public static void main(String[] args) { System ...
- password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- java加密解密算法位运算
一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...
- ◆JAVA加密解密-3DES
从数据安全谈起 当你使用网银时,是否担心你的银行卡会被盗用? 当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露? 作为开发者,编写安全的代码比编写优雅的代码更重要,因为 ...
- cooking java ——加密解密
java安全与密码概述 主要分为三部分: 密码学基础,包括:相关术语:分类:常用安全体系. java的安全组成:jdk以及第三方扩展. 相关实现代码,包括:base64.MD5········ 密码学 ...
- Java加密解密相关
关于解释加密解密中的填充方案: http://laokaddk.blog.51cto.com/368606/461279/ 关于对称加密中的反馈模式: http://blog.csdn.net/aaa ...
随机推荐
- SQL Server客户端登录名与数据库用户关联
数据库迁移之后,在新的SQL Server客户端工具设置关联时,往往会报错: 用户.组或角色 'XXX' 在当前数据库中已存在. 解决方法: 首先介绍一下sql server中“登录”与“用户”的区别 ...
- 将ubuntu的id_rsa秘钥转为putty的ppk格式
1.使用putty的puttygen.exe: 2.导入需要转换的秘钥 3.保存私钥
- zabbix微信告警(虚拟机脚本测试成功,zabbix上收不到信息)
前言: 使用zabbix直接运行脚本又可以正常接收.但是登录zabbix web界面,测试! 动作显示已送达,但是微信并没有收到信息! 解决: 添加脚本参数,因为不添加脚本参数,调用不了你这个脚本 ...
- Win7 64位 VS2015环境使用SDL2-2.0.4
之前在VS中使用SDL2,如果只链接SDL2.lib,会提示 error LNK2019: unresolved external symbol _main referenced in functio ...
- 错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
不知怎么本来编译好好的VS2010环境,忽然出现“转换到 COFF 期间失败: 文件无效或损坏”的链接错误.花了好多天,试了好多方法,最终解决了这个问题. 现在罗列一下这几种解决方案: 方案1:点击“ ...
- MAT-Java内存分析工具
对Mat工具的详细介绍,引用博文:http://my.oschina.net/biezhi/blog/286223 下载地址:http://www.eclipse.org/mat/downloads. ...
- VS2012中,C# 配置文件读取 + C#多个工程共享共有变量 + 整理using语句
(一) C# 配置文件读取 C#工程可以自动生成配置文件,以便整个工程可以使用设置的配置进行后续的处理工作. 1. 首先,右键工程文件-->Properties -->settings-- ...
- mysql入门安装遇到问题_2016-10-28
1. brew安装完mysql之后直接输入mysql -u root -p 显示 can't connect to mysql server through socket, 后来问题应该是server ...
- [Leetcode][JAVA] Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- android ProgressBar 进度条的进度两端是圆角的方法
转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...