发表于: 2017-11-01 23:06:53
1 776
今天完成的事情
1.学习DES
DES(Data Encryption Standard)数据加密标准,是一种使用密钥加密的快算法。是一种对称密码算法,在对称密码算法中,加密解密的密钥是相同的。DES是对称密码算法中的分组加密算法,一般以64位对数据进行分组加密,密钥的长度是在原本的64位中,将8的倍数位用作奇偶校验,所以有效长度为56位。
加密过程是从用户处获得64位的密码,然后算法首先对密码进行转换操作,形成一套16个加密密钥,用于之后对明文进行加密处理。
DES对明文进行分组处理,将明文分为每组64位的数据块,然后用之前的16个密钥配合相应的算法依次进行16次加密,得到最终的密文。
在解密时,进行和加密时相同的操作,利用算法将密码进行处理得到16个密钥,将密文分组为每组64位,再对每一组用密钥进行16次加密操作,唯一的区别是使用密钥的次序与加密时是相反的,然后就能明文。
可以用java来实现用des对数据进行加密
以下是对数据进行加密的方法:
//加密算法是des
private static final String ALGORITHM="DES";
//转换格式
private static final String TRANSFORMATION="DES/ECB/PKCS5Padding";
//用8个字节64位的key给src加密
public static byte[] encrypt(byte[] src,byte[] key){
try{
//加密
Cipher cipher=Cipher.getInstance(TRANSFORMATION);
SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance(ALGORITHM);
KeySpec keySpec=new DESKeySpec(key);
SecretKey secretKey=secretKeyFactory.generateSecret(keySpec);
cipher.init(Cipher.ENCRYPT_MODE,secretKey,new SecureRandom());
byte[] enMsgByes=cipher.doFinal(src);
return enMsgByes;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
创建Cipher 对象并设置加密方法是DES,加密模式是ECB,填充方式是PKCS5Padding,Cipher用于完成实际的加密操作。创建SecretKeyFactory对象用来对密码进行运算以得到密钥。将Cinpher.ENCRYPT_MODE和运算得到的密钥secretKey传入cipher,初始化对象,表示用于加密操作,然后调用doFinal方法将明文src加密,之后将密文转换为字节型数组byte[ ] 以方便查看。
解密时的操作基本类似:
try{
//解密
Cipher deCipher=Cipher.getInstance(TRANSFORMATION);
SecretKeyFactory deDecretKeyFactory=SecretKeyFactory.getInstance(ALGORITHM);
KeySpec deKeySpec =new DESKeySpec(key);
SecretKey deSecretKey = deDecretKeyFactory.generateSecret(deKeySpec);
deCipher.init(Cipher.DECRYPT_MODE,deSecretKey,new SecureRandom());
byte[] deMsgBytes=deCipher.doFinal(encryptBytes);
return deMsgBytes;
}catch (Exception e){
e.printStackTrace();
}
return null;
同样是创建Cipher对象,在初始化时传入Cipher.DECRYPT_MODE和通过运算得到的密钥deSecretKey,表示此对象用于解密操作,调用doFinal方法完成解密,最后转换为byte[ ] 数组。
在测试类中调用加密,解密方法:
public class DesMainTest {
private static String key = "12345678";
public static void main(String[] args)throws Exception{
String msg = "hello world. 你好,DES";
System.out.println("加密前:"+msg);
byte[] encryptBytes=DESEncryptTools.encrypt(msg.getBytes(),key.getBytes());
System.out.println("加密后:"+new String(encryptBytes));
System.out.println("十六进制:"+byte2str(encryptBytes));
byte[] deMsgBytes=DESEncryptTools.decrypt(encryptBytes,key.getBytes());
System.out.println("解密后:"+new String(deMsgBytes));
}
设置密码为12345678,先转换为字节数组再传入刚才的方法中。
执行结果:
加密后可能是编码的原因,会出现乱码,将其转换为十六进制后就能正常显示了。
2.学习MD5
MD5 (Message Digest Algorithm 5)消息摘要算法第五版。是一种摘要算法,对于是否属于加密算法不太清楚,一种说法是MD5处理得到的数据不能反过来得到原文,即没有解密算法,所以不属于。另一种说法是经过MD5处理,已经看不到原文了,原文已被加密,所以属于加密算法。
MD5输出的长度是固定的,为128位。
MD5的一个重要特点是不可逆,即不能从经过MD5处理得到的数据逆向解析获得原始数据,而且再计算过程中原文的部分信息是丢失了的。
还有一个特点是具有唯一性,即不同的输入得到的结果是不同的。
所以,通常将MD5用作验证,如在下载软件时,网站对软件用MD5进行运算,得到一个MD5值,如果软件有任何的修改,如被插入了木马之类,再进行运算所得到的MD5值都会不一样。用户在下载好之后可以进行运算,通过检验其MD5的值是否和官网的一致,可以得知下载的是否是原版的软件。
还有一种用途是将用户的密码转换为MD5值存储进数据库中,当用户登陆时,系统将用户的密码计算为对应的MD5值,再与数据库中的数据进行比对,这样就提高了用户密码的安全性。
再java中用MD5进行加密,只需要用到java.security.MessageDigest中的方法,具体如下:
try{
//声明使用DM5算法
MessageDigest md5=MessageDigest.getInstance("MD5");
md5.update("a".getBytes());
System.out.println("md5(a)="+byte2str(md5.digest()));
md5.update("a".getBytes());
md5.update("bc".getBytes());
System.out.println("md5(abc)="+byte2str(md5.digest()));
}catch (Exception e){
e.printStackTrace();
}
MessageDigest类可以提供MD5算法
先将字符a转换为字节型数组,然后用update方法来对数据进行处理,在打印时要转换为十六进制,如果转换为String,会显示乱码,用byte2str方法来进行转换,此方法是自定义的,可以参考:http://blog.csdn.net/u012611878/article/details/54000607
执行效果:
明天的计划
学习cookie
遇到的问题
无
收获
对DES的具体实现方法有了一些了解
评论