基于SKF基础学习知识梳理
(一)对称密码算法
// 分组密码参数
typedef struct Struct_BLOCKCIPHERPARAM{
BYTE IV[MAX_IV_LEN]; // 初始向量,MAX_IV_LEN 为初始化向量的最大长度 (#define MAX_IV_LEN 32)
ULONG IVLen; // 初始向量实际长度(按字节计算)
ULONG PaddingType; // 填充方式,0 表示不填充,1 表示按照PKCS#5 方式进行填充
ULONG FeedBitLen; // 反馈值的位长度(按位计算)只针对 OFB、CFB 模式
} BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM;
1、PKCS填充方式
PKCS(Public Key Cryptography Standards),公钥加密标准,是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。其常见的填充方式有以下几种:(例如块大小为 8bytes,数据不足,需要填充)
(1)填充数据为填充字节的长度
这种填充方式中,填充的所有字节值都为需要填充字节的长度。
如:现有3bytes,块大小为8bytes,需要填充5bytes,即以5来填充
原数据:66 6F 72
填充后的数据:66 6F 72 05 05 05 05 05
(2)填充数据为0x80后加0x00
这种填充方式中,填充字符串的第一个字节数是0x80,后面的每个字节是0x00。
如:现有3bytes,块大小为8bytes,需要填充5bytes,则第一个为 80,后面的全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 80 00 00 00 00
(3)填充数据的最后一个字节为填充字节序列的长度
这种填充方式中,填充字符串的最后一个字节为填充字节的长度, 其它为0×00。
如:现有3bytes,块大小为8bytes,需要填充5bytes,则最后一个为 05,其他全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 00 00 00 00 05
(4)填充数据为0x00
这种填充方式中,填充的所有字节值都为0x00。
如:现有3bytes,块大小为8bytes,需要填充5bytes,则填充的全部为 00
原数据:66 6F 72
填充后的数据:66 6F 72 00 00 00 00 00
(5)填充数据为空格(0x20)
这种填充方式中,填充的所有字节值都为空格0x20。
如:现有3bytes,块大小为8bytes,需要填充5bytes,则填充的全部为 20
原数据:66 6F 72
填充后的数据:66 6F 72 20 20 20 20 20
2、PKCS填充分类
(1)PKCS5Padding(对称加密最常用)
将数据填充到8的倍数,填充数据计算公式是,如原数据长度为len,利用该方法填充后的长度是 len + (8 - (len % 8)), 填充的数据长度为 8 - (len % 8),块大小固定为8字节,填充方式为上面的填充数据为填充字节的长度。
(2)PKCS7Padding(对称加密最常用)
假设需要填充n (n>0) 个字节才对齐,填充n个字节,每个字节都是n ;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小;PKCS7填充字节的范围在 **1-255 **之间 ,填充方式为上面的 填充数据为填充字节的长度。
(3)PKCS1Padding(RSA加密最常用)
PKCS#1(v1.5)中规定,如果使用PKCS1Padding进行填充,当RSA的密钥长度是1024b,则原文数据最多117B。若原数据不满足长度要求,则需要在加密前进行填充,填充公式为:
EB = 00 || BT || PS || 00 || D :
EB :填充后的数据
D :原消息数据
BT:The block type 块类型,取值为 00 or 01 (私钥运算时),取值为 02 (公钥运算时)
PS:The padding string填充字符串,长度为 Len(EB) - 3 - Len(D),最少是 8字节。
BT=00,PS为00
BT=01,PS为FF
BT=02,PS为伪随机生成,非零