求个C/C++的 3des ecb PKCS5Padding code.

Freeze_Z 2012-06-25 03:43:34
求个C/C++的 3des ecb PKCS5Padding code.
数据请先用以下数据验证下.

data : 450521198506130531$13670267607$100175034231$33526005
key : 030153561100123456788
加密后: 30DDB9272A8C524FB3493E90D2C1F986578F393D60024A3ACE763F577BB99A05294EE28CE58483AEDFE7AC628D0AE9382FACADB97DB8E70E

可基于openssl.



...全文
640 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnxh1 2013-05-13
  • 打赏
  • 举报
回复
data,key 是string类型么,还是16进制呢
iamnxh1 2013-05-13
  • 打赏
  • 举报
回复
请问 data : 450521198506130531$13670267607$100175034231$33526005 key : 030153561100123456788 对应的java是什么
Freeze_Z 2012-06-26
  • 打赏
  • 举报
回复
在线等答案.
java解密.
可是加密要用C.
Freeze_Z 2012-06-26
  • 打赏
  • 举报
回复
原来是key补全方式不匹配.

3des的注意的地方.
1.mode <ecb, cbc其他?>
1.data补齐方式. (java一般使用DESede/ECB/PKCS5Padding. 用其他语言实现与java对接时, 需依次.)
2.key补齐方式.(一般会具体规定. 补0或者 字符'0').

此次出现不匹配是因为规定用字符'0', 但是C code中却使用 0 补齐.




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/des.h>



/************************************************************************
** 本例采用:
** 3des-ecb加密方式;
** 24位密钥,不足24位的右补'0';
** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...
** 本身已8位对齐的,后面补八个0x08。
************************************************************************/
int xxx_3des_encrypt(const char* datain, char* dataout, const unsigned char* keyin, int keyin_len)
{
int docontinue = 1;

int data_len;
int data_rest;
unsigned char ch;

unsigned char *src = NULL; /* 补齐后的明文 */
unsigned char *dst = NULL; /* 解密后的明文 */
int len;
unsigned char tmp[8];
unsigned char in[8];
unsigned char out[8];

int key_len;
#define LEN_OF_KEY 24
unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
unsigned char block_key[9];
DES_key_schedule ks,ks2,ks3;

/* 构造补齐后的密钥 */
key_len = strlen((const char*)keyin);
memcpy(key, keyin, key_len);
memset(key + key_len, '0', LEN_OF_KEY - key_len);

/* 分析补齐明文所需空间及补齐填充数据 */
data_len = strlen(datain);
data_rest = data_len % 8;
len = data_len + (8 - data_rest);
ch = 8 - data_rest;

src = malloc(len);
dst = malloc(len);
if (NULL == src || NULL == dst)
{
docontinue = 0;
}
if (docontinue)
{
int count;
int i;

/* 构造补齐后的加密内容 */
memset(src, 0, len);
memcpy(src, datain, data_len);
memset(src + data_len, ch, 8 - data_rest);

/* 密钥置换 */
memset(block_key, 0, sizeof(block_key));
memcpy(block_key, key + 0, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
memcpy(block_key, key + 8, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
memcpy(block_key, key + 16, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);

/* 循环加密/解密,每8字节一次 */
count = len / 8;
for (i = 0; i < count; i++)
{
memset(tmp, 0, 8);
memset(in, 0, 8);
memset(out, 0, 8);
memcpy(tmp, src + 8 * i, 8);

/* 加密 */
DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)(dst+8*i), &ks, &ks2, &ks3, DES_ENCRYPT);

}

}

int j = 0;
for(j=0; j<len; j++)
{
snprintf(dataout+ j*2, 3, "%02X", dst[j]);
}

if (NULL != src)
{
free(src);
src = NULL;
}
if (NULL != dst)
{
free(dst);
dst = NULL;
}

return 0;
}
qiang81020 2012-06-25
  • 打赏
  • 举报
回复
解不出来,搞不懂。。。
Freeze_Z 2012-06-25
  • 打赏
  • 举报
回复
必须自顶下先.
在网上找的基于openssl的和一个自行实现的.得到的结果都不符合.
内容概要:本文系统阐述了正规表达式(正则表达式)作为词法分析核心工具的理论基础与实际应用。文章从字母表、符号串等基本概念出发,详细介绍了正规式的定义、运算规则、代数性质及其与有限自动机(NFA/DFA)的等价关系,阐明了通过Thompson构造法、子集构造法和DFA最小化实现词法分析器自动生成的技术路径。同时,文中列举了标识符、关键字、运算符等编程语言元素的正规式描述,并说明了最长匹配和优先级规则在歧义消解中的作用。此外,还对比了正规式与上下文无关文法的表达能力差异,指出了其在嵌套结构和计数能力上的局限性,并介绍了Lex/Flex等词法分析器生成工具的应用场景。; 适合人群:计算机相关专业学生、编译原理初学者、希望深入理解词法分析机制的研发人员;具备一定的离散数学和形式语言基础者更佳。; 使用场景及目标:① 学习如何使用正规表达式精确描述程序语言的词法规则;② 掌握从正规式到DFA的转换流程及其实现原理,为构建编译器前端打下基础;③ 理解词法分析器生成工具的工作机制,提升对自动化工具的理解与运用能力。; 阅读建议:建议结合编译器设计实践进行学习,尝试手动完成正规式到NFA再到DFA的转换练习,并使用Flex等工具验证结果,以加深对理论知识的理解与应用。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧