在C语言中将字符串拆分为块以用于密码项目时遇到问题

s8vozzvw  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(61)

我正在开发一个网络安全程序,需要将一串明文分割成一定大小的块。我目前的代码不起作用,但很接近。某些字母要么被跳过,要么块最终大于块大小。此外,出现了明文中没有表示的字符。但是我不确定这是怎么发生的。有没有人能帮我修复这个代码或者说明我哪里出错了?
纯文本示例:阿夫吉伊克尔姆诺普什图夫西扎
输出示例:

在下面的代码中,plaintext_len_no_pad是我想要拆分成大小为size的块的明文字符串,在本例中大小为2。

// Split plaintext into blocks size n
    int total_blocks = plaintext_len_no_pad / size;
    printf("DEBUG Total blocks: %d\n", total_blocks);
    char blocks[total_blocks][size + 1];
    int k = 0;
    for (int i = 0; i < total_blocks; i++)
    {
        for (int j = 0; j < size; j++)
        {
            blocks[i][j] = plaintext_no_pad[j + k];
        }
        blocks[i][k + 1] = '\0';
        k += size;
    }
    for (int i = 0; i < total_blocks; i++)
    {
        printf("DEBUG Block %d: %s\n", i, blocks[i]);
    }

我试过调整字符串结束符的位置,也试过用不同的方法来拆分字符串。这个方法有一个bug,我搞不清楚。我看过相关的帖子,但我没有找到一个有用的。

gojuced7

gojuced71#

blocks[i][k + 1] = '\0';

绝对不对。
外循环的第一次迭代将等价于blocks[i][1]。第二次迭代将等价于blocks[i][size + 1],这是越界的。然后它进一步越界。
你应该用

blocks[i][size] = '\0';

而不是。
如果plaintext_len_no_pad不能被size整除(即plaintext_len_no_pad % size != 0),也要小心。

相关问题