You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求兼容Linux dm-crypt aes-xts-plain64的轻量便携解密实现

兼容dm-crypt AES-XTS-PLAIN64的便携解密实现方案

轻量C库:tiny-AES-XTS

这是针对tiny-AES-c扩展的XTS模式实现,代码极简无外部依赖,内存占用极低,完全适配内存受限硬件场景。核心逻辑可直接实现你需要的aes_xts_plain64功能:

#include "aes.h"
#include "aes_xts.h"

// 实现与dm-crypt aes-xts-plain64兼容的解密逻辑
void aes_xts_plain64(uint8_t *buff, const uint8_t key[32], unsigned block_number) {
    aes_xts_ctx ctx;
    // XTS模式拆分密钥:前16字节为数据密钥,后16字节为tweak密钥
    aes_xts_init(&ctx, key, key + 16);
    
    // plain64规范生成tweak:将块号转为64位小端,填充为16字节
    uint8_t tweak[16] = {0};
    for (int i = 0; i < 8; i++) {
        tweak[i] = (block_number >> (i * 8)) & 0xFF;
    }
    
    // 解密单个128位块(多块数据可循环调用,每次处理16字节)
    aes_xts_decrypt(&ctx, buff, buff, 1, tweak);
}

该库代码可直接嵌入项目,无需编译动态库,内存占用仅数百字节,完全满足小数据量解密需求。

成熟便携C库:mbed TLS

mbed TLS(原PolarSSL)是经过安全审计的轻量加密库,支持AES-XTS,可通过编译选项裁剪功能以降低内存占用,适合嵌入式或资源受限环境:

#include "mbedtls/aes.h"
#include "mbedtls/xts.h"

void aes_xts_plain64(uint8_t *buff, const uint8_t key[32], unsigned block_number) {
    mbedtls_xts_context ctx;
    mbedtls_xts_init(&ctx);
    
    // 加载256位XTS密钥(拆分数据密钥与tweak密钥)
    mbedtls_xts_setkey_dec(&ctx, MBEDTLS_CIPHER_ID_AES, key, 256);
    
    // 生成plain64格式的tweak
    uint8_t tweak[16] = {0};
    for (int i = 0; i < 8; i++) {
        tweak[i] = (block_number >> (i * 8)) & 0xFF;
    }
    
    // 解密16字节数据块
    mbedtls_xts_crypt(&ctx, MBEDTLS_XTS_DECRYPT, 16, tweak, buff, buff);
    
    mbedtls_xts_free(&ctx);
}

优势在于稳定性与安全性,适合对可靠性有要求的场景。

非C语言方案:Python cryptography库

若环境支持Python,cryptography库提供了简洁的AES-XTS实现,无需手动处理底层细节,开发效率极高:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

def aes_xts_plain64(buff, key, block_number):
    # 拆分XTS密钥
    data_key = key[:16]
    tweak_key = key[16:]
    
    # 生成plain64规范的tweak:块号转64位小端,补全16字节
    tweak = block_number.to_bytes(8, byteorder='little') + b'\x00' * 8
    
    # 初始化解密器
    cipher = Cipher(algorithms.AESXTS(data_key, tweak_key), modes.XTS(tweak), backend=default_backend())
    decryptor = cipher.decryptor()
    
    # 返回解密后数据(buff需为16字节倍数,符合XTS块大小要求)
    return decryptor.update(buff) + decryptor.finalize()

适合快速验证或小数据量解密场景,无需关注内存管理细节。

关键注意事项

dm-crypt的aes-xts-plain64规范中,tweak由块序号(从0开始)转为64位小端值,高64位补0生成,上述所有实现均严格遵循该逻辑,确保与dm-crypt完全兼容。对于多块数据,只需循环处理每个16字节块并递增block_number即可。

内容的提问来源于stack exchange,提问作者ChewbaccaKL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:21:04