Миграция с .net на oracle 11g ⇐ C#
Миграция с .net на oracle 11g
Мне нужно перенести следующий процесс шифрования 3des из .net в oracle 11g
с использованием системы; использование System.Security.Cryptography; использование System.Text; используя System.Linq; Программа общественного класса { частная константная строка strKey = "H9p-S5m2Dh6Fe7Ls3-Qs1D2e4Z"; общественная статическая пустота Main() { вар strToEncrypt = "тест"; TripleDESCryptoServiceProvider objDESCrypto = новый TripleDESCryptoServiceProvider (); MD5CryptoServiceProvider objHashMD5 = новый MD5CryptoServiceProvider(); байт[] byteHash, byteBuff; byteHash = objHashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strKey)); Console.WriteLine("v_key net = "+BitConverter.ToString(byteHash).Replace("-","")); objHashMD5 = ноль; objDESCrypto.Key = byteHash; objDESCrypto.Mode = CipherMode.CBC; //CBC, CFB objDESCrypto.Padding = PaddingMode.Zeros; Console.WriteLine("iv net = "+BitConverter.ToString(stringToHex("0123456789ABCDEF")).Replace("-","")); objDESCrypto.IV = stringToHex("0123456789ABCDEF"); byteBuff = ASCIIEncoding.ASCII.GetBytes(strToEncrypt); Console.WriteLine("src net = "+BitConverter.ToString(byteBuff).Replace("-","")); var hashbyte = objDESCrypto.CreateEncryptor().TransformFinalBlock(byteBuff, 0, byteBuff.Length); Console.WriteLine("encrypted_str net = "+BitConverter.ToString(hashbyte).Replace("-","")); Console.WriteLine("encrypted_str64 net = " + Convert.ToBase64String(objDESCrypto.CreateEncryptor(). TransformFinalBlock(hashbyte, 0, hashbyte.Length))); var decrypted_str = ASCIIEncoding.ASCII.GetString (objDESCrypto.CreateDecryptor().TransformFinalBlock (хешбайт, 0, хешбайт.Длина)); Console.WriteLine("decrypted_str net = "+decrypted_str); строка hexString = "43480170"; } общественный статический байт [] stringToHex (строка hexString) { //uint num = uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier); //byte[] floatVals = BitConverter.GetBytes(num); // возвращаем floatVals; return Enumerable.Range(0, hexString.Length) .Где(х => х % 2 == 0) .Select(x => Convert.ToByte(hexString.Substring(x, 2), 16)) .ToArray(); } } доступно по адресу https://dotnetfiddle.net/hGZZts. чей вывод
v_key net = 8B928C8346648BDDB14B627EFF4E66F1 iv сеть = 0123456789ABCDEF исходная сеть = 74657374 зашифрованная_str сеть = F7BC988C0EA6EEE5 зашифрованная_str64 сеть = 73A6DqCayTc= decrypted_str сеть = тест Процедура Oracle, которую я написал:
создать или заменить ТЕЛО ПАКЕТА Criptografia AS -- Клавиатура шифрования (укажите, что море равнозначно клаве на C#) strKeyDataAD КОНСТАНТ VARCHAR2(26) := 'H9p-S5m2Dh6Fe7Ls3-Qs1D2e4Z'; ПРОЦЕДУРА EncryptDataAD(strToEncrypt IN VARCHAR2) AS l_mod_ecb pls_integer; v_key сырой (32); зашифрованная_стр VARCHAR2 (4000); зашифрованоBase64_str VARCHAR2(4000); decrypted_str VARCHAR2 (4000); НАЧИНАТЬ l_mod_ecb := dbms_crypto.ENCRYPT_3DES+ dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO ; dbms_output.put_line('l_mod_ecb oracle: '|| l_mod_ecb); v_key := dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ); dbms_output.put_line('v_key oracle: '|| (v_key)); --dbms_output.put_line('DEFAULT_IV oracle: '|| (dbms_crypto.LEGACY_DEFAULT_IV));--DBMS_CRYPTO.LEGACY_DEFAULT_IV dbms_output.put_line('src oracle: '|| utl_i18n.string_to_raw(strToEncrypt, 'AL32UTF8')); зашифрованная_строка := dbms_crypto.encrypt( src => utl_i18n.string_to_raw(strToEncrypt, 'AL32UTF8'), тип => dbms_crypto.ENCRYPT_3DES + dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO, --typ => dbms_crypto.DES3_CBC_PKCS5, ключ => dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ) ,iv => hextoraw('0123456789ABCDEF') ); dbms_output.put_line('encrypted_str oracle: '|| Encrypted_str); dbms_output.put_line('encryptedBase64_str oracle: '|| utl_raw.cast_to_varchar2(utl_encode.base64_encode(encrypted_str))); decrypted_str := dbms_crypto.decrypt( источник => зашифрованная_стр, тип => dbms_crypto.ENCRYPT_3DES + dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO, --typ => dbms_crypto.DES3_CBC_PKCS5, ключ => dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ) ,iv => hextoraw ('0123456789ABCDEF') ); dbms_output.put_line('decrypted_str oracle: '|| UTL_I18N.RAW_TO_CHAR(decrypted_str,'AL32UTF8')); --RETURN зашифрованная_стр; КОНЕЦ EncryptDataAD; КОНЕЦ Криптография; чей вывод
l_mod_ecb oracle: 12545 v_key оракул: 8B928C8346648BDDB14B627EFF4E66F1 источник оракула: 74657374 зашифрованный_str оракул: 28F7DA0F3B338BB1 зашифрованныйBase64_str оракул: KPfaDzszi7E= decrypted_str оракул: тест Как видите, v_key (хэш md5 в байтах) и src (входные данные в байтах) одинаковы, но выходные данные разные. Я пытался изменить заполнение в процедуре Oracle (PAD_PKCS5, PAD_NONE и PAD_ZERO) и модификатор цепочки (CHAIN_ECB, CHAIN_CBC, CHAIN_CFB и CHAIN_OFB), но мне не удалось вернуть тот же результат, что и мое приложение .net. Английский не мой родной язык, поэтому прошу прощения за грамматическую ошибку. заранее спасибо
Мне нужно перенести следующий процесс шифрования 3des из .net в oracle 11g
с использованием системы; использование System.Security.Cryptography; использование System.Text; используя System.Linq; Программа общественного класса { частная константная строка strKey = "H9p-S5m2Dh6Fe7Ls3-Qs1D2e4Z"; общественная статическая пустота Main() { вар strToEncrypt = "тест"; TripleDESCryptoServiceProvider objDESCrypto = новый TripleDESCryptoServiceProvider (); MD5CryptoServiceProvider objHashMD5 = новый MD5CryptoServiceProvider(); байт[] byteHash, byteBuff; byteHash = objHashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strKey)); Console.WriteLine("v_key net = "+BitConverter.ToString(byteHash).Replace("-","")); objHashMD5 = ноль; objDESCrypto.Key = byteHash; objDESCrypto.Mode = CipherMode.CBC; //CBC, CFB objDESCrypto.Padding = PaddingMode.Zeros; Console.WriteLine("iv net = "+BitConverter.ToString(stringToHex("0123456789ABCDEF")).Replace("-","")); objDESCrypto.IV = stringToHex("0123456789ABCDEF"); byteBuff = ASCIIEncoding.ASCII.GetBytes(strToEncrypt); Console.WriteLine("src net = "+BitConverter.ToString(byteBuff).Replace("-","")); var hashbyte = objDESCrypto.CreateEncryptor().TransformFinalBlock(byteBuff, 0, byteBuff.Length); Console.WriteLine("encrypted_str net = "+BitConverter.ToString(hashbyte).Replace("-","")); Console.WriteLine("encrypted_str64 net = " + Convert.ToBase64String(objDESCrypto.CreateEncryptor(). TransformFinalBlock(hashbyte, 0, hashbyte.Length))); var decrypted_str = ASCIIEncoding.ASCII.GetString (objDESCrypto.CreateDecryptor().TransformFinalBlock (хешбайт, 0, хешбайт.Длина)); Console.WriteLine("decrypted_str net = "+decrypted_str); строка hexString = "43480170"; } общественный статический байт [] stringToHex (строка hexString) { //uint num = uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier); //byte[] floatVals = BitConverter.GetBytes(num); // возвращаем floatVals; return Enumerable.Range(0, hexString.Length) .Где(х => х % 2 == 0) .Select(x => Convert.ToByte(hexString.Substring(x, 2), 16)) .ToArray(); } } доступно по адресу https://dotnetfiddle.net/hGZZts. чей вывод
v_key net = 8B928C8346648BDDB14B627EFF4E66F1 iv сеть = 0123456789ABCDEF исходная сеть = 74657374 зашифрованная_str сеть = F7BC988C0EA6EEE5 зашифрованная_str64 сеть = 73A6DqCayTc= decrypted_str сеть = тест Процедура Oracle, которую я написал:
создать или заменить ТЕЛО ПАКЕТА Criptografia AS -- Клавиатура шифрования (укажите, что море равнозначно клаве на C#) strKeyDataAD КОНСТАНТ VARCHAR2(26) := 'H9p-S5m2Dh6Fe7Ls3-Qs1D2e4Z'; ПРОЦЕДУРА EncryptDataAD(strToEncrypt IN VARCHAR2) AS l_mod_ecb pls_integer; v_key сырой (32); зашифрованная_стр VARCHAR2 (4000); зашифрованоBase64_str VARCHAR2(4000); decrypted_str VARCHAR2 (4000); НАЧИНАТЬ l_mod_ecb := dbms_crypto.ENCRYPT_3DES+ dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO ; dbms_output.put_line('l_mod_ecb oracle: '|| l_mod_ecb); v_key := dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ); dbms_output.put_line('v_key oracle: '|| (v_key)); --dbms_output.put_line('DEFAULT_IV oracle: '|| (dbms_crypto.LEGACY_DEFAULT_IV));--DBMS_CRYPTO.LEGACY_DEFAULT_IV dbms_output.put_line('src oracle: '|| utl_i18n.string_to_raw(strToEncrypt, 'AL32UTF8')); зашифрованная_строка := dbms_crypto.encrypt( src => utl_i18n.string_to_raw(strToEncrypt, 'AL32UTF8'), тип => dbms_crypto.ENCRYPT_3DES + dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO, --typ => dbms_crypto.DES3_CBC_PKCS5, ключ => dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ) ,iv => hextoraw('0123456789ABCDEF') ); dbms_output.put_line('encrypted_str oracle: '|| Encrypted_str); dbms_output.put_line('encryptedBase64_str oracle: '|| utl_raw.cast_to_varchar2(utl_encode.base64_encode(encrypted_str))); decrypted_str := dbms_crypto.decrypt( источник => зашифрованная_стр, тип => dbms_crypto.ENCRYPT_3DES + dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO, --typ => dbms_crypto.DES3_CBC_PKCS5, ключ => dbms_crypto.hash( utl_i18n.string_to_raw(strKeyDataAD, 'AL32UTF8'), dbms_crypto.hash_md5 ) ,iv => hextoraw ('0123456789ABCDEF') ); dbms_output.put_line('decrypted_str oracle: '|| UTL_I18N.RAW_TO_CHAR(decrypted_str,'AL32UTF8')); --RETURN зашифрованная_стр; КОНЕЦ EncryptDataAD; КОНЕЦ Криптография; чей вывод
l_mod_ecb oracle: 12545 v_key оракул: 8B928C8346648BDDB14B627EFF4E66F1 источник оракула: 74657374 зашифрованный_str оракул: 28F7DA0F3B338BB1 зашифрованныйBase64_str оракул: KPfaDzszi7E= decrypted_str оракул: тест Как видите, v_key (хэш md5 в байтах) и src (входные данные в байтах) одинаковы, но выходные данные разные. Я пытался изменить заполнение в процедуре Oracle (PAD_PKCS5, PAD_NONE и PAD_ZERO) и модификатор цепочки (CHAIN_ECB, CHAIN_CBC, CHAIN_CFB и CHAIN_OFB), но мне не удалось вернуть тот же результат, что и мое приложение .net. Английский не мой родной язык, поэтому прошу прощения за грамматическую ошибку. заранее спасибо
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение