对接外部合作方,用到了3des ecb 加密,其中的补全方式为 PKCS5Padding。具体的算法原理可以网上找,网上很多,但是代码的坑比较多。
直接上实现后的代码了:
int Des3EdsEncrypt(const std::string& rand_key, const std::string& in, std::string& out)
{
char out_array[10240];
char in_array[10240];
memset(out_array, 0, 10240);
memset(in_array, 0, 10240);
DES_key_schedule keyschedc1;
DES_key_schedule keyschedc2;
DES_key_schedule keyschedc3;
if (rand_key.size() < 24)
{
LOG_ERROR("rand_key size < 24");
return -1;
}
DES_set_key((DES_cblock *)rand_key.substr(0,8).c_str(), &keyschedc1);
DES_set_key((DES_cblock *)rand_key.substr(8,8).c_str(), &keyschedc2);
DES_set_key((DES_cblock *)rand_key.substr(16,8).c_str(), &keyschedc3);
//数据不足8位的时候后面需要补齐 如果是取余为0,则补8个0
int data_rest = in.size()%8;
char ch = 8-data_rest;
int len = (in.size()/8 + 1)*8;
for (int i=0; i<in.size(); ++i)in_array[i] = in.at(i);
memset(in_array + in.size(), ch, 8 - data_rest);
for (int i=0; i<len; i += 8)
{
DES_ecb3_encrypt((DES_cblock *)(in_array + i),
(DES_cblock *)(out_array + i),
&keyschedc1, &keyschedc2,
&keyschedc3, DES_ENCRYPT);
}
out.assign(out_array, len);
return 0;
}