C++-openssl-aes-cbc-pkcs5

PKCS#5填充是PKCS#7填充的一个子集,在PKCS#7填充时BlockSize为8的时候,PKCS#5与PKCS#7填充是一样的,在BlockSize不同时PKCS#5与PKCS#7填充是不同的。

PKCS#5填充是将数据填充到8的倍数,

填充后数据长度的计算公式:

定于元数据长度为x,

填充后的长度是 x + (8 - (x % 8)),

填充的数据是 8 - (x % 8)

示例:

1byte

数据数 0x41

填充前:0x41

填充后:0x410x070x070x070x070x070x070x07

2byte

数据数 0x41

填充前:0x410x41

填充后:0x410x410x060x060x060x060x060x06

3byte

数据数 0x41

填充前:0x410x410x41

填充后:0x410x410x410x050x050x050x050x05

4byte

数据数 0x41

填充前:0x410x410x410x41

填充后:0x410x410x410x410x040x040x040x04

5byte

数据数 0x41

填充前:0x410x410x410x410x41

填充后:0x410x410x410x410x410x030x030x03

6byte

数据数 0x41

填充前:0x410x410x410x410x410x41

填充后:0x410x410x410x410x410x410x020x02

7byte

数据数 0x41

填充前:0x410x410x410x410x410x410x41

填充后:0x410x410x410x410x410x410x410x01

8byte

数据数 0x41

填充前:0x410x410x410x410x410x410x410x41

填充后:0x410x410x410x410x410x410x410x410x080x080x080x080x080x080x080x08

以下是c++代码

cpp 复制代码
unsigned char* test_pkcs5padding(unsigned char* in,  int m_BlockSize)
{
    int inlen = strlen((char*)in);            //1.获取输入长度
    int outlen = inlen + (8 - (inlen % 8));   //2.计算输出长度
    unsigned char* out = new unsigned char[outlen];          //3.创建输出buf
    memcpy(out, in, inlen);                   //4.out 
    for (int i = inlen; i < outlen; i++)      //5.填充out 中剩余的位数
    {
        int paddingval = (outlen - (inlen % 8));
        out[i] = paddingval;
    }
    return out;
}
cpp 复制代码
     test_main()
{

    int m_BlockSize = 8;
    unsigned char in[]="A";
    unsigned char *out=NULL;
    out=test_pkcs5padding(in, 8);
    unsigned char in2[] ="AA";
    out=test_pkcs5padding(in2,8);
    unsigned char in3[] = "AAA";
    out = test_pkcs5padding(in3,8);
    unsigned char in8[] = "AAAAAAAA";
    out = test_pkcs5padding(in8, 8);
    
}
cpp 复制代码
public byte[] pkcs5_padding(byte[] source) {
        int sourceLength = source.length;
        int paddingLength = sourceLength  + (8- (sourceLength % 8));
        byte[] paddingResult = new byte[paddingLength];
        System.arrayCopy(source, 0, paddingResult, 0, sourceLength);
        for (int i = sourceLength; i < paddingLength; i++) {
            paddingResult[i] = (byte)(paddingLength - (sourceLength % 8);
        }
        return paddingResult;
    }
相关推荐
小白学大数据7 分钟前
Python 小工具实战:用问财接口搭建金融数据采集器
开发语言·人工智能·python
泡海椒9 分钟前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
j7~10 分钟前
【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路
linux·c++·网络编程·tcp·报文分割·网络计算器·协议落地
青少儿编程课堂20 分钟前
多源最短路与最小环(Floyd 算法图论解析)
c++·python·算法·bfs·信息学竞赛
6Hzlia28 分钟前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode
Severus_black36 分钟前
【C++初阶】模板初阶——为何C++能和C语言拉开差距?
c++
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】LLM会话管理模块设计
网络·c++·人工智能·学习·大模型
小此方3 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
wuyk5553 小时前
Python实战项目02:学生成绩管理系统(控制台|CSV导出|完整落地)
开发语言·python
浪子明X10 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言