`
逝去的梦
  • 浏览: 15535 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

des前、后加解密

    博客分类:
  • des
阅读更多
DES加密算法基本知识
DES(Data Encryption Standard)又叫数据加密标准,是1973年5月15日美国国家标准局(现在是美国标准技术研究所,即NIST)在联邦记录中公开征集密码体制时出现的。DES由IBM开发,它是对早期被称为Lucifer体制的改进。DES在1975年3月17日首次在联邦记录中公布,在经过大量的公开讨论后,1977年2月15日DES被采纳为“非密级”应用的一个标准。最初预期DES作为一个标准只能使用10-15年,然而,事实证明DES要长寿得多。在其被采用后,大约每隔5年被评审一次。DES的最后一次评审是在1999年1月,在当时,一个DES的替代品,AES(Advanced Encryption Standard)开始使用。
DES是一种分组对称加解密算法,用64位密钥(实际用56位,其中每第八位作奇偶校验位)来加密(解密)64位数据,加密的过程伴随一系列的转换与代换操作。DES加密(解密)的过程可以分为两步:首先变换密钥得到56位密钥,然后据转换操作得到48位共16组子密钥。其次是用上面得到的16组子密钥加密(解密) 64位明(密)文,这个过程会有相应的S-BOX等的代换-转换操作。整个算法加密过程可以参考DES标准说明文件。

js代码(源代码见尾部附件(des.zip))
注意:js加载顺序依次为 jquery.js,cryptojs-core.js,enc-base64.js,cipher-core.js,tripledes.js,mode-ecb.js

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="./jquery.js"></script>
<script type="text/javascript" src="./cryptojs-core.js"></script>
<script type="text/javascript" src="./enc-base64.js"></script>
<script type="text/javascript" src="./cipher-core.js"></script>
<script type="text/javascript" src="./tripledes.js"></script>
<script type="text/javascript" src="./mode-ecb.js"></script>
<script type="text/javascript">

//DES 加密
function encryptByDES(message, key) {
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.toString();
    }

//DES 解密
function decryptByDES(ciphertext, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    // direct decrypt ciphertext
    var decrypted = CryptoJS.DES.decrypt({
        ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
    }, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}


var key = "AAAABBBB";  
var message = "武汉 湖北 中国";

//DES 加密
var encrypted = encryptByDES(message, key); 
//DES 解密
var decrypted = decryptByDES(encrypted, key);

document.writeln ("encrypted Test: " + encrypted);
document.writeln ("decrypted Test: " + decrypted);  

</script>
</head>
<body>

<h1>DES Demo.</h1>

</body>
</html>


java代码
Des.java
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * DES(Data Encryption Standard, 数据加密标准).<br>
 * Key为64位,去除64位中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.<br>
 * @author jason.zhong <br>
 * @version 1.0.0 2016年6月30日<br>
 * @see 
 */
public class Des {
	
	/**
	 * 日志记录器.
	 */
//	private static Log LOG = LogFactory.getLog(Des.class);
	
	/**
	 * DES加解密算法.
	 */
	protected static final String ALGORITHM_DES = "DES";
	
	/**
	 * DES填补方式.
	 * DES/CBC/PKCS5Padding. 
	 */
	protected static final String TRANSFORMATION_DES = "DES/ECB/Pkcs7";

	/**
	 * 构造函数(私有).
	 * @param algorithm 算法
	 * @param transformation 转换方式
	 */
	private Des(String algorithm, String transformation) {
	}
	
	/**
	 * 加密算法.
	 * @param data 需要加密的数据
	 * @param key 秘钥
	 * @return
	 */
	public static String encryptAsString(String data, String key) {
		byte[] bt = Des.encrypt(data.getBytes(), key.getBytes());
		return Base64.encryptAsString(bt);
	}
	
	/**
	 * 解密算法.
	 * @param data 需要解密的数据
	 * @param key 秘钥
	 * @return
	 */
	public static byte[] decryptAsByteArray(String data, String key) {
		if (data == null)
			return null;
		byte[] buf = Base64.decryptAsByteArray(data);
		return decrypt(buf, key.getBytes());
	}

	/**
	 * 解密算法
	 * @param data 需要解密的数据
	 * @param key 秘钥
	 * @return
	 */
	public static String decryptAsString(String data, String key) {
		if (data == null) {
			return null;
		}
		byte[] bt = decryptAsByteArray(data, key);
		return new String(bt);
	}
	
	/**
	 * 
	 * @param data
	 * @param key
	 * @return
	 */
	private static byte[] encrypt(byte[] data, byte[] key) {
		return doFinal(data, key, ALGORITHM_DES, TRANSFORMATION_DES, Cipher.ENCRYPT_MODE);
	}
	
	/**
	 * 
	 * @param data
	 * @param key
	 * @return
	 */
	private static byte[] decrypt(byte[] data, byte[] key) {
		return doFinal(data, key, ALGORITHM_DES, TRANSFORMATION_DES, Cipher.DECRYPT_MODE);
	}

	/**
	 * 加密/解密操作.
	 * @param data 需要操作的数据
	 * @param key 秘钥
	 * @param algorithm 
	 * @param transformation
	 * @param opmode
	 * @return
	 * @throws Exception
	 */
	private static byte[] doFinal(byte[] data, byte[] key, String algorithm, String transformation, int opmode) {
		byte[] result = null;
		try {
			// 创建秘钥工厂
//	        final SecretKey securekey = new SecretKeySpec(key, algorithm);
			
			
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            Key key2  = keyFactory.generateSecret(new DESKeySpec(key));  

	 
	        // 加密/解密
	        final SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
	        final Cipher cipher = Cipher.getInstance("DES"); // transformation : the name of the transformation, e.g., DES/CBC/PKCS5Padding. 

	        cipher.init(opmode, key2, secureRandom);
	        result = cipher.doFinal(data);
		} catch (Exception e) {
//			if (LOG.isErrorEnabled()) {
//				LOG.error(new ExampleRuntimeException(e));
//			}
		}
		
		return result;
    }
	
	public static void main(String[] args) {
		final String plainText = "武汉 湖北 中国";
		final String key = "AAAABBBB";
		final String decodedText = Des.encryptAsString(plainText, key);
		System.out.println(decodedText);
		final String encodeText = Des.decryptAsString(decodedText, key);
		System.out.println(encodeText);
	}
}


Base64.java
/**
 * Base加解密.<br>
 * @author jason.zhong <br>
 * @version 1.0.0 2016年6月30日<br>
 * @see 
 * @since JDK 1.6.0
 */
public class Base64 {
	
	public static byte[] encryptAsByteArray(byte[] plainData) {
		return org.apache.commons.codec.binary.Base64.encodeBase64(plainData);
	}
	
	public static String encryptAsString(byte[] plainData) {
		final byte[] base64Data = encryptAsByteArray(plainData);
		return StringUtil.toUtf8String(base64Data);
	}
	
	public static byte[] encryptAsByteArray(String plainText) {
		final byte[] plainData = plainText.getBytes();
		return encryptAsByteArray(plainData);
	}
	
	public static String encryptAsString(String plainText) {
		final byte[] plainData = plainText.getBytes();
		return encryptAsString(plainData);
	}
	
	public static byte[] decryptAsByteArray(String base64String) {
		return org.apache.commons.codec.binary.Base64.decodeBase64(base64String.getBytes());
	}
	
	public static String decryptAsString(String base64String) {
		byte[] plainData = decryptAsByteArray(base64String);
		return StringUtil.toUtf8String(plainData);
	}
	
	public static void main(String[] args) {
		final String s = "武汉  湖北 中国";
		System.out.println(encryptAsString(s));
		System.out.println(decryptAsString(encryptAsString(s)));
	}
}


StringUtil.java
import java.io.UnsupportedEncodingException;


/**
 * 字符串工具类.<br>
 * @author jason.zhong <br>
 */
public final class StringUtil {
	
	/**
	 * 斜线.
	 */
	public static final char SLASH = '\u002f';
	
	/**
	 * 反斜线.
	 */
	public static final char BACK_SLASH = '\\';
	
	/**
	 * 点号.
	 */
	public static final char DOT = '\u002e';
	
	/**
	 * 逗号.
	 */
	public static final char COMMA = '\u002c';
	
	/**
	 * 空字符串"".
	 */
	public static final char EMPTY = '\u0000'; 
	
	/**
	 * 空格.
	 */
	public static final char SPACE = '\u0020';
	
	/**
	 * 左中括号.
	 */
	public static final char LEFT_BRACKET = '\u005b';
	
	/**
	 * 左中括号.
	 */
	public static final char RIGHT_BRACKET = '\u005d';
	
	/**
	 * UTF-8
	 */
	public static final String UTF_8 = "UTF-8";
	
	/**
	 * GBK
	 */
	public static final String GBK = "GBK";
	
	/**
	 * GB231
	 */
	public static final String GB2312 = "GB2312";
	
	/**
	 * 构造函数(私有)
	 */
	private StringUtil() { }
	
	/**
	 * 判断字符串是否是null或者空字符串.
	 * @param s 被判断的字符串
	 * @return 如果字符串为null或""则返回true,否则返回false.
	 */
	public static boolean hasText(String s) {
		if (null == s || s.length() == 0)  {
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * 根据Field的名字,按照Bean的规则,生产对应的Setter方法名.
	 * @param fieldName field名称
	 * @return Setter方法名称
	 */
	public static String getGetterMethodName(final String fieldName) {
		return "get" + upperCaseFirst(fieldName);
	}
	
	/**
	 * 根据Field的名字,按照Bean的规则,生产对应的Setter方法名.
	 * @param fieldName field名称
	 * @return Setter方法名称
	 */
	public static String getSetterMethodName(final String fieldName) {
		return "set" + upperCaseFirst(fieldName);
	}
	
	/**
	 * 将字符串的首字母变为大写.
	 * @param s
	 * @return
	 */
	public static String upperCaseFirst(final String s) {
		if (null == s || s.length() < 1) {
			return s;
		}
		
		return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
	}
	
	/**
	 * 将字符串的首字母变为小写.
	 * @param s
	 * @return
	 */
	public static String lowerCaseFirst(final String s) {
		if (null == s || s.length() < 1) {
			return s;
		}
		
		return s.substring(0, 1).toLowerCase() + s.substring(1, s.length());
	}
	
    /**
	 * 格式化字符串.
	 * 将字符串中的{1}、{2}替换成%s,便于使用String.format方法.
	 * @param message
	 * @param arguments
	 */
	public static String formatString(String messages, Object... arguments) {
		final String regExp = "\\{\\d+\\}";
		return String.format(messages.replaceAll(regExp, "%s"), arguments);
	}
    
    /**
	 * 格式化字符串数组.
	 * @param message
	 * @param arguments
	 */
	public static String formatStringArray(String[] messages, Object... arguments) {
		if (null == messages || messages.length == 0) {
			return String.valueOf(EMPTY);
		}
		final StringBuilder sbMessage = new StringBuilder();
		for (int i=0; i < messages.length; i++) {
			sbMessage.append(messages[i]);
			if (i < messages.length - 1) {
				sbMessage.append(COMMA);
				sbMessage.append(SPACE);
			} else {
				sbMessage.append(DOT);
			}
		}
		
		return formatString(sbMessage.toString(), arguments);
	}
	
	/**
	 * 判断字符串转换为全小写后,是否为"true".
	 * @param s
	 * @return 如果指定的字符串不为空,而且忽略大小写后等于"true",那么返回true,否则返回false.
	 */
	public static boolean isTrue(String s) {
		return (s != null) && s.equalsIgnoreCase("true");
	}
	
	/**
	 * 将btye转化为UTF-8格式的字符串.
	 * @param data
	 * @return
	 */
	public static String toUtf8String(byte[] data) {
		String result = "";
		try {
			result = new String(data, UTF_8);
		} catch (UnsupportedEncodingException e) {
			// 这个异常不会产生.
		}
		
		return result;
	}
}

分享到:
评论

相关推荐

    C语言实现DES加密解密算法

    DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...

    基于des前后端加密解密

    这种基于DES的前后端加解密方案可以有效防止数据在传输过程中被窃取,但也有其局限性,如DES的密钥长度只有56位,相对较短,容易受到现代计算能力的攻击。因此,实际应用中更倾向于使用更安全的AES(Advanced ...

    DES/3DES加密解密工具

    对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密

    3DES加密解密工具

    标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...

    DES.rar_C++ 加密解密_des_des报告_加解密_文本图像

    本文将深入探讨C++中实现的DES(Data Encryption Standard)加密解密技术,以及如何应用于文本和图像的加解密。DES是一种广泛使用的对称加密算法,它基于块加密,对固定长度的数据块进行操作。 首先,DES算法的工作...

    Qt DES_ECB加密解密类

    **Qt DES_ECB 加密解密类** 在IT领域,数据安全是至关重要的,而加密技术就是保护数据安全的一种常用手段。DES(Data Encryption Standard)是一种古老的对称加密算法,虽然现在已被更强大的AES(Advanced ...

    visual c++ VC实现3DES加解密 加密解密.zip

    本项目是使用Visual C++实现3DES加解密功能的一个实例,下面将详细介绍3DES算法及其在Visual C++中的实现。 3DES,全称为三重DES,是对DES(Data Encryption Standard)的加强版。DES是一种块密码,采用64位的数据...

    DES_3DES加解密算法C语言实现

    用C语言实现了DES、三重DES(3DES)的加解密,支持ECB、CBC模式。 ECB支持64位密钥; CBC支持128和192位密钥

    DES前后端加密解密

    本资源包含前端的js用des加密解密字符串,且加密出来的字符串可直接用本资源的后台解密出来。

    C#DES标准ECB加密解密示例源码

    C#DES标准ECB加密解密示例源码,根据标准的C改的源码,与网上所搜索到的完全不一样,可以支持中文为密钥的加密,也可以支持为中文字符串的加密,如,密钥为:替天行道,明文为:来自替天行道的C#DES标准ECB加密解密...

    DES64加密解密工具包

    DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密...

    des加密解密_Des加密解密_DES加密_

    4. **加解密过程**:DES的加密和解密过程非常相似,只是在某些步骤中使用了相反的操作。解密时,只需将加密过程中的子密钥顺序反转,并应用相反的非线性函数。 在给定的“des加密例程”中,可能包含了一个调用动态...

    MFC实现DES加密解密实现

    在这个项目中,我们将探讨如何使用MFC在VC++环境中实现DES加密和解密。 首先,DES是一种块加密算法,它将明文数据分为64位的块进行处理。但是,由于其中7位是奇偶校验位,实际有效密钥长度为56位。DES通过一系列...

    DES加密解密(c++实现)

    DES加密解密(c++实现)

    DES加密解密工具 DES加密解密工具

    DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具

    des 3des 加密 解密

    `3des加解密.c`可能是主程序,它调用了`d3des.cpp`中定义的函数,而`d3des.h`可能包含了加密解密函数的声明。通过阅读和理解这些代码,可以学习到如何在实际项目中应用DES和3DES。 总的来说,DES和3DES是密码学中的...

    C++ 实现 3DES加解密Base64加解密

    本篇文章将详细探讨在C++中实现3DES和Base64加解密的技术要点。 3DES(Triple Data Encryption Algorithm)是一种对称加密算法,它是DES(Data Encryption Standard)的加强版。DES使用56位的密钥,3DES通过三次...

    DES加密_delphi_加解密_des_

    标题"DES加密_delphi_加解密_des_"所涉及的核心知识点是: 1. **DES算法**:DES是一种64位块密码,使用56位的密钥进行加密。它通过一系列的置换和混淆操作,将64位的数据块与56位的密钥进行交互,形成新的数据块。...

    3DES加密解密工具类

    3DES加密解密的全工具类,快速帮助新人进行3Des加密解密

    DES算法工具(DES_3DES_MAC加密解密器)

    一:加解密 DES(单倍长) 3DES(双倍长) 3DES(三倍长) 二:MAC运算 ANSI-X9.9-MAC PBOC-DES-MAC PBOC-3DES-MAC . . .

Global site tag (gtag.js) - Google Analytics