OpenSSL 中DES-ECB 加密使用注意事项
参考:http://blog.csdn.net/cparent/article/details/40652051
DES加密算法作为一个过时的东西,使用的项目已经很少了。最近在调试与服务器端进行DES加密通讯时,加解密老是错误,而且使用的是最为简单的ECB模式。
服务器端使用的JAVA JDK自带的DES加密算法。
后通过查找资料发现,其设置密钥的方式并不简单,主要有两点需要注意:
1. DES_string_to_key,该方法并不是将字符串直接设置为密钥,而是根据该字符串,生成一组经过计算的Key。一起来看一下代码:
void DES_string_to_key(const char *str, DES_cblock *key)
{
DES_key_schedule ks;
int i, length;
register unsigned char j; memset(key, 0, 8); //密钥的长度为8位
length = strlen(str);
#ifdef OLD_STR_TO_KEY //这部分是过时的转换方式,已经不适用
for (i = 0; i < length; i++)
(*key)[i % 8] ^= (str[i] << 1);
#else /* MIT COMPATIBLE */
for (i = 0; i < length; i++) {
j = str[i];
if ((i % 16) < 8) //对于前8位,将每个字符左移一位,再与0进行异或
(*key)[i % 8] ^= (j << 1);
else { //对于后续的密钥字符,进行如下操作,其实为一个逆排序,假设原数据为 76543210B
/* Reverse the bit order 05/05/92 eay */
j = ((j << 4) & 0xf0) | ((j >> 4) & 0x0f);//高4位与低4位进行交换 32107654B
j = ((j << 2) & 0xcc) | ((j >> 2) & 0x33);//左移2位,取6、7,2、3位,右移2位,取4、5,0,1位 10325476B
j = ((j << 1) & 0xaa) | ((j >> 1) & 0x55);//左移1位,取5、7,1、3位,右移1位,取4、6,0、2位 01234567B
(*key)[7 - (i % 8)] ^= j;
}
}
#endif
DES_set_odd_parity(key);
#ifdef EXPERIMENTAL_STR_TO_STRONG_KEY
if (DES_is_weak_key(key))
(*key)[7] ^= 0xF0;
DES_set_key(key, &ks);
#else
DES_set_key_unchecked(key, &ks);
#endif
DES_cbc_cksum((const unsigned char *)str, key, length, &ks, key);
OPENSSL_cleanse(&ks, sizeof(ks));
DES_set_odd_parity(key);
}
2. 不能使用DES_set_key_checked,而要使用DES_set_key_unchecked。因为使用前者,它会检查密钥的奇偶性和密钥的强度。经常会导致密钥无法通过检验,而无法成功设置。
/*-
* return 0 if key parity is odd (correct),
* return -1 if key parity error,
* return -2 if illegal weak key.
*/
int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
{
if (!DES_check_key_parity(key))
return (-1);
if (DES_is_weak_key(key))
return (-2);
DES_set_key_unchecked(key, schedule);
return 0;
}
OpenSSL 中DES-ECB 加密使用注意事项的更多相关文章
- OPENSSL安装 以及使用openssl中的AES加密和解密
OPENSSL安装:(VS) 1:第一步和所有的软件安装一样. 2:将OPENSSL中INLUCDE 和 LIB 分别拷贝到VS中VC的INLUCDE 和LIB目录下(我的机器上的目录是:C:\Pro ...
- python des ecb 加密 demo
# -*- coding:utf-8 -*- from pyDes import * def hexString2bytes(src): ret =[] for i in range(len(src) ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- PHP实现DES/ECB/PKCS5Padding加密兼容Java SHA1PRNG算法
在使用php调用java接口时,遇到了两边加密结果不一致的问题.经过沟通发现接口方使用了SHA1PRNG算法,对原密码计算后做为Des的加密Key. 因此在php中也需要先对原密码做相应计算才能保持结 ...
- 使用openssl库实现des,3des加密
原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...
- php中des加密解密 匹配C#des加密解密 对称加密
原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数 可以用于C#和php通信 对数据进行加密,其中$key 是 ...
- OpenSSL中的大数接口与基于其的自用RSA加密接口设计
本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...
- IOS中DES与MD5加密方案
0 2 项目中用的的加密算法,因为要和安卓版的适配,中间遇到许多麻烦. MD5算法和DES算法是常见的两种加密算法. MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那 ...
随机推荐
- IDEA关掉重复代码波浪线
如图: File----Settings
- protobuf 编码实现解析(java)
一:protobuf编码基本数据类型 public enum FieldType { DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), FLOAT (Java ...
- mysql 性能优化常见命令
mysql 性能优化常见命令: 一: 当发现mysql程序运行缓慢时,在排除sql主机问题之后,可以尝试在schema,table,和sql上进一步进行考查: 1:mysql> show ful ...
- Django中的F和Q函数
内容简介: 介绍Django中的F和Q作用以及使用方法 一.F介绍 作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段 ...
- main函数的两个参数
#include "stdio.h" int main(int argc ,char **argv) { printf("argc = %d \n",argc) ...
- 关于win10企业版1607累积更新(KB4013429)安装失败后,个人的解决办法
最近连续一个多星期更新(1607-KB4013429)失败,更抓狂的是windows不厌其烦的,不断下载,不断更新,导致每天打开电脑都要等个十几分钟,看来不解决是不行了. 网上一查,有各种解决版本 1 ...
- extends Thread 与 implements Runnable 的区别
http://blog.csdn.net/zhikun518/article/details/7526298 1.通过实现Runnable接口创建线程 (1).定义一个类实现Runnable接口,重写 ...
- 如何修改nexus的端口号
1. Maven仓库:放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源. 简言之,Maven仓库能帮助 ...
- [Java 教程 01] Hello,Java!
前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...
- 关于awk的多文件处理
关于awk的多文件处理: awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如1.shell的Pathname Expansion方式:awk '{...}' *.txt # *.t ...