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,DES加密算法,DES算法源码。用C写的DES加密算法。 DES,DES加密算法,DES算法源码。 DES加密算法(c语言实现) (本程序可以直接使用)
一个调用动态链接库的des加密解密例子。
对数据进行3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密
DES加密算法实现的C++类DES加密算法实现的C++类
主要介绍了使用java自带des加密算法实现文件加密和字符串加密的示例,需要的朋友可以参考下
DES加密 解密 方法: DESr DESw 支持3DES加密 解密 类中利用函数重载的方式 实现两种加密方式 加密后为16进制字符串 使用方法: 实例化一个对象 然后就可以随便用了。 如 DES加密 解密 CString sd,sd2; yxyDES2 ...
它相当于是对每个数据块应用三次DES加密算法。 最早的定义了该算法的标准(ANS X9.52,1998年发布)将其描述为“三重数据加密算法(TDEA)”— 即为ANSI X3.92中定义的数据加密算法(DEA)的三次重复操作— 而完全...
VB实现DES加密解密算法已测试通过如有更新另行发布
DES加密解密程序的C源码.喜欢就下~~~
易语言文本DES加密源码。@资源源码站。
STM32上实现D3DES加密
在 AES 出现之前,最常用的对称密钥算法是 DES 加密算法,它在 1977 年被公布成为美国政府的商用加密标准。DES 的主要问题是密钥长度较短,渐渐不适合于分布式开放网络对数据加密安全性的要求。因此,1998年美国...
des加密解密工具
采用c#, 在sql server 中调用des 加密, 解密字符串. 可自定义key
用于 Arduino 微控制器平台的 DES 和 Triples DES 加密和解密库 Arduino IDE 要安装库,下载文件并将其复制到 Arduino 开发环境的“libraries”文件夹中的子文件夹(例如“DES”)中。 该库在 Arduino Leonardo 上...
DES加密解密过程,C++实现
DES加密算法C++实现支持多个key输入、支持ECB、CBC填充模式 3、不是.exe程序,是代码段;
有关3DES加密算法的web端js示例,有详细的加解密方法,简单明了
DES加密解密算法的C语言实现,只要调用函数,即可实现数据的加密解密,我已经在DSP上实现。
3DES加密解密的全工具类,快速帮助新人进行3Des加密解密