【问题标题】:padding with PKCS7 [C]使用 PKCS7 [C] 填充
【发布时间】:2013-06-05 16:33:02
【问题描述】:

我想用 PKCS7 做填充:

char *test1 = "azertyuiopqsdfgh";
char *test2 = malloc(32*sizeof(char));

memcpy(test2, test1, strlen(test1));

char pad = (char)(32-strlen(test1));
printf("pad = %d\n", pad);

for(int i = strlen(test1) ; i < 32 ; i++) {
    test2[i] = pad;
}
for (int i = 0 ; i < 32 ; i++)
    printf("%x ", test2[i]);
printf("\n");

我得到:

pad = 16

61 7a 65 72 74 79 75 69 6f 70 71 73 64 66 67 68 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

但我想要:

pad = 16

61 7a 65 72 74 79 75 69 6f 70 71 73 64 66 67 68 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16

如何修改我的代码?

提前致谢。

【问题讨论】:

    标签: c padding pkcs#7


    【解决方案1】:

    printf("%x ", test2[i]);
    

    您使用十六进制 (%x) 打印,而使用

    printf("pad = %d\n", pad);` you are printing in decimal (%d). 
    

    (decimal) 16 => (hexa) 10,所以你显示的是正确的。

    您可能会在打印上稍作调整以显示 16 而不是 10,但我认为这不是您要搜索的内容。

    【讨论】:

    • 谢谢。所以,对于 PKCS7,我必须用十进制值 16(= 10(十六进制))而不是十六进制值 16(=22(十进制))来完成,对吧?
    • @user1517752 是的,完全正确。 pad 的值必须代表填充的长度(无论您使用哪个基数)。对我来说,你做得对!
    • @user1517752 在加密环境中使用 strlen 时要小心
    • 密码学经常使用 char 数组来表示整数。因此,如果您的加密数据中有一个 0(在 ascii 中是 \0),它将被 strlen 解释为字符串的结尾。出于同样的原因,打印(“%s”,加密数据)是不安全的。但这只是一般建议,如果我没记错的话 pkcs7 填充在加密之前进入。
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2011-05-29
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多