Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从密文中获取密文以用于openssl EVP_uuu_uu_u_u_u_u_u;in c程序_C_Linux_Openssl - Fatal编程技术网

如何从密文中获取密文以用于openssl EVP_uuu_uu_u_u_u_u_u;in c程序

如何从密文中获取密文以用于openssl EVP_uuu_uu_u_u_u_u_u;in c程序,c,linux,openssl,C,Linux,Openssl,为了从C程序中的openssl EVP中使用的密文中查找密文,我在bash中使用openssl创建了一个密文,以提供base64输出: echo -n "Hello"|openssl enc -aes-256-cbc -e -nosalt -K 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -iv 000102030405060708090A0B0C0D0E0F|base64 -w0 我发现一个用C解密的程

为了从C程序中的openssl EVP中使用的密文中查找
密文
,我在bash中使用openssl创建了一个密文,以提供base64输出:

echo -n "Hello"|openssl enc -aes-256-cbc -e -nosalt -K 
000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -iv 
000102030405060708090A0B0C0D0E0F|base64 -w0
我发现一个用C解密的程序适用于上面的bash命令,但如果我给出:

./evp_decrypt 0t3Z18pJqxIbbCFlnqDBIjMSFFvaOEoA7HFuRjQeExA0B1zCJoBhIzV5Qj3JU44qLcI+qbyLG/b2WJE2weKDynX6WJ/9OlujH6tTlITsbw4/hVpxZJnFFF6PfD5Hqyjct6YcLlmhtXYjZab9MsaPO+m/RJH+koe+FUdzxNJpjtWEgijaWQkpDLszsXTKgM+XXZloi6WQicItDRj02iQvXEAmGxejBbekWq0y1LX+SpQ=
#包括
#包括
#包括
#定义inbufsize512
#定义扩展大小(1024*1024)
char*base64encode(const void*b64\u encode\u this,int encode\u this\u许多字节){
BIO*b64_BIO,*mem_BIO;//声明了两个OpenSSL BIOs:一个base64过滤器和一个内存BIO。
BUF_MEM*MEM_bio_MEM_ptr;//指向保存base64数据的“memory bio”结构的指针。
b64_bio=bio_new(bio_f_base64());//初始化我们的base64过滤器bio。
mem_bio=bio_new(bio_s_mem());//初始化内存接收器bio。
BIO_push(b64_BIO,mem_BIO);//通过创建过滤器接收器BIO链链接BIOs。
BIO_set_flags(b64_BIO,BIO_flags_BASE64_NO_NL);//每64个或更少字符没有换行符。
BIO_write(b64_BIO,b64_encode_this,encode_this_许多字节);//记录base64编码的数据。
BIO_flush(b64_BIO);//刷新数据。由于填充字符,b64编码是必需的。
BIO_get_mem_ptr(mem_BIO,&mem_BIO_mem_ptr);//mem_BIO的内存结构的存储地址。
BIO_set_close(mem_BIO,BIO_NOCLOSE);//在BIOs销毁后允许访问mem_ptr。
BIO_free_all(b64_BIO);//销毁链中的所有BIOs,从b64开始(即第一个)。
BUF_MEM_grow(MEM_bio_MEM_ptr,(*MEM_bio_MEM_ptr).length+1);//为end null创建空间。
(*mem_bio_mem_ptr).data[(*mem_bio_mem_ptr).length]='\0';//将空终止符添加到尾部。
return(*mem_bio_mem_ptr).data;//返回base-64编码的数据。(请参阅:“buf_mem_st”结构)。
}
char*base64decode(const void*b64_decode_this,int decode_this_许多字节){
BIO*b64_BIO,*mem_BIO;//声明了两个OpenSSL BIOs:一个base64过滤器和一个内存BIO。
char*base64_decoded=calloc((decode_this_many_bytes*3)/4+1,sizeof(char));//+1=null。
b64_bio=bio_new(bio_f_base64());//初始化我们的base64过滤器bio。
mem_bio=bio_new(bio_s_mem());//初始化内存源bio。
BIO_write(mem_BIO,b64_decode_this,decode_this_许多字节);//Base64数据保存在源代码中。
BIO_push(b64_BIO,mem_BIO);//通过创建过滤器源BIO链链接BIOs。
BIO_set_标志(b64_BIO,BIO_标志_BASE64_NO_NL);//不需要尾随换行符。
int decoded_byte_index=0;//应该写入下一个base64_解码字节的索引。
而(0if((exputfsize-((bytesInBuf+cipherBlockSize-1)+outBytes))密文是任意位,您无法通过查看它来确定它的长度,您必须已经知道它的长度。特别是密文可以包含一个空字节,它终止一个C字符串,这将导致
strlen
返回太小的值。但是,您实际上从命令行wh传递了一个base64字符串ich是一个以null结尾的C字符串,因此
strlen()
给出了正确的长度,而对base64进行解码则给出了已知的数据量——解码函数中
decoded\u byte\u index
的最终值。由于您还想传回(alloc'ed)指针,因此需要处理两个值;要在C中执行此操作,您可以(1)使用函数通过其存储的指针参数;(2)设置一个由调用方读取的共享全局变量,但共享全局变量被广泛考虑