Как DES oracle Расшифровать эквивалент в c# - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть эта функция на 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.'

также я пробовал другой ключ и чип-текст, и он возвращает неверные данные.

Я считаю, что это как-то связано с форматом данных, так как это ошибка возврата на c#, есть предложения?

1 Ответ

0 голосов
/ 17 апреля 2020

Что плохого в том, что ваш ввод зашифрованного текста в C# является строкой. Зашифрованный текст (ваш chipertext, тьфу) является двоичным (или «RAW» в Oracle говорят). Не должно быть преобразования UTF-8 в / из зашифрованного текста, потому что это может привести к отсутствию данных.

Возможно, вам придется использовать первые 7 или 8 байтов ключа в кодировке UTF-8 для DES , Юк.

...