【发布时间】: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