powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / аналог в C#
9 сообщений из 9, страница 1 из 1
аналог в C#
    #39589367
endrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Имеется в Oracle
passwHash := dbms_crypto.encrypt(src => passwRaw, typ => TDES_ECB_NONE, key => passwKeyRaw);

(где

passwHash raw(1024);

TDES_ECB_NONE constant pls_integer := dbms_crypto.ENCRYPT_3DES_2KEY + dbms_crypto.CHAIN_ECB + dbms_crypto.PAD_NONE;

passwStr := rpad(substr(Upper('testpassw'), 1,8), 8, chr(32));
passwKeyStr := rpad(substr(Upper('testpassw'), 1,16), 16, chr(32));
passwRaw := utl_raw.cast_to_raw(passwordStr);
passwKeyRaw := utl_raw.cast_to_raw(passwordKeyStr);

)

как будет аналог этого фрагмента в C# ?
...
Рейтинг: 0 / 0
аналог в C#
    #39589401
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сишапристы не тут обитают. Гугли по словам "c# 3des encryption".
...
Рейтинг: 0 / 0
аналог в C#
    #39591603
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тот еще "шарпист", но знаю одну великую тайну. В продуктах оракла 100% используется Bouncy Castle, а у него есть реализация и конкретно под .net:

http://www.bouncycastle.org/csharp/

Посмотрел разъяснение CryptoApi в PB и Oracle dbms_crypto , экзодату мне в жены - всё понятно.

С приведением размеров до крантых 8 и без меня разберетесь, раз PAD_NONE, суть:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace function EncryptPassword(str varchar2, key varchar2) return varchar2 is
  TDES_ECB_NONE constant pls_integer := dbms_crypto.ENCRYPT_3DES_2KEY + dbms_crypto.CHAIN_ECB + dbms_crypto.PAD_NONE;
  strRaw raw(4000);
  keyRaw raw(128);
  resHash raw(4000);
begin
  strRaw := utl_raw.cast_to_raw(str);
  keyRaw := utl_raw.cast_to_raw(key);
  resHash := dbms_crypto.encrypt(src => strRaw, typ => TDES_ECB_NONE, key => keyRaw);
  return rawtohex(resHash);
end EncryptPassword;



Проверяю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select EncryptPassword
  2    (
  3      str => 'Строка для шифрования',
  4      key => '1234567890123456'
  5    ) as result from dual
  6  /
 
RESULT
--------------------------------------------------------------------------------
F5BB43E90FAE591A652756CA5F5EDC54F5C96458512FFEF635A2D044647F1BB832BC325FCD2BE7D2

Теперь в студии:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
using System;
using System.Text;

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

namespace ConsoleApplication1
{
    class Program
    {
        public static string ByteArrayToString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
                hex.AppendFormat("{0:X2}", b);
            return hex.ToString();
        }

        static void Main(string[] args)
        {
            var key = "1234567890123456"; 
            var str = "Строка для шифрования";
            var algo = CipherUtilities.GetCipher("DESede/ECB/NoPadding");
            algo.Init(true, new KeyParameter(Encoding.UTF8.GetBytes(key)));
            byte[] output = algo.DoFinal(Encoding.UTF8.GetBytes(str));
            Console.WriteLine(ByteArrayToString(output));
        }
    }
}



Проверяю:
Код: plaintext
F5BB43E90FAE591A652756CA5F5EDC54F5C96458512FFEF635A2D044647F1BB832BC325FCD2BE7D2

Вроде попадаю, но это не точно))
...
Рейтинг: 0 / 0
аналог в C#
    #39591616
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альтзнаю одну великую тайну
Я тоже одну тайну знаю.
"Кодировка БД" называется.
на C#, вероятно, следует приводить строку к кодировке БД.
...
Рейтинг: 0 / 0
аналог в C#
    #39591634
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АльтЯ тот еще "шарпист", но знаю одну великую тайну. В продуктах оракла 100% используется Bouncy CastleЕсли верить доке по Bouncy Castle, то там есть асимметричное шифрование. А где документированное асимметричное шифрование в оракле?
Тут заявлено, что либы должны работать на JDK 1.5 - JDK 1.8, а по факту при загрузке в базу обнаруживается, что есть зависимости на классы, которые появились только в JDK 1.7 (у меня 1.6).
Создание синонимов как-то обходит эту проблему:
Код: plsql
1.
2.
create or replace synonym "javax/net/ssl/ExtendedSSLSession" for "com/sun/net/ssl/internal/ssl/ExtendedSSLSession";
create or replace synonym "javax/net/ssl/X509ExtendedTrustManager" for "com/sun/net/ssl/internal/ssl/X509ExtendedTrustManager";

но, неприятный осадок остается. Плюс нужные какие-то пермишны для регистрации провайдеров в рантайме и прочее. Короче плюнул. Пока заюзал RSA-шифрование из "стандартного набора".
...
Рейтинг: 0 / 0
аналог в C#
    #39591823
Мутаген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
endrixpasswHash := dbms_crypto.encrypt(src => passwRaw, typ => TDES_ECB_NONE, key => passwKeyRaw);
TDES_ECB_NONE constant pls_integer := dbms_crypto.ENCRYPT_3DES_2KEY + dbms_crypto.CHAIN_ECB + dbms_crypto.PAD_NONE;


так программировать вообще нельзя . ECB тотально небезопасен, это даже в википедии описано: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_(ECB). DES давно забанен, а все вместе это выдает голый ключ в шифротекст.

Перенос на новый язык - cамый повод переделать это на нормальную реализацию шифрования, c AES на CFB/OFB и получением ключа шифрования из пароля по какой-нибудь PBKDF.
...
Рейтинг: 0 / 0
аналог в C#
    #39594209
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   procedure EncryptString
     (vSource                       in  varchar2,                    -- Входная строка
      vResultCrypt                  out varchar2)                    -- Зашифрованная строка
   is
   begin
      vResultCrypt := utl_raw.cast_to_varchar2(
        utl_encode.base64_encode(
           DBMS_CRYPTO.ENCRYPT
              (
                 UTL_RAW.CAST_TO_RAW(CONVERT(vSource,'AL32UTF8')),
                 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
                 KEY_RAW
              )));
   end;


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
    public static class Cryptograph
    {
        #region Encrypt

        public static byte[] Encrypt(byte[] data, string password)
        {
            return Encrypt(data, new PasswordDeriveBytes(password, null).GetBytes(32));
        }

        public static byte[] Encrypt(byte[] data, byte[] key)
        {
            switch (key.Length)
            {
                case 16:
                case 24:
                case 32: break;
                default:
                    throw new ArgumentException("Key must be 16, 24 or 32 bytes in length");
            }

            using (SymmetricAlgorithm algorithm = Rijndael.Create())
            using (ICryptoTransform encryptor = algorithm.CreateEncryptor(key, new byte[16]))
            using (MemoryStream m = new MemoryStream())
            using (CryptoStream c = new CryptoStream(m, encryptor, CryptoStreamMode.Write))
            {
                c.Write(data, 0, data.Length);
                c.FlushFinalBlock();

                return m.ToArray();
            }
        }

        public static string Encrypt(string data, string password)
        {
            return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(data), password));
        }

        public static string Encrypt(string data, byte[] key)
        {
            return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(data), key));
        }

        #endregion

        #region Decrypt

        static public byte[] Decrypt(byte[] data, string password)
        {
            return Decrypt(data, new PasswordDeriveBytes(password, null).GetBytes(32));
        }

        public static byte[] Decrypt(byte[] data, byte[] key)
        {
            switch (key.Length)
            {
                case 16:
                case 24:
                case 32: break;
                default:
                    throw new ArgumentException("Key must be 16, 24 or 32 bytes in length");
            }

            using (SymmetricAlgorithm algorithm = Rijndael.Create())
            using (ICryptoTransform decryptor = algorithm.CreateDecryptor(key, new byte[16]))
            using (MemoryStream m = new MemoryStream(data))
            using (CryptoStream s = new CryptoStream(m, decryptor, CryptoStreamMode.Read))
            using (BinaryReader r = new BinaryReader(s))
                return r.ReadBytes((int) r.BaseStream.Length);
        }

        public static string DecryptToString(byte[] data, byte[] key)
        {
            switch (key.Length)
            {
                case 16:
                case 24:
                case 32: break;
                default:
                    throw new ArgumentException("Key must be 16, 24 or 32 bytes in length");
            }

            using (SymmetricAlgorithm algorithm = Rijndael.Create())
            using (ICryptoTransform decryptor = algorithm.CreateDecryptor(key, new byte[16]))
            using (MemoryStream m = new MemoryStream(data))
            using (CryptoStream s = new CryptoStream(m, decryptor, CryptoStreamMode.Read))
            using (StreamReader r = new StreamReader(s))
                return r.ReadToEnd();
        }

        public static string DecryptToString(string data, string password)
        {
            return DecryptToString(Convert.FromBase64String(data), new PasswordDeriveBytes(password, null).GetBytes(32));
        }

        public static string DecryptToString(string data, byte[] key)
        {
            return DecryptToString(Convert.FromBase64String(data), key);
        }

        #endregion
    }
...
Рейтинг: 0 / 0
аналог в C#
    #39594222
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabas
Код: plsql
1.
UTL_RAW.CAST_TO_RAW(CONVERT(vSource,'AL32UTF8')),

utl_i18n.string_to_raw.
...
Рейтинг: 0 / 0
аналог в C#
    #39594229
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadbarrabas
Код: plsql
1.
UTL_RAW.CAST_TO_RAW(CONVERT(vSource,'AL32UTF8')),

utl_i18n.string_to_raw.
ок.
поправлю
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / аналог в C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]