求个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.



...全文
525 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的和一个自行实现的.得到的结果都不符合.
LibTomCrypt is a fairly comprehensive, modular and portable cryptographic toolkit that provides developers with a vast array of well known published block ciphers, one-way hash functions, chaining modes, pseudo-random number generators, public key cryptography and a plethora of other routines. LibTomCrypt has been designed from the ground up to be very simple to use. It has a modular and standard API that allows new ciphers, hashes and PRNGs to be added or removed without change to the overall end application. It features easy to use functions and a complete user manual which has many source snippet examples. LibTomCrypt is free for all purposes under the public domain. This includes commercial use, redistribution and even branching. Sports the following Public domain and open source. Written entirely in portable ISO C source (except for things like RNGs for natural reasons) Builds out of the box on virtually every box. All that is required is GCC for the source to build. Includes a 180+ page user manual in PDF format (with working examples in it) Block Ciphers Ciphers come with an ECB encrypt/decrypt, setkey and self-test interfaces. All ciphers have the same prototype which facilitates using multiple ciphers at runtime. Some of the ciphers are flexible in terms of code size and memory usage. Ciphers Supported. Blowfish XTEA RC5 RC6 SAFER+ Rijndael (aka AES) Twofish SAFER (K64, SK64, K128, SK128) RC2 DES, 3DES CAST5 Noekeon Skipjack Anubis (with optional tweak as proposed by the developers) Khazad KASUMI SEED Chaining Modes Modes come with a start, encrypt/decrypt and set/get IV interfaces. Mode supported. ECB CBC OFB CFB CTR IEEE LRW mode F8 Chaining Mode One-Way Hash Functions Hashes come with init, process, done and self-test interfaces. All hashes use the same prototypes for the interfaces. Hashes supported. MD2 MD4 MD5 SHA-1 SHA-224/256/384/512 TIGER-192 RIPE-MD 128/160/256/320 WHIRLPOOL Message Authenticat
课程简介    随着”新基建“的推行,其中涉及到的工业互联网、物联网、人工智能、云计算、区块链,无一不是与安全相关,所有数据的存储、传输、签名认证都涉及到密码学技术,所以在这样的大环境下再结合我多年安全开发经验,设计出这门课程。    因为密码学技术在新基建中的重要性,所以使其成为底层开发人员所必备的技能。特别是现在的区块链技术是全面应用密码学,大数据技术和人工智能技术也要解决隐私安全问题。所以现在学习相关技术是非常必要的技术储备,并且可以改造现有的系统,提升其安全性。课程学习目标了解DES算法原理VS2019创建C++项目,并导入openssl库学会OpenSSL DES算法加解密接口加密文件并做PKCS7 Padding 数据填充解密数据并做数据填充解析课程特点    面向工程应用    市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。    从零实现部分算法    课程中实现了base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法的实现,从而加深对密码学的理解。    理论与实践结合    课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。    如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。    代码现场打出    代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,    易学不枯燥    课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。课程用到的技术    课程主要演示基于 VS2019 C++,部分演示基于ubuntu 18.04 GCC makefile    如果没有装linux系统,对本课程的学习也没有影响    课程中的OpenSSL基于最新的3.0版本,如果是openss 1.1.1版本也支持,再低的版本不支持国密算法。 课程常见问题课程讲解用的什么平台和工具?    课程演示主要在windows,基于VS2019 ,一些项目会移植到Linux在ubuntu18.04上我不会Linux能否学习本门课程?    可以的,课程主要在Windows上,Linux部分只是移植,可以暂时跳过,熟悉了Linux再过来看我不会C/C++ 语言是否能学习本门课程?    至少要会C语言,C++特性用得不多,但做了一个封装,可以预习一些C++基础。会不会讲算法实现,会不会太难学不会?    课程偏工程应用,具体的AES,椭圆曲线、RSA等算法只通过图示讲原理,一些简单hash算法会读一些源码,并不去实现,课程中会单独实现简洁的XOR对称加密和base16算法(代码量不大易懂)。其他的应用我们都基于OpenSSL3.0的SDK调用算法。课程提供源码和PPT吗?    课程中所有讲解的源码都提供,课程的上课的ppt也提供,PPT提供pdf版,只可以用于学习,不得商用,代码可以用于商用软件项目,涉及到开源系统部分,需要遵守开源的协议,但不得用于网络教学。要观看全部内容请点击c++实战区块链核心密码学-基于opensslhttps://edu.csdn.net/course/play/29593

69,337

社区成员

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

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