修改后的DES加密解密程序

原创 2006年05月23日 12:49:00

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class SIEncryptUtil {

 private String characterEncoding = "ASCII"; // 用来加密密码

 private Cipher encryptCipher;

 private Cipher decryptCipher;

 private BASE64Encoder base64Encoder = new BASE64Encoder();

 private BASE64Decoder base64Decoder = new BASE64Decoder();

 static SIEncryptUtil sie = null;

 // The DES EDE Key - any 24 bytes will do though beware of weak
 // keys.
 // This could be read from a file. DES的密钥
 final static byte[] DESedeKeyBytes = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
   0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x01,
   0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, };

 // IV For CBC mode 算法参数描述
 // Again, could be read from a file.
 final static byte[] ivBytes = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
   0x07 };

 /**
  * 构造函数 使用DES加密算法
  *
  * @param keyBytes
  * @param ivBytes
  * @throws Exception
  */
 public SIEncryptUtil(byte[] keyBytes, byte[] ivBytes) throws Exception {
  // 构造函数,确保使用的是SunJCE
  Security.addProvider(new com.sun.crypto.provider.SunJCE());
  SecretKey key = new SecretKeySpec(keyBytes, "DESede");
  IvParameterSpec iv = new IvParameterSpec(ivBytes);

  this.encryptCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding",
    "SunJCE");
  this.encryptCipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key, iv);
  this.decryptCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding",
    "SunJCE");
  this.decryptCipher.init(javax.crypto.Cipher.DECRYPT_MODE, key, iv);
 }

 /**
  * 加密字符串 必须用相同的key
  *
  * @param password
  *            要加密的字符串
  * @return 返回密文
  * @throws Exception
  */
 synchronized public String encrypt(String password) throws Exception {
  byte[] passwordBytes = password.getBytes();
  byte[] encryptedPasswordBytes = this.encryptCipher
    .doFinal(passwordBytes);
  String encodedEncryptedPassword = this.base64Encoder
    .encode(encryptedPasswordBytes);
  return encodedEncryptedPassword;
 }

 /**
  * 解密字符串 必须用相同的key
  *
  * @param encodedEncryptedPassword
  *            要解密的密文
  * @return 明文
  * @throws Exception
  */
 synchronized public String decrypt(String encodedEncryptedPassword)
   throws Exception {
  byte[] encryptedPasswordBytes = this.base64Decoder
    .decodeBuffer(encodedEncryptedPassword);
  byte[] passwordBytes = this.decryptCipher
    .doFinal(encryptedPasswordBytes);
  String recoveredPassword = new String(passwordBytes);
  return recoveredPassword;
 }

 /**
  * 加密字符串,适合用于加密密码 必须用相同的key
  *
  * @param password
  *            要加密的字符串
  * @return 返回密文
  * @throws Exception
  */
 synchronized public String encryptASCII(String password) throws Exception {
  // 判断是否是ASCII模式
  if (!password.matches("[ -~]{6,}"))
   throw new IllegalArgumentException("String must be ASCII mode.");

  byte[] passwordBytes = password.getBytes(characterEncoding);
  byte[] encryptedPasswordBytes = this.encryptCipher
    .doFinal(passwordBytes);
  String encodedEncryptedPassword = this.base64Encoder
    .encode(encryptedPasswordBytes);
  return encodedEncryptedPassword;
 }

 /**
  * 解密字符串 必须用相同的key
  *
  * @param encodedEncryptedPassword
  *            要解密的密文
  * @return 明文
  * @throws Exception
  */
 synchronized public String decryptASCII(String encodedEncryptedPassword)
   throws Exception {
  byte[] encryptedPasswordBytes = this.base64Decoder
    .decodeBuffer(encodedEncryptedPassword);
  byte[] passwordBytes = this.decryptCipher
    .doFinal(encryptedPasswordBytes);
  String recoveredPassword = new String(passwordBytes, characterEncoding);
  return recoveredPassword;
 }

 /**
  * 实例
  *
  * @return
  * @throws Exception
  */
 public static SIEncryptUtil getInstance() throws Exception {

  if (sie == null) {
   sie = new SIEncryptUtil(DESedeKeyBytes, ivBytes);
   return sie;
  } else {
   return sie;
  }

 }

 // Simple test
 public static void main(String[] args) {
  try {

   String password = (args.length == 0) ? "The quick brown fox jumps over the 测试。lazy lao1."
     : args[0];

   System.out.println("要加密的密码为:..................[" + password
     + "]");

   String encodedEncryptedPassword = SIEncryptUtil.getInstance()
     .encrypt(password);
   System.out.println("加密后的密码为:..................["
     + encodedEncryptedPassword + "]");

   String recoveredPassword = SIEncryptUtil.getInstance().decrypt(
     encodedEncryptedPassword);

   System.out.println("解密后的密码为:..................["
     + recoveredPassword + "]");
  } catch (Exception e) {
   e.printStackTrace(System.out);
  }
 }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Des前台加密、后台解密Demo

Des是加密的一种方式,该例子可以实现前台加密&&解密,后台加密&&解密,前后台可以互相转换。...
  • jibaole
  • jibaole
  • 2015年12月24日 10:49
  • 1645

DES加密和解密

using System.Security.Cryptography; using System.IO; using System.Text; //加密: public static ...
  • sinat_15155817
  • sinat_15155817
  • 2016年09月06日 09:41
  • 698

C# 使用DES加密,解密字符串

1 DES类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
  • taoerit
  • taoerit
  • 2016年07月14日 09:40
  • 5306

C#DES加密解密

DES,全称Data Encryption Standard,是一种对称加密算法。由于其安全性比较高(有限时间内,没有一种加密方法可以说是100%安全),很可能是最广泛的密钥系统(我们公司也在用,估计...
  • kebi007
  • kebi007
  • 2017年04月13日 19:57
  • 3348

DES 加密解密算法的C++实现

网络与信息安全 Introduction to Network and Security   ——DES 加密解密算法的C++实现                 姓 名:  ...
  • u014316433
  • u014316433
  • 2014年05月20日 09:50
  • 1781

Java DES 加密和解密算法的使用

DES简介: DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。...
  • kalision
  • kalision
  • 2014年11月03日 10:16
  • 1789

Android DES加密解密

网上的demo一搜一大堆,但是,基本上都是一知半解(包括我)。为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通。就是加密的结果不一样...
  • yakedar
  • yakedar
  • 2013年08月02日 19:52
  • 4873

VB.NET 的 DES 加密与解密(转载于nofort博客)

MD5和SHA的加密方式都是单向的,就算是我写的程序用户的密码用这两种方式保存后,我对着看也不知道他们的密码是什么,这用在保存密码上是不错的,但如果是一些需要能将密文还原的应用来说就不合适了,所以接下...
  • lpwmm
  • lpwmm
  • 2016年03月06日 23:19
  • 2213

java加解密之DES多种使用方式

最近逆向分析中,常常遇到加解密的内容,接触得比较多的加解密算法一般有对称的DES和AES,非对称的RSA,单向的MD5等。 这里就DES的使用研究进行一个随笔记录,并不会说其实现原理,原理可以自行百度...
  • qq_18870023
  • qq_18870023
  • 2016年08月11日 15:04
  • 11652

Java实现文件的DES加密与解密算法

根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的...
  • Feng______
  • Feng______
  • 2014年11月04日 11:51
  • 5878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改后的DES加密解密程序
举报原因:
原因补充:

(最多只允许输入30个字)