Я ищу код, который шифрует строку в Oracle PL/SQL, используя DBMS_CRYPTO и соответствующий код дешифрования в .Net framework. Оба должны будут использовать один и тот же ключ, IV и режим заполнения (где это необходимо). Я не очень разбираюсь в алгоритмах криптографии, но если кто-то может предоставить точный код для обеих сторон, я был бы очень признателен... спасибо!
Мой коллега использует следующий код для шифрования текста "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 я попробовал это как дополнительную функцию для шифрования таким же образом, но это дает мне совершенно другой результат!
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);
}
}