Aes-128-cbc C加密和openssl解密

Aes-128-cbc C加密和openssl解密,openssl,aes,Openssl,Aes,我编写了一个代码,可以读取文件并使用Aes-cbc-128对其进行加密 包括 //包括 包括 包括 包括 包括 定义块_LEN 16 定义MAXBUF 256 定义MAXHEX MAXBUF*2+1 定义键0123456789abcdef 定义IV随机化IV随机化IV unsigned int bin2hex unsigned char*in,unsigned char*out,unsigned int len; unsigned int hex2bin unsigned char*in,uns

我编写了一个代码,可以读取文件并使用Aes-cbc-128对其进行加密

包括 //包括 包括 包括 包括 包括 定义块_LEN 16 定义MAXBUF 256 定义MAXHEX MAXBUF*2+1 定义键0123456789abcdef 定义IV随机化IV随机化IV unsigned int bin2hex unsigned char*in,unsigned char*out,unsigned int len; unsigned int hex2bin unsigned char*in,unsigned char*out,unsigned int len; unsigned int PadData unsigned char*ibuf,unsigned int ilen,int blksize; unsigned int NoPadLen unsigned char*ibuf,unsigned int ilen; 无效打印字符*iv {int i=0; 对于i=0;i<16;++i printf%02x,iv[i]; printf\n; } void callkey unsigned char*keyFileName { 无符号字符键[]=键; FILE*keyFile=fopenkeyFileName,wb; fwritekey,1,16,keyFile; fclosekeyFile; printfKey十六进制:; 打印键; } int mainit argc,char*argv[] { 未签名的long-ilen; 无符号字符数据[MAXBUF];//命令行输入 无符号字符ibuf[MAXBUF+BLOCK_LEN];//要加密的填充输入 无符号字符obuf[MAXHEX];//加密输出 无符号字符xbuf[MAXHEX];//十六进制加密输出 无符号字符ybuf[MAXBUF];//十六进制解密输出 无符号字符dbuf[MAXBUF];//解密输出 无符号字符键[]=键; 无符号字符iv[]=iv; AES_键aeskeyEnc,aeskeyDec; 无符号整数len=0; 文件*infle=fopenargv[1],rb; 文件*outFile=fopenargv[2],wb; 无符号字符*k1ey=static.key; callkeyk1ey; whilelen=freaddata,1,sizeofdata,infle>0 { //准备带有填充的输入数据 printflen=%d\n,len; memset-ibuf,0x00,MAXBUF; memcpy ibuf,数据,len; //要编码的块的pad和calc长度 ilen=PadData ibuf,len,BLOCK_len; PrintFileLength=%ld\n,ilen; //初始化密钥 AES\u设置\u加密\u密钥,128,&aeskeyEnc; AES\u设置\u解密\u密钥,128,&AESKYDEC; //加密字符串 memcpy iv、iv、sizeof iv; memsetobuf,0x00,MAXHEX; AES_cbc_encrypt ibuf、obuf、ilen和aeskeyEnc、iv、AES_encrypt; len=fwriteobuf,1,ilen,outFile; printfwritenlen:%d\n,len; memsetdata,0x00,MAXBUF; }//而1 fcloseinfle; fcloseoutFile; 返回0; } /* *PadData函数用于填充密码块的输入数据 *使用PKCS5中规定的标准填充进行链接。输入数据 *被填充到位。ilen值是之前的数据长度 *填充物。blksize参数是AES使用16的块大小 CBC。 *函数在填充后返回新的ibuf长度。 * *注意:ibuf必须足够大,以容纳至少blksize附加容量 *字节的数据以适应填充。 */ 无符号整型 PadData unsigned char*ibuf,unsigned int-ilen,int-blksize { 无符号int i;//循环计数器 无符号字符填充;//已计算填充字符 unsigned char*p;//指向数据结尾的指针 //ifilen%blksize==0 //回肠; //计算填充字符 pad=无符号字符blksize-ilen%blksize; //将pad追加到字符串的末尾 p=ibuf+ilen; 对于i=0;i
gcc aescodefile -o aes -lcrypto -lssl -ldl    #this is to to complile code
./aes filetobeencrypted.txt    encryptedfile  #execute file

openssl enc -aes-128-cbc -d -in filetobeencrypted.txt -out aes-decrypted.c  -p -nosalt -K 30313233343536373839616263646566 -iv 52616e646f6d495652616e646f6d4956
这段代码在解密后提供了一些介于两者之间的垃圾值。我无法增加缓冲区大小。
请建议可以做些什么来纠正这个问题。

问题是C代码对每个256字节的缓冲区进行填充。相反,它应该在不填充256字节块的情况下进行加密。然后,它应该填充最后一块纯文本并对其进行加密,即使它是一个完整的块大小或0字节。

也许不是您想要的答案,但是为什么不使用web上几十个经过良好测试的AES-128-CBC实现中的一个呢?不能使用这种技术吗?一方面我只想加密。。。另一方面,我希望实现std解密方法……这不是问题所在。问题是我知道加密的东西通常很难调试和验证,例如,在一些项目中,我们实际上运行了数百个测试,其中输入和输出都是预编码的,并且必须匹配才能通过。我认为,对于流行的技术来说,代码可以在许可证下使用,允许您在代码编程中合法地使用它,这是不合理的。但这是我的观点,这就是为什么我开始的时候可能不是你想要的答案:-问题是代码工作得很好…但是在每指定256字节之后,16字节的垃圾被解密。。。。这应该是理论上的。。。