DES 对称加密方式,在通信过程中经常用到。DES有四种加密模式:
1. ECB
Electronic Codebook
最古老简单的模式,加密数据长度必须为8的倍数(不足8位添加padding),密钥必须为8位。不依赖向量,易受到字典攻击。不推荐。
2. CBC
Cipher Block Chaining
引入初始化vector,可以使用不同的Vector产生不同的密文。缺点一个错误发生后,当前和以后的数据都会被影响。
3. CFB
Cipher Feedback
加密反馈模式克服了需要等待8个字节才能加密的缺点,它采用了分组密码作为流密码的密钥流生成器。缺点一旦某位数据出错,会影响目前和其后8个块的数据;
4. OFB
Output Feedback
其中以ECB模式最简单,不依赖向量,缺点也比较明显,易受到字典攻击。推荐使用CFB方式加密。
下面探讨一下ECB各语言下的实现。
一. C实现
C语言下可调用第三方库openssl实现DES加密。
#include <openssl/des.h> /** * @brief DES ECB加解密,暂时不选用CBC * @param pSrc [in] 源字符串 * @param pLen 源字符串长度 * @param key [in] 密钥 * @param kLen 密钥长度 * @param enc 操作类型,DES_ENCRYPT加密,DES_DECRYPT解密 * @param cipher [out] 加密后的字符串 * @param oLen [out] 加密后的字符串长度 * * @return 加密后的字符串 */ std::string _DESCode( const char *pSrc, int pLen, char *key, int kLen, int *oLen, int enc ) { std::string strCipher; std::vector<unsigned char> ciphers; DES_cblock keyEncrypt; memset( (void*)keyEncrypt,0,8 ); // 只取key的8位 memcpy( (void*)keyEncrypt, (void*)key, kLen >=8?8:kLen ); // 设置key DES_key_schedule keySchedule; DES_set_key_unchecked(&keyEncrypt, &keySchedule); const_DES_cblock inputText; // 每次输入8位 DES_cblock outputText; // 每次输出8位 unsigned char tmp[8]; // 中间结果 // 每次加密8字节 for( int i = 0; i < pLen/8; i++ ) { memcpy( inputText, pSrc + i*8,8 ); DES_ecb_encrypt( &inputText,&outputText,&keySchedule,enc ); memcpy( tmp,outputText,8 ); // 汇总 for( int j=0; j<8; j++ ) { ciphers.push_back( tmp[j] ); } } // 不足8倍数补齐 if( pLen%8 ) { int tmp1 = pLen/8*8; int tmp2 = pLen - tmp1; memset( (void*)inputText,0,8 ); // 填充0 memcpy( (void*)inputText,(void*)(pSrc + tmp1), tmp2 ); // 剩余部分 DES_ecb_encrypt( &inputText,&outputText,&keySchedule,enc ); memcpy( tmp,outputText,8 ); // 汇总 for( int j=0; j<8; j++ ) { ciphers.push_back( tmp[j] ); } } // 复制结果 strCipher.clear(); strCipher.assign( ciphers.begin(),ciphers.end() ); // 密文长度 *oLen = ciphers.size(); if( enc == DES_DECRYPT ) { *oLen = strCipher.size(); } return strCipher; }
2. java实现
public static final String ALGORITHM_DES = "DES/ECB/NoPadding"; // ECB /** * DES算法,加密 * * @param data 待加密字符串,数据不足8位倍数会自动补全 * @param key 加密私钥,长度不能够小于8位 * @return 加密后的字节数组,一般结合Base64编码使用 * @throws InvalidAlgorithmParameterException * @throws Exception */ public static byte[] encode(String key,String data) { if(data == null) return null; // ECB模式下,待加密字符串长度必须为8的倍数 data = fillZero(data); try{ DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // key的长度不能够小于8位字节 Key secretKey = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance(ALGORITHM_DES); // 加密 cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] bytes = cipher.doFinal(data.getBytes()); return bytes; }catch(Exception e){ System.out.println(e.getMessage()); } return null; } /** * DES算法,解密 * * @param data 待解密字符串 * @param key 解密私钥,长度不能够小于8位 * @return 解密后的字节数组,数据不足8位倍数会自动补全,需去除\0 * @throws Exception 异常 */ public static String decode(String key,byte[] data) { if(data == null) return null; try { DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // key的长度不能够小于8位字节 Key secretKey = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance(ALGORITHM_DES); // 解密 cipher.init(Cipher.DECRYPT_MODE, secretKey); // 去除空格 byte[] output = cipher.doFinal(data); int i = 0; for( i=output.length-1; i>=0; i-- ){ if( output[i] != '\0' ) break; } return new String(output,0,i+1); } catch (Exception e){ System.out.println(e.getMessage()); } return null; }
参考资料:
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
相关推荐
在给定的“des加密例程”中,可能包含了一个调用动态链接库(DLL)实现DES加密解密的示例代码。DLL是Windows操作系统中的一种共享库,可以被多个程序同时调用,节省内存资源并便于代码复用。这个示例可能涉及以下...
标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...
DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...
本篇文章将详细探讨如何在VB环境中实现DES加密和解密,以及相关的VBA(Visual Basic for Applications)应用。 首先,DES是一种块加密算法,它的基本工作原理是将明文数据分为64位的块,然后通过一系列复杂的数学...
6. **执行D3DES**:首先用第一个密钥执行DES加密,然后用第二个密钥执行DES解密,最后再用第一个密钥进行一次DES加密。这个过程就是D3DES的核心。 7. **密文后处理**:加密完成后,对密文进行逆初始置换,得到最终...
在Delphi编程环境中,实现DES加密和解密是一项常见的任务,特别是在处理敏感信息时。 标题"DES加密_delphi_加解密_des_"所涉及的核心知识点是: 1. **DES算法**:DES是一种64位块密码,使用56位的密钥进行加密。它...
DES加密算法的工作原理主要包括以下几个步骤: 1. **初始置换**:原始64位的数据块首先经过一个固定的初始置换,使得数据分布更均匀,增强安全性。 2. **16轮迭代**:每轮迭代都包括四个子步骤: - **子密钥产生*...
3DES(Triple Data Encryption Algorithm,三重数据加密算法)是一种强化版的DES(Data Encryption Standard)加密算法,它通过三次应用DES加密过程来提高安全性。在JavaScript中实现3DES加密通常是为了在网络通信中...
在SQL Server中进行DES加密是保护敏感数据的一种常见方法,特别是在C#应用程序中与数据库交互时。DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥进行加密和解密,提供了一种相对快速的数据...
在本文中,我们将深入探讨基于DES加密的TCP聊天程序的实现,以及DES算法和TCP协议的相关知识。DES(Data Encryption Standard)是一种广泛应用的对称加密算法,它的历史可以追溯到20世纪70年代,由IBM的Lucifer算法...
**Qt DES加密算法展示程序详解** Qt是一个跨平台的C++图形用户界面应用程序开发框架,它为开发者提供了丰富的工具和库,使得构建GUI应用变得容易。在这个“Qt写的DES加密算法展示程序”中,我们将深入探讨DES(Data...
本DEMO提供了C#和JAVA两种编程语言下的DES加密和解密实现,这对于理解DES算法及其在实际开发中的应用非常有帮助。 1. **DES算法原理** - **结构**:DES算法基于Feistel网络,它将明文分为左右两半,通过一系列的...
在C语言中实现DES加密算法,你需要理解以下几个关键知识点: 1. **DES结构**:DES算法分为两个主要部分——初始置换(IP)和逆初始置换(IP^-1),以及16轮的Feistel网络。每轮包含子步骤如扩展置换(E-Box)、选择...
使用`crypto.createCipheriv`方法创建3DES加密器,需要指定加密算法('des-ede3'代表3DES),初始化向量(IV,通常为随机生成的8字节序列),以及密钥。例如: ```javascript const iv = Buffer.alloc(8, 0); // ...
在C++中实现DES加密解密,可以创建一个类来封装相关的操作,这样有利于代码的复用和维护。 描述中提到的"单倍双倍加密算法的实现",可能是指使用DES算法进行一次或两次加密的过程。单次DES加密使用同一个密钥对数据...
Java 实现文件的 RSA 和 DES 加密 在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的...
实验报告——基于DES加密的TCP聊天程序 一、实验目的 本次实验的主要目的是让学生深入理解DES(Data Encryption Standard)加密算法的原理,并将其应用于TCP(Transmission Control Protocol)通信中,以增强网络...
在C++中实现DES加密算法,通常涉及到以下几个关键知识点: 1. **DES算法原理**:DES算法基于Feistel结构,通过16轮迭代变换将64位明文数据转化为64位密文。每一轮迭代包含一个子密钥生成过程和一个替换-置换过程。...
Java和JavaScript之间的DES加密解密是信息安全领域中的一个重要话题,主要涉及到数据的保护和通信的安全。DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些...
标题中的“字符串DES加密解密,可自定义KEY和向量IV”指的是使用DES(Data Encryption Standard)算法对字符串进行加密和解密的过程,其中用户可以自由设定密钥(Key)和初始向量(Initialization Vector,简称IV)...