发表于: 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位的keysrc加密
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的具体实现方法有了一些了解



返回列表 返回列表
评论

    分享到