加密和解密的过程,步骤大致相同,首先用 key 字符串生成 key_sets,然后把原文按每 8 个字符为一组进行计算,最后拼接起来。
唯一的区别是在处理最后一组字符的时候,在加密的时候,如果最后一组不够 8 个,那么空余的数目作为 padding 值填到最后几个字符里。这样能保证最后一组字符长度足够。
if (block_count == number_of_blocks) {
padding = 8 - length % 8;
copyUChar(data_block, source, i, 8 - padding);
if (padding < 8) { // Fill empty data block bytes with padding
memset((data_block + 8 - padding), (unsigned char)padding, padding);
}
else if (padding == 8) { // Write an extra block for padding
copyUChar(data_block, source, i, 8);
}
}
那么在解密的时候,处理完最后一组数据,也要检查是否有 padding 补位。
if (block_count == number_of_blocks) {
copyUChar(data_block, source, i, 8);
process_message(data_block, processed_block, key_sets, DECRYPTION_MODE);
padding = processed_block[7];
if (padding < 8) {
memcpy(destination + i, &processed_block, (8-padding) * sizeof(char));
}
else
{
memcpy(destination + i, &processed_block, 8 * sizeof(char));
}
}
具体实现每一次 DES 计算的函数是:
void process_message(unsigned char* message_piece, unsigned char* processed_piece, key_set* key_sets, int mode);