c# - 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# 中输入的密文是一个字符串。密文(你的chipertext
,呃)是二进制的(或 Oracle 中的“RAW”)。密文不应该进行 UTF-8 转换,因为这可能会导致数据丢失。
您可能必须为 DES 使用 UTF-8 编码密钥的前 7 或 8 个字节。玉。
推荐阅读
- perl - Pango:在梵文字符串中查找位置
- linux - 读取和删除名称中包含空格的文件
- reactjs - React.js - Redux Hooks 无效的 Hook 调用
- html - 为许多客户端项目配置 nginx
- c# - 在特定条件下更改 ListView 项的背景色
- autohotkey - 如何在非常简单的 AHK(AutoHotKeymacro?
- haskell - Pantry 快照解决了什么问题?
- javascript - MySql、NodeJS、ExpressJS 和 bcrypt:处理用户登录的最佳方式是什么?
- android - react-native-camera > takePictureAsync() 在 android 设备中抛出错误代码 E_CAMERA_BAD_VIEWTAG
- spring - 如何在 Spring 中设置全局上下文变量?