Java最简单的DES加密算法实现案例

Base64.java

package com.mstf.des;

import java.io.UnsupportedEncodingException;

/**
 * base64编码/解码
 * @author ceet
 *
 */
public class Base64 {

  public static String encode(String data) {
    return new String(encode(data.getBytes()));
  }

  public static String decode(String data) {
    try {
      return new String(decode(data.toCharArray()),"utf-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
      return null;
    }
  }

  private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
      .toCharArray();

  private static byte[] codes = new byte[256];

  static {
    for (int i = 0; i < 256; i++) {
      codes[i] = -1;
    }
    for (int i = 'A'; i <= 'Z'; i++) {
      codes[i] = (byte) (i - 'A');
    }

    for (int i = 'a'; i <= 'z'; i++) {
      codes[i] = (byte) (26 + i - 'a');
    }
    for (int i = '0'; i <= '9'; i++) {
      codes[i] = (byte) (52 + i - '0');
    }
    codes['+'] = 62;
    codes['/'] = 63;
  }

  public static char[] encode(byte[] data) {
    char[] out = new char[((data.length + 2) / 3) * 4];
    for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
      boolean quad = false;
      boolean trip = false;

      int val = (0xFF & (int) data[i]);
      val <<= 8;
      if ((i + 1) < data.length) {
        val |= (0xFF & (int) data[i + 1]);
        trip = true;
      }
      val <<= 8;
      if ((i + 2) < data.length) {
        val |= (0xFF & (int) data[i + 2]);
        quad = true;
      }
      out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
      val >>= 6;
      out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
      val >>= 6;
      out[index + 1] = alphabet[val & 0x3F];
      val >>= 6;
      out[index + 0] = alphabet[val & 0x3F];
    }
    return out;
  }

  public static byte[] decode(char[] data) {
    int tempLen = data.length;
    for (int ix = 0; ix < data.length; ix++) {
      if ((data[ix] > 255) || codes[data[ix]] < 0) {
        --tempLen;
      }
    }
    int len = (tempLen / 4) * 3;
    if ((tempLen % 4) == 3) {
      len += 2;
    }
    if ((tempLen % 4) == 2) {
      len += 1;

    }
    byte[] out = new byte[len];

    int shift = 0;
    int accum = 0;
    int index = 0;

    for (int ix = 0; ix < data.length; ix++) {
      int value = (data[ix] > 255) ? -1 : codes[data[ix]];

      if (value >= 0) {
        accum <<= 6;
        shift += 6;
        accum |= value;
        if (shift >= 8) {
          shift -= 8;
          out[index++] = (byte) ((accum >> shift) & 0xff);
        }
      }
    }

    if (index != out.length) {
      throw new Error("Miscalculated data length (wrote " + index
          + " instead of " + out.length + ")");
    }

    return out;
  }
}

DESUtil.java

package com.mstf.des;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

/**
 * DES对称算法(加密/解密)
 *
 * @author ceet
 *
 */
public class DESUtil {

  private Key key;

  public DESUtil(String strKey) {
    setKey(strKey);
  }

  public void setKey(String strKey) {
    try {
      KeyGenerator generator = KeyGenerator.getInstance("DES");
      generator.init(new SecureRandom(strKey.getBytes())); // 根据参数生成key
      this.key = generator.generateKey();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public String encrypt(String source) {
    return encrypt(source, "utf-8");
  }

  public String decrypt(String encryptedData) {
    return decrypt(encryptedData, "utf-8");
  }

  public String encrypt(String source, String charSet) {
    String encrypt = null;
    try {
      byte[] ret = encrypt(source.getBytes(charSet));
      encrypt = new String(Base64.encode(ret));
    } catch (Exception e) {
      e.printStackTrace();
      encrypt = null;
    }
    return encrypt;
  }

  public String decrypt(String encryptedData, String charSet) {
    String descryptedData = null;
    try {
      byte[] ret = descrypt(Base64.decode(encryptedData.toCharArray()));
      descryptedData = new String(ret, charSet);
    } catch (Exception e) {
      e.printStackTrace();
      descryptedData = null;
    }
    return descryptedData;
  }

  private byte[] encrypt(byte[] primaryData) {
    try {
      Cipher cipher = Cipher.getInstance("DES"); // Cipher对象实际完成加密操作
      cipher.init(Cipher.ENCRYPT_MODE, this.key); // 用密钥初始化Cipher对象(加密)

      return cipher.doFinal(primaryData);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  private byte[] descrypt(byte[] encryptedData) {
    try {
      Cipher cipher = Cipher.getInstance("DES"); // Cipher对象实际完成解密操作
      cipher.init(Cipher.DECRYPT_MODE, this.key); // 用密钥初始化Cipher对象(解密)

      return cipher.doFinal(encryptedData);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  public static void main(String[] args) {
    String code = "ceet";
    DESUtil desUtil = new DESUtil("key");
    String encrypt = desUtil.encrypt(code);
    String decrypt = desUtil.decrypt(encrypt);
    System.out.println("原内容:" + code);
    System.out.println("加密:" + encrypt);
    System.out.println("解密:" + decrypt);
  }
}

以上这篇Java最简单的DES加密算法实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java中DES加密解密

    废话不多说,直接奉上代码: 复制代码 代码如下: package com.eabax.plugin.yundada.utils; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.Invalid

  • java实现的DES加密算法详解

    本文实例讲述了java实现的DES加密算法.分享给大家供大家参考,具体如下: 一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节数组作为数据和密钥进行处理 二.对称加密 DES加密算法属于对称加密. 即利用指定的密钥,按照密码的长度截取数据,分成数据块,和密钥进行复杂的移位.算数运算或者数据处理等操作,形成只有特定的密码才能够解开的数据. 加密与解

  • java常用工具类之DES和Base64加密解密类

    一.DES加密和解密 package com.itjh.javaUtil; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecExc

  • 详解Java利用实现对称加密(DES、3DES、AES)

    有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了. 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂. 注意,这可不是我说的,是无数程序员总结的,话说的很实在也很精辟,若想长久可持续发展,多研究算法还是很有必要的,今天我给大家说说加密算法中的对称加密算法,并且这里将教会大家对称加密算法的编程使用.包含DES.3DES和AES三种对称加密算法的编程使用,干货满满. 1.对称密码算法 对称密码算法是当今应用范围最广,使用频率最高的加密

  • des加密解密JAVA与.NET互通实例

    JAVA版本 复制代码 代码如下: import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; public class Des { private byte[] desKey; //解密数据 public

  • java使用des加密解密示例分享

    复制代码 代码如下: import java.security.Key;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvPar

  • java基于Des对称加密算法实现的加密与解密功能详解

    本文实例讲述了java基于Des对称加密算法实现的加密与解密功能.分享给大家供大家参考,具体如下: Des 加密相关类介绍: SecureRandom  这个类是继承自java.util.Random 这个类 SecureRandom 这个类的构造器有三种,下面例举两种: SecureRandom()构造一个实现默认随机数算法的安全随机数生成器 (RNG). SecureRandom(byte[] seed)构造一个实现默认随机数算法的安全随机数生成器 (RNG). DESKeySpec 这个类

  • 使用java自带des加密算法实现文件加密和字符串加密

    复制代码 代码如下: import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.security.SecureR

  • java中使用DES加密解密实例

    在前面介绍了一些加密解密类的使用,这里综合起来做一个简单的测试,代码如下: MainActivity: 复制代码 代码如下: package com.home.testdes; import android.os.Bundle;import android.util.Log;import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bund

  • 利用JAVA实现DES加密算法

    DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现. JAVA实现加密代码有详细解释,不多废话.注意:DES加密和解密过程中,密钥长度都必须是8的倍数 复制代码 代码如下: public byte[] de

  • 详解DES加密算法及在Java程序中的使用示例

    DES加密算法 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来. DES算法的入口参数有三个:Key.Data.Mode.其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密

  • 兼容PHP和Java的des加密解密代码分享

    php代码: <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加密 function encrypt($str) { $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MO

随机推荐