欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现的DES加密算法详解

程序员文章站 2023-12-10 17:08:16
本文实例讲述了java实现的des加密算法。分享给大家供大家参考,具体如下: 一、des加密算法介绍 1、要求密钥必须是8个字节,即64bit长度 2、因为密钥是by...

本文实例讲述了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>

工具类参考 四:加密代码步骤

效果图:

java实现的DES加密算法详解

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程序设计有所帮助。