C、OpenSSL 和 AES 256 CTR,然后是 mkfs
C, OpenSSL and AES 256 CTR, then mkfs
我在 ctr 模式下使用 OpenSSL 1.0.2(无法更新)和 AES-256(使用扇区号作为 IV)加密 XFS 文件系统。我一次只加密 512B 块。
起初我使用 EVP_aes_256_ecb()
ECB 模式进行测试,en/decrypt 工作正常。
使用相同的代码,我也将获得点击率 (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!
这不是很好。我的做法有问题吗?
虽然我还没有找到原因,但我的代码受到了启发:https://raw.githubusercontent.com/saju/misc/master/misc/openssl_aes.c 现在它正在运行。此 link 中的代码似乎与 OpenSSL 1.0.2 兼容。
我在 ctr 模式下使用 OpenSSL 1.0.2(无法更新)和 AES-256(使用扇区号作为 IV)加密 XFS 文件系统。我一次只加密 512B 块。
起初我使用 EVP_aes_256_ecb()
ECB 模式进行测试,en/decrypt 工作正常。
使用相同的代码,我也将获得点击率 (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!
这不是很好。我的做法有问题吗?
虽然我还没有找到原因,但我的代码受到了启发:https://raw.githubusercontent.com/saju/misc/master/misc/openssl_aes.c 现在它正在运行。此 link 中的代码似乎与 OpenSSL 1.0.2 兼容。