代码拉取完成,页面将自动刷新
#include "crypt.h"
#include <cstring>
#include <openssl/des.h>
#include <iostream>
//获取需要填充的数据大小字节数
int Crypt::getPadding(int datasize){
const int block_size = sizeof(const_DES_cblock);
int padding = block_size - datasize % block_size;
if(padding == 0) padding = block_size;
return padding;
}
///初始化密钥, DES加密算法 密钥最多8位 多余丢弃不足补零
bool Crypt::Init(std::string password){
const_DES_cblock key = {0}; //不足补0
int key_size = password.size();
if(key_size > sizeof(key)) //多余丢弃
{
key_size = sizeof(key);
}
std::memcpy(key,password.c_str(),key_size);
DES_set_key(&key,&key_sch_);
return true;
}
int Crypt::Encrypt(const char* in_data,int in_size, char* out_data, bool is_end){
if(!in_data || in_size<=0 || !out_data){
return 0;
}
int write_size = 0;
const_DES_cblock in = {0}; //输入数据
DES_cblock out = {0}; //输出
const int block_size = sizeof(const_DES_cblock);
int data_size = 0;
int padding = block_size - in_size % block_size;
for(int i = 0; i < in_size; i += block_size){
if(in_size - i < block_size){
data_size = in_size - i;
}
else{
data_size = block_size;
}
//复制数据源
memcpy(in,in_data+write_size,data_size); //把in_data的数据copy到in
//填充 补充的数据大小 @@@@@@@1 @@@55555 @@@@@@@@88888888
if(is_end && i + block_size >= in_size) //处理最后一块数据
{
//@@@@@@@@88888888
if(padding == block_size){
DES_ecb_encrypt(&in,&out,&key_sch_,DES_ENCRYPT); //把in加密到out
memcpy(out_data+write_size,&out,block_size);
write_size += block_size;
memset(in, padding, sizeof(in)); //填充8
}
else{//@@@@@@@1 @@@55555
memset(in + in_size % block_size, padding, padding);
}
}
//加密数据
DES_ecb_encrypt(&in,&out,&key_sch_,DES_ENCRYPT); //把in加密到out
memcpy(out_data+write_size,&out,block_size);
write_size += block_size;
}
return write_size;
}
int Crypt::Decrypt(const char* in_data,int in_size, char* out_data, bool is_end ){
if(!in_data || in_size<=0 || !out_data){
return 0;
}
int write_size = 0;
const_DES_cblock in = {0}; //输入数据
DES_cblock out = {0}; //输出
const int block_size = sizeof(const_DES_cblock);
int data_size = 0;
for(int i = 0; i < in_size; i+=block_size){
std::memcpy(in,in_data+write_size,block_size);
data_size = block_size;
//解密
DES_ecb_encrypt(&in, &out, &key_sch_, DES_DECRYPT);
//处理结尾填充 @@@55555 @@@@@@@@88888888
if(is_end && in_size - i <= block_size){
data_size = block_size - out[7];
if(data_size == 0){
break;
}
else if(data_size < 0){
std::cerr<<"Decrypt failed! padding size error!"<<std::endl;
break;
}
}
std::memcpy(out_data + write_size, &out, data_size);
write_size += data_size;
}
return write_size;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。