如何在PostgreSQL中解密C#生成的TripleDES加密数据?
解决PostgreSQL中解密C# TripleDES加密数据的问题
核心匹配逻辑
要让pgcrypto和C#的加密逻辑完全对齐,必须明确每一处参数的对应关系:
- 算法:C#实际使用TripleDES,pgcrypto中对应标识为
des-ede - 模式:ECB(需显式指定,避免pgcrypto默认参数歧义)
- 填充:PKCS7,pgcrypto中通过
pad:pkcs7参数指定 - 密钥处理:C#会将16字节的MD5哈希密钥自动扩展为24字节(重复最后8字节),pgcrypto需要手动完成这个扩展,否则密钥不匹配
具体解密操作步骤
假设你的密钥字符串为your_key_string,加密后的Base64串为+hib+YR+/a0JuUhVm0TiJQ==,按以下流程执行:
1. 生成符合要求的TripleDES密钥
先对密钥字符串做MD5哈希,再扩展为24字节的TripleDES标准密钥:
WITH key_data AS ( SELECT md5('your_key_string')::bytea AS md5_key ) SELECT md5_key || substring(md5_key from 1 for 8) AS triple_des_key FROM key_data;
2. 执行解密并转换为文本
使用pgcrypto的decrypt函数,先将Base64串转成bytea,再指定完整的算法模式,最后转换为对应编码的文本:
WITH key_data AS ( SELECT (md5('your_key_string')::bytea || substring(md5('your_key_string')::bytea from 1 for 8)) AS triple_des_key ) SELECT convert_from( decrypt( decode('+hib+YR+/a0JuUhVm0TiJQ==', 'base64'), triple_des_key, 'des-ede-ecb/pad:pkcs7' ), 'utf8' -- 若C#加密前用Unicode编码,此处改为'utf16' ) AS decrypted_text FROM key_data;
常见问题排查
- UTF8编码错误:出现此问题通常是因为解密后的字节序列无法被解析为UTF8,需检查两点:
- 确认C#加密前原字符串的编码,若为Unicode则修改
convert_from的编码参数为'utf16' - 验证密钥是否正确扩展,密钥不匹配会导致解密出乱码字节,无法转成合法UTF8
- 确认C#加密前原字符串的编码,若为Unicode则修改
- 加密结果不匹配:测试加密时若和C#结果不一致,用以下语句验证参数对齐:
WITH key_data AS ( SELECT (md5('your_key_string')::bytea || substring(md5('your_key_string')::bytea from 1 for 8)) AS triple_des_key ) SELECT encode( encrypt( convert_to('your_plain_text', 'utf8'), triple_des_key, 'des-ede-ecb/pad:pkcs7' ), 'base64' ) AS encrypted_base64 FROM key_data;
内容的提问来源于stack exchange,提问作者Andrew Paes
相关产品推荐
相关产品推荐

