C 使用内核加密对数据进行加密的问题
我正在尝试使用内核加密执行AES加密。我已将代码粘贴到下面。代码为ECB生成正确的输出,但不为CBC生成正确的输出。两种模式之间的唯一区别(代码方面)是IV数据C 使用内核加密对数据进行加密的问题,c,linux,cryptography,kernel,aes,C,Linux,Cryptography,Kernel,Aes,我正在尝试使用内核加密执行AES加密。我已将代码粘贴到下面。代码为ECB生成正确的输出,但不为CBC生成正确的输出。两种模式之间的唯一区别(代码方面)是IV数据 void do_aes_encrypt(Parameters *params) { struct crypto_blkcipher *tfm = NULL; struct blkcipher_desc desc; struct scatterlist sgin, sgout;
void do_aes_encrypt(Parameters *params)
{
struct crypto_blkcipher *tfm = NULL;
struct blkcipher_desc desc;
struct scatterlist sgin, sgout;
unsigned char *pin, *pout;
int rv;
pin = (unsigned char*) get_zeroed_page(GFP_KERNEL);
pout = (unsigned char*) get_zeroed_page(GFP_KERNEL);
memcpy(pin, params->input, params->dataLength);
switch (params->mode) {
case MODE_ECB:
tfm = crypto_alloc_blkcipher("ecb(aes)", 0, 0); break;
case MODE_CBC:
tfm = crypto_alloc_blkcipher("cbc(aes)", 0, 0); break;
default:
return;
}
desc.tfm = tfm;
desc.flags = 0;
if (crypto_blkcipher_setkey(tfm, params->key, params->keyLength)) {
printk("Unable to set Key\n");
goto free_return;
}
if (params->mode == MODE_CBC) {
crypto_blkcipher_set_iv(tfm, params->iv, 16);
}
// Initialize the Scatterlists
sg_init_one(&sgin, pin, params->dataLength);
sg_init_one(&sgout, pout, params->dataLength);
rv = crypto_blkcipher_encrypt(&desc, &sgout, &sgin, params->dataLength);
}
我使用的内核版本是4.15.18
更新:日志粘贴在下面:
Mar 3 13:56:22 alg-kern kernel: [98671.587675] Mode : CBC
Mar 3 13:56:22 alg-kern kernel: [98671.588511] Key : [16]
Mar 3 13:56:22 alg-kern kernel: [98671.589263] INFO: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Mar 3 13:56:22 alg-kern kernel: [98671.590026] IV : [16]
Mar 3 13:56:22 alg-kern kernel: [98671.590791] INFO: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Mar 3 13:56:22 alg-kern kernel: [98671.591613] Input : [16]
Mar 3 13:56:22 alg-kern kernel: [98671.592480] INFO: F3 44 81 EC 3C C6 27 BA CD 5D C3 FB 08 F2 73 E6
Mar 3 13:56:22 alg-kern kernel: [98671.599025] DEBUG: Cleared switch statement
Mar 3 13:56:22 alg-kern kernel: [98671.599027] DEBUG: Cleared switch statement 2
Mar 3 13:56:22 alg-kern kernel: [98671.599925] BUG: unable to handle kernel NULL pointer dereference at 000000000000000e
这是我在/var/log/syslog中看到的。
我的密钥、IV和输入值显示在上面的日志中
我在代码中添加了一些调试语句,可以确认错误在“crypto_blkcipher_setkey”语句中。将打印此调用之前的调试语句,但不会打印该调用之后的调试语句
使用上述日志的调试语句编写代码(成功打印“Cleared switch statement 2”):
您如何确定代码是否正确?因为对于ECB,我得到了正确的结果。请描述您认为CBC结果不正确的原因。我没有问为什么ECB的结果是正确的。当我运行CBC时,测试失败,甚至没有生成输出。@MaartenBodewes:我用一些日志更新了这个问题。
LOG_DEBUG("Cleared switch statement");
if (!tfm) {
printk("Unable to alocate cipher\n");
return;
}
desc.tfm = tfm;
desc.flags = 0;
LOG_DEBUG("Cleared switch statement 2");
if (crypto_blkcipher_setkey(tfm, params->key, params->keyLength)) {
printk("Unable to set Key\n");
goto free_return;
}
LOG_DEBUG("Cleared crypto_blkcipher_setkey");