java实现的DES加密算法详解
本文实例讲述了java实现的des加密算法。分享给大家供大家参考,具体如下:
一、des加密算法介绍
1、要求密钥必须是8个字节,即64bit长度
2、因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与base64编码算法一起使用
3、加密、解密都需要通过字节数组作为数据和密钥进行处理
二、对称加密
des加密算法属于对称加密。
即利用指定的密钥,按照密码的长度截取数据,分成数据块,和密钥进行复杂的移位、算数运算或者数据处理等操作,形成只有特定的密码才能够解开的数据。 加密与解密用的是同一个密钥
三、相关类
1、cipher:
java/android要使用任何加密,都需要使用cipher这个类
使用cipher进行加密,解密处理,需要创建实例对象并初始化。采用工厂模式创建对象
cipher cipher = cipher.getinstance("算法名称");
cipher.init(加密/解密模式,key秒);
2、key:
key类是java加密系统所有密码的父类
3、secretkeyfactory:
对于des加密解密,使用secretkeyfactory生成,生成时需指定deskeyspec
四、加密代码步骤
1. 获取cipher对象,设置加密算法
cipher cipher = cipher.getinstance("des");
2、准备key对象
2.1 des加密算法使用deskeyspec类,构造方法参数需要为8个字节的密码
创建deskeyspec类对象
参数为密钥,8个字节
deskeyspec keyspec = new deskeyspec(new byte[1,2,3,4,5,6,7,8]);
2.2 转换成key对象
secretkeyfactory keyfactory = secretkeyfactory.getinstance("eds"); secretkey key = keyfactory.generatesecret(keyspec);
3.设置cipher模式,加密/解密 ,参数一 :模式 ,参数二:key对象,返回字节数组
cipher.decrypt_mode 解密
cipher.encrypt_mode 加密
cipher.init(cipher.encrypt_mode,key);
4.返回加密结果,参数为加密内容
bytep[] ret = cipher.dofinal(data);
因为对称加密加密与解密是相逆的。所以解密步骤和加密步骤一样,只是cipher.init()的模式不同,所以我们可以写一个工具类来进行des加密算法的加密解密
des加密算法工具类
/** * des加密算法 * @param mode 模式: 加密,解密 * @param data 需要加密的内容 * @param keydata 密钥 8个字节数组 * @return 将内容加密后的结果也是byte[]格式的 */ public static byte[] des(int mode,byte[] data,byte[] keydata) { byte[] ret = null; //加密的内容存在并且密钥存在且长度为8个字节 if (data != null && data.length>0 &&keydata!=null && keydata.length==8) { try { cipher cipher = cipher.getinstance("des"); deskeyspec keyspec = new deskeyspec(keydata); secretkeyfactory keyfactory = secretkeyfactory.getinstance("des"); secretkey key = keyfactory.generatesecret(keyspec); cipher.init(mode, key); ret = cipher.dofinal(data); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } catch (nosuchpaddingexception e) { e.printstacktrace(); } catch (illegalblocksizeexception e) { e.printstacktrace(); } catch (badpaddingexception e) { e.printstacktrace(); } catch (invalidkeyspecexception e) { e.printstacktrace(); } catch (invalidkeyexception e) { e.printstacktrace(); } } return ret; } //des 加密 public static byte[] desencrypt(byte[] data,byte[] keydata){ return des(cipher.encrypt_mode,data,keydata); } //des 解密 public static byte[] desdecrypt(byte[] data,byte[] keydata){ return des(cipher.decrypt_mode,data,keydata); }
五、示例
sythencryptactivity.class:
package com.xqx.encrypsthow; import android.app.activity; import android.os.bundle; import android.util.base64; import android.util.log; import android.view.view; import android.widget.edittext; import android.widget.toast; import utils.encryptutil; import javax.crypto.*; import javax.crypto.spec.deskeyspec; import java.security.invalidkeyexception; import java.security.nosuchalgorithmexception; import java.security.spec.invalidkeyspecexception; import java.util.arrays; /** * created by administrator on 2015/10/16. */ /** * 对称加密 */ public class sythencryptactivity extends activity { private edittext txtcontent; private edittext txtpassword; private edittext txtresult; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.sythencrypylayout); txtcontent = (edittext) findviewbyid(r.id.txt_content); txtpassword = (edittext) findviewbyid(r.id.txt_password); txtresult = (edittext) findviewbyid(r.id.txt_result); } /** * des加密,要求密码必须8个字节,64bit长度 byte[8] * @param view */ public void btndesencrypt(view view) { //获取需要加密的内容 string content = txtcontent.gettext().tostring(); //获取密钥 string password = txtpassword.gettext().tostring(); //注意,加密,解密,秘钥都需要是字节数组 byte[] keydata = password.getbytes(); //需要加密的内容 byte[] contentdata = content.getbytes(); if(keydata.length == 8) { byte[] encrypteddata = encryptutil.des(cipher.encrypt_mode, contentdata, keydata); //获取加密后的数据(记住是byte[]类型的),用base64编码 成可见的字符串形式 string s = base64.encodetostring(encrypteddata, base64.no_wrap); //显示加密后的内容 txtresult.settext(s); } } /** * des的解密 * @param view */ public void btndesdecrypt(view view) { string encryptedstr = txtresult.gettext().tostring(); if(encryptedstr.length()>0){ string password = txtpassword.gettext().tostring(); //因为在加密方法中,使用base64对加密的内容进行编码,要解密的时候需要base64的解码 byte[] encrypteddata = base64.decode(encryptedstr, base64.no_wrap); byte[] keydata = password.getbytes(); //des 要求 8个字节 if(keydata.length == 8){ //形成原始数据 byte[] decrypteddata = encryptutil.des(cipher.decrypt_mode, encrypteddata, keydata); txtresult.settext(new string(decrypteddata)); } } } }
layout:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <edittext android:id="@+id/txt_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" /> <edittext android:id="@+id/txt_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="des密钥" android:text="12345678" android:inputtype="textvisiblepassword" /> <edittext android:id="@+id/txt_result" android:layout_width="match_parent" android:layout_height="wrap_content" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="des加密" android:onclick="btndesencrypt" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="des解密" android:onclick="btndesdecrypt" /> </linearlayout>
工具类参考 四:加密代码步骤
效果图:
ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:
md5在线加密工具:
http://tools.jb51.net/password/createmd5password
迅雷、快车、旋风url加密/解密工具:
在线散列/哈希算法加密工具:
在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:
在线sha1/sha224/sha256/sha384/sha512加密工具:
更多关于java相关内容感兴趣的读者可查看本站专题:《java数学运算技巧总结》、《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。