【问题标题】:How DES oracle Decrypt equivalent in c#DES oracle如何解密c#中的等价物
【发布时间】:2020-07-30 00:42:38
【问题描述】:

我在 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# 方法。
  • 您的代码存在一些问题。我认为它不会像这样编译。经过一些更正后,它可能会编译,但可能仍会产生运行时异常。您是否收到编译时错误? * 您不能在字符串上应用Encoding.UTF8.GetString()。您必须使用GetBytes * 您必须为 DES 提供大小为 64 位的密钥。鉴于您的示例字符串,这将不起作用。
  • 是的,只是更新,应该是GetBytes而不是GetString,
  • 这很可能是填充错误。您正在应用 PKCS7 填充,因此在解密时应该有填充字节。您输入的密文可能不是先前加密的结果(而是随机字符串?),因此很可能缺少填充字节。您应该尝试使用“真实”密文。或者,尝试另一种填充模式。

标签: c# oracle encryption des


【解决方案1】:

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

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

【讨论】:

  • 我也将该字符串转换为字节数组,这意味着字符串“BE”成为一个字节数据,但解密不可读,我尝试使用 DecryptDES("63509404D922F1D4CB2455314575E946", "02564808")
  • 这里是十六进制字符串 85FEE2B01AFA303838 的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多