为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8
【操作系统】:Linux
【CPU】:Intel
【问题描述】*:
参照文档:密码机引擎接口
示例C实现代码:
// 算法声明
typedef struct dm_alg_s {
ulint cipher_id;
byte *cipher_name;
byte type;
ulint blk_size;
ulint kh_size;
byte work_mode;
} dm_alg_t;
static const dm_alg_t dm_algs[] = {
{6002, (byte *)"SM4_KID_NOPAD", CYT_TYPE_SYM_STREAM_ENCRYPT, 16, 16, WORK_MODE_KID},
};
// 创建密钥
lint
cipher_get_key_id(ulint cipher_id, byte *key_id, ulint key_id_size, ulint *key_size)
{
*key_size = snprintf(key_id, key_id_size, "ID123456789012345678901234567890");
return DM_TRUE;
}
// 销毁密钥
lint
cipher_free_key_id(ulint cipher_id, byte *key_id, ulint key_id_size)
{
return DM_TRUE;
}
示例SQL语句:
create tablespace "TEST_ENC2" datafile '/dmdata/data/DAMENG/TEST_ENC2.DBF' size 200 autoextend
on maxsize 16777215 CACHE = NORMAL encrypt with SM4_KID_NOPAD
管理工具报错:
执行失败(语句1)
-2295: 第2 行附近出现错误:
生成密钥失败
我打印的完整日志:
2025-11-20 17:21:55.063042 [debug]: !!! crypto_get_name(): crypto_name=0x9b6eeb8, len=0x7ffe6307d5f8
2025-11-20 17:21:55.063090 [debug]: !!! crypto_get_type(): crypto_type=0(0x9b6eec0)
2025-11-20 17:21:55.063102 [debug]: !!! cipher_get_count(): NUM_SUPPORTED_ALGS=3
2025-11-20 17:21:55.063116 [debug]: !!! cipher_get_info_ex(): seqno=1, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063123 [debug]: seqno=1, cipher_id=6000, cipher_name=SM4_ECB_NOPAD, type=1, blk_size=16, kh_size=16, work_mode=32
2025-11-20 17:21:55.063136 [debug]: !!! cipher_get_para(): cipher_id=6000, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063143 [debug]: !!! cipher_get_para(): cipher_id=6000, para_id=1, value=0x7ffe6307d604
2025-11-20 17:21:55.063152 [debug]: !!! cipher_get_info_ex(): seqno=2, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063158 [debug]: seqno=2, cipher_id=6001, cipher_name=SM4_EXTKEY_NOPAD, type=1, blk_size=16, kh_size=16, work_mode=64
2025-11-20 17:21:55.063164 [debug]: !!! cipher_get_para(): cipher_id=6001, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063170 [debug]: !!! cipher_get_para(): cipher_id=6001, para_id=1, value=0x7ffe6307d604
2025-11-20 17:21:55.063179 [debug]: !!! cipher_get_info_ex(): seqno=3, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063185 [debug]: seqno=3, cipher_id=6002, cipher_name=SM4_KID_NOPAD, type=2, blk_size=16, kh_size=16, work_mode=67
2025-11-20 17:21:55.063191 [debug]: !!! cipher_get_para(): cipher_id=6002, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063197 [debug]: !!! cipher_get_para(): cipher_id=6002, para_id=1, value=0x7ffe6307d604
2025-11-20 17:23:24.436861 [debug]: !!! cipher_get_cipher_text_size(): inner_id=6002, encrypt_para=(nil), plain_text_size=16
2025-11-20 17:23:24.436996 [debug]: !!! cipher_get_cipher_text_size(): inner_id=6002, encrypt_para=(nil), plain_text_size=512
2025-11-20 17:23:24.437011 [debug]: !!! cipher_get_key_id(): cipher_id=6002, key_id=0x7ff45d8d4fd0, key_id_size=128, key_size=32(0x7ff45d8d4fcc)
2025-11-20 17:23:24.437025 [debug]: !!! cipher_free_key_id(): cipher_id=6002, key_id=0x7ff45d8d4fd0, key_id_size=32
[0x7ff45c8d2fd0:32]:
49:44:31:32:33:34:35:36:37:38:39:30:31:32:33:34:35:36:37:38:39:30:31:32:33:34:35:36:37:38:39:30 ID123456789012345678901234567890
描述:
cipher_get_key_id后就cipher_free_key_id了,free能看到我传入的key_id,实现get函数时,无论我返回false(0)、true(1)、甚至我返回key_id长度,数据库都报这个错问题:

问题已解决,
cipher_get_key_id返回的key_size长度,必须与cipher_get_info_ex返回的kh_size长度保持一致,WORK_MODE_KID模式时是key_id长度,不是算法的key长度