【问题标题】:C, OpenSSL and AES 256 CTR, then mkfsC、OpenSSL 和 AES 256 CTR,然后是 mkfs
【发布时间】:2020-09-26 20:15:32
【问题描述】:

我在 ctr 模式下使用 OpenSSL 1.0.2(无法更新)和 AES-256(使用扇区号作为 IV)加密 XFS 文件系统。我一次只加密 512B 块。

一开始我使用EVP_aes_256_ecb() ECB 模式进行测试和加密/解密工作正常

使用相同的代码,我也会选择 CTR (EVP_aes_256_ctr()):

encrypt(...) {

    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;
    if (!(ctx = EVP_CIPHER_CTX_new()))
        handleErrors();
    if (EVP_EncryptInit_ex(ctx, evp_cipher, NULL, key, iv) != 1)
        handleErrors();
    if (EVP_CIPHER_CTX_set_padding(ctx, 0) != 1)
        handleErrors();
    if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) != 1)
        handleErrors();
    ciphertext_len = len;
    if (EVP_EncryptFinal_ex(ctx, ciphertext + len, &len) != 1)
        handleErrors();
    ciphertext_len += len;
    if (tag && EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag) != 1)
        handleErrors();
    EVP_CIPHER_CTX_free(ctx);
    return ciphertext_len;
}

int decrypt(...) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len;
    if (!(ctx = EVP_CIPHER_CTX_new()))
        handleErrors();
    if (EVP_DecryptInit_ex(ctx, evp_cipher, NULL, key, iv) != 1)
        handleErrors();
    if (EVP_CIPHER_CTX_set_padding(ctx, 0) != 1)
        handleErrors();
    if (EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len) != 1)
        handleErrors();
    plaintext_len = len;
    if (tag && !EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tag))
        handleErrors();
    if (EVP_DecryptFinal_ex(ctx, plaintext + len, &len) != 1) {
        if (tag) {
            printf("Tag verify failed.\n");
            return 0;
        }
        handleErrors();
    }
    plaintext_len += len;
    EVP_CIPHER_CTX_free(ctx);
    return plaintext_len;
}

仅在mkfs.xfs 之后的这种情况下我得到:

specified blocksize 4096 is less than device physical sector size 4194304
switching to logical sector size 512
meta-data=/dev/sdb               isize=512    agcount=4, agsize=2097152 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=8388608, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=4096, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
bad magic number
bad magic number
Metadata corruption detected at xfs_sb block 0x0/0x200
libxfs_writebufr: write verifer failed on xfs_sb bno 0x0/0x200
releasing dirty buffer (bulk) to free list!

这不是很好。我的方法有什么问题吗?

【问题讨论】:

    标签: c linux encryption openssl aes


    【解决方案1】:

    虽然我还没有找到原因,但我的代码是受此启发的:https://raw.githubusercontent.com/saju/misc/master/misc/openssl_aes.c,它现在正在运行。此链接中的代码似乎与 OpenSSL 1.0.2 兼容。

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 2020-01-20
      • 2014-08-05
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多