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;
}

 

转载于:https://www.cnblogs.com/danpe/p/7792163.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值