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

如何在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#结果不一致,用以下语句验证参数对齐:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:39:20