【发布时间】: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