将Oracle PL/SQL代码转换为c#
本文关键字:转换 代码 SQL Oracle PL | 更新日期: 2023-09-27 18:11:23
有人能指导我如何将以下Oracle PL/SQL代码转换为c#,请?
declare
l_encrypted raw (100);
p_key raw (100);
p_plain raw(100);
l_mode number;
begin
l_mode := dbms_crypto.ENCRYPT_DES + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;
p_key := 'A217B5BEF1477D1A';
p_plain := '07253075';
l_encrypted := dbms_crypto.encrypt(UTL_I18N.STRING_TO_RAW(p_plain, 'AL32UTF8'), l_mode, p_key);
dbms_output.put_line(l_encrypted);
--outputs this value: E4624E16DB69451A14BE265CDCC5B0AB
end;
我的c#代码是:
byte[] value = Encoding.UTF8.GetBytes("07253075");
byte[] key = Encoding.UTF8.GetBytes("A217B5BEF1477D1A");
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider
{
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7,
};
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(key, key), CryptoStreamMode.Write);
cryptoStream.Write(value, 0, value.Length);
cryptoStream.Close();
Byte[] encrypted = memoryStream.ToArray();
MessageBox.Show(string.Join(string.Empty, Array.ConvertAll(encrypted, b => b.ToString("X2"))));
但是,它抛出CryptographicException,抱怨密钥大小。我搜索了互联网,发现DES的密钥大小是8字节,但是Oracle如何加密我的文本?我怎么能改变我的代码,以获得相同的输出作为Oracle?
DES传统上接受64位密钥,其中只有56位用于加密消息。您可以尝试将DESCryptoServiceProvider的KeySize属性设置为128,看看效果如何。
您确定使用了整个密钥吗?此操作的文档说明:
ENCRYPT_DES数据加密标准。块密码。使用56位的密钥长度
我假设只使用密钥的前56位(前7个字符)。您可以尝试在oracle中运行前7个字符的加密方法,看看与所有16个字符相比,输出是否相同。
如果是这种情况,你真的想要/需要使用128位密钥,你应该移动到三重des或AES。