首页 > 解决方案 > DES oracle如何解密c#中的等价物

问题描述

我在 oracle db 上有这个功能:

BEGIN
    key_raw := utl_i18n.string_to_raw(key,'AL32UTF8');
    plaintext := dbms_crypto.decrypt(
    src => chipertext,
    typ => dbms_crypto.DES_CBC_PKCS5,
    key => key_raw
    );
    return utl_i18n.raw_to_nchar(plaintext,'AL32UTF8');
END 

并且需要在 c# .Net 中实现

这就是我所做的:

public static string DecryptDES(string strData,string skey)
        {
            byte[] clearData = Encoding.UTF8.GetBytes(strData);
            byte[] key = Encoding.UTF8.GetBytes(skey);
            DES desDecrypt = new DESCryptoServiceProvider();
            desDecrypt.Mode = CipherMode.CBC;
            desDecrypt.Padding = PaddingMode.PKCS7;
            desDecrypt.Key = key;
            ICryptoTransform transForm = desDecrypt.CreateDecryptor();
            MemoryStream decryptedStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(decryptedStream, transForm, CryptoStreamMode.Write);
            cryptoStream.Write(clearData, 0, clearData.Length);
            cryptoStream.FlushFinalBlock();
            byte[] plain = decryptedStream.ToArray();
            return Encoding.UTF8.GetString(plain);
        }

在 oracle 中,该函数调用如下:

select decrypt('BEB9B507432B91E116EC3F07364E38C5', 'testtesttest') from dual;

当此方法在 C# 中调用时:

DecryptDES("BEB9B507432B91E116EC3F07364E38C5", "testtesttest")

这是返回错误:

System.ArgumentException: 'Specified key is not a valid size for this algorithm.'

我也尝试了另一个密钥和chipertext,它返回了错误的数据。

我相信这与数据格式有关,因为它在 c# 上返回错误,有什么建议吗?

标签: c#oracleencryptiondes

解决方案


问题是您在 C# 中输入的密文是一个字符串。密文(你的chipertext,呃)是二进制的(或 Oracle 中的“RAW”)。密文不应该进行 UTF-8 转换,因为这可能会导致数据丢失。

您可能必须为 DES 使用 UTF-8 编码密钥的前 7 或 8 个字节。玉。


推荐阅读