Oracle和.Net之间的互补性加密和解密功能。

问题描述 投票:0回答:1

我正在寻找在Oracle PLSQL中使用DBMS_CRYPTO加密字符串的代码,以及在.Net框架中匹配的解密代码。两者都需要使用相同的Key,IV和padding模式(必要时)。我不是很懂加密算法,但如果有人能提供双方的准确代码,我将非常感激......谢谢!我的同事正在使用以下代码。

我的同事是用下面的代码来加密一个文本 "Test1234",其结果是。54AA98D8DE586F346E54B179AB71C6D7。

G_CHARACTER_SET VARCHAR2(10) := 'AL32UTF8';

G_STRING VARCHAR2(32) := '12345678901234567890123456789012';

G_KEY RAW(250) := utl_i18n.string_to_raw
                  ( data => G_STRING,
                    dst_charset => G_CHARACTER_SET );

G_ENCRYPTION_TYPE PLS_INTEGER := dbms_crypto.pad_zero
                                + dbms_crypto.encrypt_aes256 
                                + dbms_crypto.chain_cbc;


FUNCTION encryptSSN( p_ssn IN VARCHAR2 ) RETURN RAW
IS

l_ssn RAW(32) := UTL_I18N.STRING_TO_RAW( p_ssn, G_CHARACTER_SET );

l_encrypted RAW(32);

BEGIN

l_encrypted := dbms_crypto.encrypt
               ( src => l_ssn,
                 typ => G_ENCRYPTION_TYPE,
                 key => G_KEY );

RETURN l_encrypted;

END encrypt_ssn;

在我的.Net代码中,我试着把它作为一个补充函数,以同样的方式加密,但它给我一个完全不同的结果!我在寻找在Oracle PLSQL中使用DBMS_CRYPTO加密一个字符串的代码,以及它在.Net框架中匹配的解密代码。

public static string EncryptAES(string text)
    {
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
        aes.IV = Encoding.UTF8.GetBytes("0123456789ABCDEF"); // Oracle's Default IV
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.Zeros;

        // Convert string to byte array
        byte[] src = Encoding.UTF8.GetBytes(text);

        // encryption
        using (ICryptoTransform encrypt = aes.CreateEncryptor())
        {
            byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

            // Convert byte array to Base64 strings
            return Convert.ToBase64String(dest);
        }
    }
.net encryption plsql cryptography tripledes
1个回答
0
投票

根据Oracle的默认IV是NULL。https:/docs.oracle.comcdB28359_01appdev.111b28419d_crypto.htm#i1002112。

.NET不允许使用NULL IV,所以将模式改为ECB。

将你的代码修改为下面的内容,就会按照你的问题返回预期的值。

public static string EncryptAES(string text)
        {
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
            //aes.IV = Encoding.UTF8.GetBytes("0123456789ABCDEF"); - Remove
            aes.Mode = CipherMode.ECB; // Change mode to ECB
            aes.Padding = PaddingMode.Zeros;

            // Convert string to byte array
            byte[] src = Encoding.UTF8.GetBytes(text);

            // encryption
            using (ICryptoTransform encrypt = aes.CreateEncryptor())
            {
                byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

                StringBuilder hex = new StringBuilder(dest.Length * 2);
                foreach (byte b in dest)
                    hex.AppendFormat("{0:x2}", b);
                Console.WriteLine(hex);

                return hex.ToString() ;
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.