`

java DES加密代码收藏

    博客分类:
  • java
 
阅读更多
Des对称加密,是一种对称加密算法。

import java.security.Key;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;

/**
 * DES 加密方法
 * 
 * @author silence
 * 
 */
public class HTest {
	private static String strDefaultKey = "national";
	private Cipher encryptCipher = null;
	private Cipher decryptCipher = null;

	/**
	 * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
	 * hexStr2ByteArr(String strIn) 互为可逆的转换过程
	 * 
	 * @param arrB
	 *            需要转换的byte数组
	 * @return 转换后的字符串
	 * @throws Exception
	 *             本方法不处理任何异常,所有异常全部抛出
	 */
	public static String byteArr2HexStr(byte[] arrB) {
		int iLen = arrB.length;
		// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
		StringBuffer sb = new StringBuffer(iLen * 2);
		for (int i = 0; i < iLen; i++) {
			int intTmp = arrB[i];
			// 把负数转换为正数
			while (intTmp < 0) {
				intTmp = intTmp + 256;
			}
			// 小于0F的数需要在前面补0
			if (intTmp < 16) {
				sb.append("0");
			}
			sb.append(Integer.toString(intTmp, 16));
		}
		return sb.toString();
	}

	/**
	 * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
	 * 互为可逆的转换过程
	 * 
	 * @param strIn
	 *            需要转换的字符串
	 * @return 转换后的byte数组
	 */
	public static byte[] hexStr2ByteArr(String strIn) {
		byte[] arrB = strIn.getBytes();
		int iLen = arrB.length;
		// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
		byte[] arrOut = new byte[iLen / 2];
		for (int i = 0; i < iLen; i = i + 2) {
			String strTmp = new String(arrB, i, 2);
			arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
		}
		return arrOut;
	}

	/**
	 * 默认构造方法,使用默认密钥
	 * 
	 * @throws Exception
	 */
	public HTest() throws Exception {
		this(strDefaultKey);
	}

	/**
	 * 指定密钥构造方法
	 * 
	 * @param strKey
	 *            指定的密钥
	 * @throws Exception
	 */
	public HTest(String strKey) {
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
		Key key;
		try {
			key = getKey(strKey.getBytes());
			encryptCipher = Cipher.getInstance("DES");
			encryptCipher.init(Cipher.ENCRYPT_MODE, key);
			decryptCipher = Cipher.getInstance("DES");
			decryptCipher.init(Cipher.DECRYPT_MODE, key);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 加密字节数组
	 */
	public byte[] encrypt(byte[] arrB) {
		byte[] s = null;
		try {
			s = encryptCipher.doFinal(arrB);
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return s;
	}

	/**
	 * 将启动码strIn加密,返回加密后的启动码
	 */
	public String encrypt(String strIn) {
		return byteArr2HexStr(encrypt(strIn.getBytes()));
	}

	/**
	 * 解密字节数组
	 */
	public byte[] decrypt(byte[] arrB) {
		byte[] s = null;
		try {
			s = decryptCipher.doFinal(arrB);
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return s;
	}

	/**
	 * 解密 strIn
	 */
	public String decrypt(String strIn) {
		return new String(decrypt(hexStr2ByteArr(strIn)));
	}

	/**
	 * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
	 * 
	 * @param arrBTmp
	 *            构成该字符串的字节数组
	 * @return 生成的密钥
	 * @throws java.lang.Exception
	 */
	private Key getKey(byte[] arrBTmp) {
		// 创建一个空的8位字节数组(默认值为0)
		byte[] arrB = new byte[8];
		// 将原始字节数组转换为8位
		for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
			arrB[i] = arrBTmp[i];
		}
		// 生成密钥
		Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
		return key;
	}

	public static void main(String[] args) {
		try {
			String test = "理智";
			// 自定义密钥
			HTest des = new HTest("www"); 
			System.out.println("加密前的字符:" + test);
			System.out.println("加密后的字符:" + des.encrypt(test));
			System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
};




import java.io.RandomAccessFile;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESUtil
{
  public static String strEncode;
  public static final int[] A = { 31, -42, 53, -64, 75, -86, 97, -108 };
  private static final String keyStr = "LONGTOP.COM.CDWEI";

  private static void saveFile(byte[] strcont, String filename)
    throws Exception
  {
    RandomAccessFile infile = null;
    try {
      infile = new RandomAccessFile(filename, "rw");
      infile.write(strcont);
    } catch (Exception e) {
      throw e;
    } finally {
      infile.close();
    }
  }

  private static byte[] readFile(String strfilename)
    throws Exception
  {
    byte[] filecontent = null;
    int i_size = 0;
    RandomAccessFile infile = null;
    try {
      infile = new RandomAccessFile(strfilename, "rw");
      i_size = (int)infile.length();
      filecontent = new byte[i_size];
      infile.read(filecontent, 0, i_size);
    } catch (Exception e) {
      throw e;
    } finally {
      infile.close();
    }
    return filecontent;
  }

  private static void getKeyFile()
    throws Exception
  {
    SecureRandom sr = new SecureRandom();

    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(sr);

    SecretKey key = kg.generateKey();

    byte[] rawKeyData = key.getEncoded();
    saveFile(rawKeyData, "deskeyfile");
  }

  public static boolean isAsCII(char ch1, int iLength)
  {
    int iLevel = 0;
    int ch = 0;
    ch = ch1;
    do
    {
      ch += iLength;
      if (ch < 0)
        ch += 256;
      if (ch > 256)
        ch -= 256;
      iLevel++;
    }while ((ch < 33) || (ch > 126));
    temp.iLength = iLevel;
    temp.ch = String.valueOf(ch);
    return true;
  }

  public static boolean isAsCII_DeCode(char ch1, int iLength, char iFlag)
  {
    int ch = 0;
    ch = ch1;
    do
    {
      ch += iLength * Integer.parseInt(String.valueOf(iFlag));

      if (ch < 0)
        ch += 256;
      if (ch > 256)
        ch -= 256;
    }
    while ((ch < 0) || (ch > 256));
    temp.ch = String.valueOf(ch);
    return true;
  }

  public static String pwdEncode(String strsrc)
  {
    strsrc = strsrc.trim();
    StringBuffer strBufSrc = new StringBuffer("");
    StringBuffer strBufFlag = new StringBuffer("");

    if (strsrc.equals("")) {
      return "";
    }

    for (int i = 0; i < strsrc.length(); i++) {
      if (isAsCII(strsrc.charAt(i), A[i])) {
        strBufSrc.append(String.valueOf((char)Integer.parseInt(temp.ch)));
        strBufFlag.append(String.valueOf(temp.iLength));
      }
    }
    strEncode = strBufFlag.toString().trim();
    return strBufSrc.toString();
  }

  public static String pwdDecode(String strsrc, String strFlag)
  {
    strsrc = strsrc.trim();
    strFlag = strFlag.trim();
    StringBuffer strBuf = new StringBuffer("");
    int tmpvalue = 0;

    if (strsrc.equals("")) {
      return "";
    }
    if (strsrc.length() != strFlag.length()) {
      return "长度不一样,该串不能解码!";
    }

    for (int i = 0; i < strsrc.length(); i++) {
      tmpvalue = strsrc.charAt(i) - A[i] * Integer.parseInt(String.valueOf(strFlag.charAt(i)));
      if (tmpvalue > 0)
        tmpvalue %= 256;
      else if (tmpvalue < 0) {
        tmpvalue = 256 - Math.abs(tmpvalue) % 256;
      }
      strBuf.append(String.valueOf((char)tmpvalue));
    }
    return strBuf.toString();
  }

  public static byte[] encode(byte[] data)
    throws Exception
  {
    if ((data == null) || (data.length == 0)) {
      return data;
    }

    SecureRandom sr = new SecureRandom();

    byte[] rawKeyData = "LONGTOP.COM.CDWEI".getBytes();

    DESKeySpec dks = new DESKeySpec(rawKeyData);

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey key = keyFactory.generateSecret(dks);

    Cipher cipher = Cipher.getInstance("DES");

    cipher.init(1, key, sr);

    byte[] encryptedData = cipher.doFinal(data);

    return encryptedData;
  }

  public static byte[] decode(byte[] encryptedData)
    throws Exception
  {
    if ((encryptedData == null) || (encryptedData.length == 0)) {
      return encryptedData;
    }

    SecureRandom sr = new SecureRandom();

    byte[] rawKeyData = "LONGTOP.COM.CDWEI".getBytes();

    DESKeySpec dks = new DESKeySpec(rawKeyData);

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey key = keyFactory.generateSecret(dks);

    Cipher cipher = Cipher.getInstance("DES");

    cipher.init(2, key, sr);

    byte[] decryptedData = cipher.doFinal(encryptedData);

    return decryptedData;
  }
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

    主要介绍了使用java自带des加密算法实现文件加密和字符串加密的示例,需要的朋友可以参考下

    java DES 加密器 含源代码

    用java 编写的一个DES加密文本文档的小程序 希望对大家有用 含有源代码

    java和javascript之间的DES加密解密

    Java和JavaScript之间的DES加密解密是信息安全领域中的一个重要话题,主要涉及到数据的保护和通信的安全。DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些...

    DES加密算法JAVA代码

    ### DES加密算法JAVA代码知识点详解 #### 一、概述 数据加密标准(Data Encryption Standard,简称DES)是一种广泛使用的对称密钥加密技术。在Java中实现DES加密解密功能通常涉及以下几个关键类:`javax.crypto....

    DES加密java代码

    用java代码实现DES的加密功能,简单的java类,含有加密和解密

    DES加密DEMO(C#与JAVA)

    本DEMO提供了C#和JAVA两种编程语言下的DES加密和解密实现,这对于理解DES算法及其在实际开发中的应用非常有帮助。 1. **DES算法原理** - **结构**:DES算法基于Feistel网络,它将明文分为左右两半,通过一系列的...

    js&java DES加密互通

    然后,可以使用以下代码进行DES加密: ```javascript var CryptoJS = require("crypto-js"); function encryptDES(message, key) { var encrypted = CryptoJS.DES.encrypt(message, key, { mode: CryptoJS.mode....

    Des.JAVA.rar_DES.java_DES加密_java DES 128bit_java des_加密解密

    标题中的"Des.JAVA.rar_DES.java_DES加密_java DES 128bit_java des_加密解密"表明这是一个关于Java实现DES(Data Encryption Standard)加密算法的压缩包,其中包含用于加密和解密的源代码。DES是一种对称加密算法...

    利用DES加密算法保护Java源代码

    ### 利用DES加密算法保护Java源代码 #### 一、引言 随着信息技术的快速发展,数据的安全性问题越来越受到人们的重视。对于软件开发者来说,保护自己的Java源代码不被非法访问或篡改是非常重要的。Java作为一种跨...

    js与java des加密

    这些文件可能是实现上述 JavaScript 示例的代码,`jsDES.html` 可能包含一个网页,用于展示 JavaScript 的 DES 加密功能,而 `js` 文件可能是 JavaScript 代码本身,实现加密逻辑。 总结,JavaScript 和 Java 通过 ...

    3DES加密java实现

    本篇文章将详细探讨Java环境下如何实现3DES加密算法,并介绍相关知识点。 首先,让我们了解3DES的工作原理。3DES是对原始DES算法的扩展,它通过执行三次加密过程来提高安全性。简而言之,3DES分为两种模式:EDE...

    DES加密方法JAVA和C#交叉加密解密代码

    DES加密方法JAVA和C#交叉加密解密代码

    用java实现des加密

    Java DES加密是一种在Java编程环境中实现的对称加密算法,主要用来保护数据的安全性。DES(Data Encryption Standard)是早期广泛使用的一种加密标准,虽然现在已经被更安全的AES(Advanced Encryption Standard)所...

    java代码-使用java解决DES加密解密的源代码

    java代码-使用java解决DES加密解密的源代码 ——学习参考资料:仅用于个人学习使用!

    java版DES加密算法

    实现了Des字符串,加密解密,java版本的,java源代码

    DES加密代码 java

    匹配博客:https://blog.csdn.net/qq_41739364/article/details/86775886

    收藏 Java c++通过des加密的结果不一样【已解决】

    ### Java与C++中DES加密不一致的问题及解决方案 #### 问题背景 在进行系统间的交互时,常常需要对敏感数据进行加密处理以确保数据的安全性。DES(Data Encryption Standard,数据加密标准)是一种广泛使用的对称...

    DES加密前端js和后台java互通代码

    在本文中,我们将深入探讨DES加密的原理以及如何在前端JavaScript和后端Java之间实现互通。 DES算法基于Feistel结构,它将明文分为左右两半进行迭代处理,通过64轮的加密过程将原始信息转化为密文。每个轮次包括一...

    用delphi写的一个des的加密解密小程序,java写的des的一个类

    Java写的DES的一个类”表明了这个压缩包包含两个部分:一个是使用Delphi编程语言编写的用于执行DES(Data Encryption Standard)加密和解密的小程序,另一个是用Java实现的DES加密类。DES是一种广泛使用的对称加密...

Global site tag (gtag.js) - Google Analytics