Encryption 如何使用内核加密API实现AES-GCM加密?

Encryption 如何使用内核加密API实现AES-GCM加密?,encryption,linux-kernel,cryptography,aes-gcm,Encryption,Linux Kernel,Cryptography,Aes Gcm,您好,我正在一个可堆叠的文件系统上工作,并试图在其上实现AES-GCM密码,以加密存储在底层文件系统中的数据。我在内核级处理AES的GCM模式时遇到了重大问题。然而,我成功地在CTR模式下实现了AES,其代码附在下面。有人能告诉我如何将其修改为AES-GCM的正确方向吗 我看了这个,但没什么帮助。 我在寻找两件事:1.)如何将身份验证标签与加密数据一起存储在写入的文件中;2.)如何通过发送到较低的文件系统和从较低的文件系统接收来处理AES-GCM的IV 谢谢 int decrypt_encryp

您好,我正在一个可堆叠的文件系统上工作,并试图在其上实现AES-GCM密码,以加密存储在底层文件系统中的数据。我在内核级处理AES的GCM模式时遇到了重大问题。然而,我成功地在CTR模式下实现了AES,其代码附在下面。有人能告诉我如何将其修改为AES-GCM的正确方向吗

我看了这个,但没什么帮助。 我在寻找两件事:1.)如何将身份验证标签与加密数据一起存储在写入的文件中;2.)如何通过发送到较低的文件系统和从较低的文件系统接收来处理AES-GCM的IV

谢谢

int decrypt_encrypt_page(struct page *src_page,
                     struct page *dst_page,
                     char *key,
                     int key_len,
                     int encrypt)
{
    int ret = 0;
    struct scatterlist src_sg, dst_sg;
    struct crypto_blkcipher *tfm;
    struct blkcipher_desc desc;

    sg_init_table(&src_sg, 1);
    sg_init_table(&dst_sg, 1);

    sg_set_page(&src_sg, src_page, PAGE_SIZE, 0);
    sg_set_page(&dst_sg, dst_page, PAGE_SIZE, 0);

    tfm = crypto_alloc_blkcipher(default_algo, 0, 0);

    if (IS_ERR(tfm)) {
        printk(KERN_ERR "failed to load transform for %s: %ld\n",
               default_algo,
               PTR_ERR(tfm));
        ret = IS_ERR(tfm);
        goto out;
    }
    desc.tfm = tfm;
    desc.flags = 0;

    ret = crypto_blkcipher_setkey(tfm, key, key_len);
    if (ret) {
        printk(KERN_ERR "setkey() failed flags=%x\n",
               crypto_blkcipher_get_flags(tfm));
        goto out;
    }
    if (encrypt)
        ret = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg, PAGE_SIZE);
    else
        ret = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg, PAGE_SIZE);
    if (ret)
        printk(KERN_INFO "Some error occured while encrypting.\n");

out:
    crypto_free_blkcipher(tfm);
    return ret;
}

你可能想研究一下这个线程:@askb我确实研究过,毕竟这是谷歌的第一个结果,但你看到我的问题不同,因为我必须在一个可堆叠的文件系统上实现它,那么在这种情况下,我如何处理IV和身份验证标签呢?如何将它们与加密数据一起存储,并在以后用于解密。在给定链接中,未处理该部分。应随机生成IV/SV。GCM身份验证标签可以明文存储,并且本身不包含任何敏感信息。请参考:@askb请看一下我当前的代码,我在这里加密内存页,因此使用该加密生成的加密标记肯定不能存储在同一页中,因为这会导致数据不一致,而且我知道IV可以随机生成,但这根本不是我的问题,我问的是如何保留/存储该IV,以便以后可以使用它来解密内存页,因为实现是针对文件系统的,解密时间可以是将来的任何时间我不熟悉wrapfs,但作为一个可堆叠的直通FS,您可能需要了解数据/块是如何映射到页面的。在大多数情况下,磁盘上的块是加密的,另外使用扩展属性等功能,在底层fs(ex:ext4)中存储每个页面的附加信息,如身份验证标签、HMAC等,如果您计划加密页面(在核心中),您的应用程序将如何读/写这些页面?