1 Star 0 Fork 0

xiaqiu / 加解密学习

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
crypt.cpp 3.23 KB
一键复制 编辑 原始数据 按行查看 历史
xiaqiu 提交于 2024-05-05 13:46 . first commit
#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;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mrxiao_com/DES_study.git
git@gitee.com:mrxiao_com/DES_study.git
mrxiao_com
DES_study
加解密学习
main

搜索帮助

344bd9b3 5694891 D2dac590 5694891