- 浏览: 15621 次
- 性别:
- 来自: 深圳
最新评论
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
java代码
Des.java
Base64.java
StringUtil.java
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; } }
- des.zip (1.4 MB)
- 下载次数: 7
相关推荐
DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...
标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...
这种基于DES的前后端加解密方案可以有效防止数据在传输过程中被窃取,但也有其局限性,如DES的密钥长度只有56位,相对较短,容易受到现代计算能力的攻击。因此,实际应用中更倾向于使用更安全的AES(Advanced ...
对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密
本文将深入探讨C++中实现的DES(Data Encryption Standard)加密解密技术,以及如何应用于文本和图像的加解密。DES是一种广泛使用的对称加密算法,它基于块加密,对固定长度的数据块进行操作。 首先,DES算法的工作...
用C语言实现了DES、三重DES(3DES)的加解密,支持ECB、CBC模式。 ECB支持64位密钥; CBC支持128和192位密钥
本项目是使用Visual C++实现3DES加解密功能的一个实例,下面将详细介绍3DES算法及其在Visual C++中的实现。 3DES,全称为三重DES,是对DES(Data Encryption Standard)的加强版。DES是一种块密码,采用64位的数据...
**Qt DES_ECB 加密解密类** 在IT领域,数据安全是至关重要的,而加密技术就是保护数据安全的一种常用手段。DES(Data Encryption Standard)是一种古老的对称加密算法,虽然现在已被更强大的AES(Advanced ...
本资源包含前端的js用des加密解密字符串,且加密出来的字符串可直接用本资源的后台解密出来。
C#DES标准ECB加密解密示例源码,根据标准的C改的源码,与网上所搜索到的完全不一样,可以支持中文为密钥的加密,也可以支持为中文字符串的加密,如,密钥为:替天行道,明文为:来自替天行道的C#DES标准ECB加密解密...
DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密解密工具包DES64加密...
4. **加解密过程**:DES的加密和解密过程非常相似,只是在某些步骤中使用了相反的操作。解密时,只需将加密过程中的子密钥顺序反转,并应用相反的非线性函数。 在给定的“des加密例程”中,可能包含了一个调用动态...
在这个项目中,我们将探讨如何使用MFC在VC++环境中实现DES加密和解密。 首先,DES是一种块加密算法,它将明文数据分为64位的块进行处理。但是,由于其中7位是奇偶校验位,实际有效密钥长度为56位。DES通过一系列...
DES加密解密(c++实现)
DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具DES加密解密工具
`3des加解密.c`可能是主程序,它调用了`d3des.cpp`中定义的函数,而`d3des.h`可能包含了加密解密函数的声明。通过阅读和理解这些代码,可以学习到如何在实际项目中应用DES和3DES。 总的来说,DES和3DES是密码学中的...
本篇文章将详细探讨在C++中实现3DES和Base64加解密的技术要点。 3DES(Triple Data Encryption Algorithm)是一种对称加密算法,它是DES(Data Encryption Standard)的加强版。DES使用56位的密钥,3DES通过三次...
标题"DES加密_delphi_加解密_des_"所涉及的核心知识点是: 1. **DES算法**:DES是一种64位块密码,使用56位的密钥进行加密。它通过一系列的置换和混淆操作,将64位的数据块与56位的密钥进行交互,形成新的数据块。...
3DES加密解密的全工具类,快速帮助新人进行3Des加密解密
一:加解密 DES(单倍长) 3DES(双倍长) 3DES(三倍长) 二:MAC运算 ANSI-X9.9-MAC PBOC-DES-MAC PBOC-3DES-MAC . . .