将 Oracle PL/SQL 代码转换为 C#

Posted

技术标签:

【中文标题】将 Oracle PL/SQL 代码转换为 C#【英文标题】:Convert Oracle PL/SQL code to C# 【发布时间】:2013-04-30 06:33:27 【问题描述】:

谁能指导我如何将以下 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 相同的输出?

【问题讨论】:

【参考方案1】:

DES 传统上接受 64 位密钥,其中只有 56 位用于加密消息。您可以尝试将 DESCryptoServiceProvider 的 KeySize 属性设置为 128,看看效果如何。

您确定使用了整个密钥吗? doco 表示:

ENCRYPT_DES 数据加密标准。分组密码。使用 56 位的密钥长度。

我假设只使用了密钥的前 56 位(前 7 个字符)。您可以尝试在 oracle 中使用前 7 个字符运行加密方法,看看输出与所有 16 个字符相比是否相同。

如果是这种情况并且您确实想要/需要使用 128 位密钥,您应该升级到三重 DES 或 AES。

【讨论】:

它不允许我用少于 15 个字符进行加密,抱怨密钥长度太短。我认为它是原始的,Oracle 将其转换为每字节 2 个字符的字节。 查看 this如果密钥长度丢失或小于 8 个字节,则程序会引发错误 ORA-28234 "Key长度太短了。”请注意,如果使用较大的键,则会忽略额外的字节。所以 9 字节的密钥不会产生异常。 还有,你在 oracle 中分配给 raw 的密钥字符串的编码是什么?

以上是关于将 Oracle PL/SQL 代码转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章

将存储过程 PL/SQL 转换为 Java

将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]

如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?

传递多个 oracle PL\SQL 块的 C# 得到“遇到符号 /”

如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?

从 Oracle PL/SQL 匿名块填充 C# 数据表