![]() |
|
1C как подключиться к внешнему объекту через com используя параметр? | ☑ | ||
---|---|---|---|---|
0
andrey i1c
04.08.20
✎
11:10
|
Есть код
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider") - работает; Как подключиться к объекту RSACryptoServiceProvider(Int32)- (используя параметр)? |
|||
1
andrey i1c
04.08.20
✎
11:11
|
на другом языке это
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048); Надо реализовать через 1С |
|||
2
acht
04.08.20
✎
11:22
|
Никак. COM не использует конструторы с параметрами.
Пиши через RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(), генерируй ключи самостоятельно. Так же, как и "на другом языке" |
|||
3
andrey i1c
04.08.20
✎
11:24
|
(2) то есть готовый ключ, который мне дали я не смогу вставить выходит дело? только если сгенерировать его на стороне 1С самостоятельно?
|
|||
4
andrey i1c
04.08.20
✎
11:27
|
(2) Метод ToXmlString формирует следующий публичный ключ в строке:
ПубличныйКлюч = "<RSAKeyValue><Modulus>xjNPmhIHTDnnbWpcG/XtSYmDx43vZuN1Em2TUdznCqtebrrzK4rGqJBHTxgKGNYlNMn4TEw+CyPgmjzJIeBrW8a5bvweoNwIAyy/8lAtvP/QE4nLV2ABXKOjky06Ys1GRKprxHAqu8Kcl3X9J64FN63MZp+zOd0rqHmVEOqdLAU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; Пытаюсь заменить на свой "asd2343asdasaYdnnas89932asdasd" получаю ошибку "Недопустимая длина для массива символов Base-64" |
|||
5
ДенисЧ
04.08.20
✎
11:39
|
"RSACryptoServiceProvider(Int32)"
И строка... Ты уж или трусики, или крестик... |
|||
6
asady
04.08.20
✎
11:48
|
(0) попробуй
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider",2048); |
|||
7
acht
04.08.20
✎
11:50
|
(3) https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.-ctor?view=netframework-4.8
RSACryptoServiceProvider(Int32) Инициализирует новый экземпляр класса RSACryptoServiceProvider с созданной случайным образом парой ключей указанного размера. С созданной. Случайным. Образом. Парой. Ключей. Указанного. Размера. Если у тебя есть готовый ключ для использования, зачем ты используешь этот конструктор? |
|||
8
acht
04.08.20
✎
11:51
|
(4) > на свой "asd2343asdasaYdnnas89932asdasd"
Отойди от программированиея, пожалуйста. Книдки там почитай. Не твое пока это. |
|||
9
andrey i1c
04.08.20
✎
14:18
|
(8) ну так подскажи чем воспользоваться для применения шифрования со своим ключом?
|
|||
10
andrey i1c
04.08.20
✎
14:29
|
(6) а то судя по примеру больше слов и понтов, которые на ветер, но не практики.
|
|||
11
Serginio1
04.08.20
✎
14:40
|
||||
12
Serginio1
04.08.20
✎
14:41
|
||||
13
andrey i1c
04.08.20
✎
14:59
|
(11) спасибо, после отпишусь.
|
|||
14
andrey i1c
04.08.20
✎
15:41
|
(12) класс System.Security.Cryptography.X509Certificates.X509Chain не совсем подходит для моего случая, задача состоит в шифровании данных методом RSA, передав в него уже готовый публичный ключ. Кроме как работа с System.Security.Cryptography.RSACryptoServiceProvider ничего не получается, но в нем нельзя передать готовый публичный ключ...
Вопрос актуален, но решений как таковых нет со стороны 1С |
|||
15
Serginio1
04.08.20
✎
15:49
|
(14) Это пример
в твоем случае System.Security.Cryptography.RSACryptoServiceProvider то есть Врап = Новый COMОбъект("NetObjectToIDispatch45"); RSACryptoServiceProvider=Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider"); ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider,2048); |
|||
16
Serginio1
04.08.20
✎
16:04
|
||||
17
acht
04.08.20
✎
16:07
|
(10) Ждем завтра от тебя новую тему
|
|||
18
andrey i1c
04.08.20
✎
17:15
|
(15) спасибо большое получилось!!! правда пришлось размер передаваемого ключа увеличить до 88 символов. Прошлый публичный ключ на 30 символов вызывает ошибку.
ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider, 512); указал значение 512 бит так как ниже не пропускает....и вызывает ошибку "Недопустимая длина массива знаков Base-64" или есть решение еще уменьшить длину ключа? |
|||
19
Serginio1
04.08.20
✎
17:45
|
Смотри пример 16. Там как раз используется ключ
CspParameters cspParams = new CspParameters { ProviderType = 1 }; RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams); rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey)); Ну а что касается ключа то смотри https://ru.wikipedia.org/wiki/Base64 Если кодируются только один или два байта, в результате получаются только первые два или три символа строки, а выходная строка дополняется двумя или одним символами «=». Это предотвращает добавление дополнительных битов к восстановленным данным. Процесс повторяется над оставшимися входными данными. То есть количество символов должно быть кратно 4 "asd2343asdasaYdnnas89932asdasd" здесь 30 символов "asd2343asdasaYdnnas89932asdasd==" добиваем до 32 |
|||
20
andrey i1c
04.08.20
✎
19:27
|
(19) А как создать класс Convert? что бы от него вызвать FromBase64String ?
Ниже алгоритм получения RSACryptoServiceProvider с параметрами: ПубличныйКлюч = "<RSAKeyValue><Modulus>asd2343asdasaYdnnas89932asdasd==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; Врап = Новый COMОбъект("NetObjectToIDispatch45"); RSACryptoServiceProvider=Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider"); CspParameters = Врап.ПолучитьТип("System.Security.Cryptography.CspParameters"); ОбъектCspParameters = Врап.СоздатьОбъект(CspParameters, 1); CspParameters = Врап.ПолучитьТип("System.Security.Cryptography.CspParameters"); ОбъектCspParameters = Врап.СоздатьОбъект(CspParameters, 1); ОбъектШифрования = Врап.СоздатьОбъект(RSACryptoServiceProvider, ОбъектCspParameters); |
|||
21
Serginio1
04.08.20
✎
22:46
|
Convert=Врап.ПолучитьТип("System.Convert");
http://catalog.mista.ru/1c/articles/448668/ Там в обсуждении есть его использования при сжатии данных. Всегда можно в гугле задать вопрос типа C# Convert FromBase64String Смотри для 4.6.1 https://docs.microsoft.com/ru-ru/dotnet/api/system.convert?view=netframework-4.6.1 Convert Class Namespace: System Assembly:mscorlib.dll То, что mscorlib.dll оно уже загружено. Почитай статью |
|||
22
andrey i1c
05.08.20
✎
15:23
|
(21) пытался сделать вот так, но с методом ImportCspBlob получаю ошибку https://yadi.sk/i/SxoFS9JF0bGwfg
ПубличныйКлюч = "asd2343asdasaYdnnas89932asdasd=="; //сам ключ с добавлением "==" +2 символа, согласно правилам. Convert = Врап.ПолучитьТип("System.Convert"); //получаем тип Convert от System s = Convert.FromBase64String(ПубличныйКлюч); //преобразуем строку в массив 8-разрядных целых чисел без знаков ОбъектШифрования.ImportCspBlob(s); //Импортирует двоичный объект,в параметре наш массив в чем может быть дело? |
|||
23
andrey i1c
05.08.20
✎
15:48
|
(21) Serginio1 прочитайте пожалуйста, и кстати такая ошибка у многих
https://www.sql.ru/forum/935252/shifrovanie-rsa https://fooobar.com/questions/2214714/bad-version-of-provider-while-loading-the-public-key-with-rsacryptoserviceprovider |
|||
24
Serginio1
05.08.20
✎
15:49
|
https://issue.life/questions/56373628
Создай свой ключ как в https://stackoverflow.com/questions/18871091/rsa-asymmentic-encryption-exception или поиграй с CspParameters.ProviderType https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.cspparameters.providertype?view=netframework-4.6.1 |
|||
25
andrey i1c
05.08.20
✎
15:54
|
(24) я на форуме прочитал вот это вроде сработало
exported = ОбъектШифрования.ExportCspBlob(true); ОбъектШифрования.ImportCspBlob(exported); |
|||
26
andrey i1c
05.08.20
✎
15:56
|
только параметр в моем случае false
|
|||
27
andrey i1c
05.08.20
✎
15:57
|
(26) но это экспорт не подходит...
|
|||
28
andrey i1c
05.08.20
✎
15:57
|
поразбираюсь, в конце отпишусь о результатах!
|
|||
29
Serginio1
05.08.20
✎
16:15
|
(25) Угу
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false)); string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true)); |
|||
30
Serginio1
05.08.20
✎
16:18
|
||||
31
andrey i1c
05.08.20
✎
18:31
|
(29)
Выгрузил и преобразовал данные ключей, которые формирует RSA compressed = ОбъектШифрования.ExportCspBlob(false); стр64=Convert.ToBase64String(compressed); // Переведем сжатые данные в Base64 посмотрел что длина ключа составляет 112 символов при 512 бит. Если я записываю свой ключ размером 112 символов, то все срабатывает. Мое предположение, что в RSA используется минимальный заложенный размер 512 бит ибо меньше совсем не безопасно. И система генерирует либо принимаем методом ImportCspBlob не менее 112 символов которые формируются при 512 бит. Но можно и больше установить. Возможно ошибаюсь, но пока что вот так. |
|||
32
andrey i1c
05.08.20
✎
18:52
|
(31) хотя минимум все же 384 бит. А это уже при использовании метода ImportCspBlob ключ может иметь 92 символа. А при использовании FromXmlString ключ может содержать 64 символа. В принципе уже более менее то что надо. Все проверил работает.
https://fooobar.com/questions/8242236/minimum-key-length-of-rsa Но меньшее не нашел, возможно это будут ограничения со стороны 1С ))) |
|||
33
andrey i1c
05.08.20
✎
18:55
|
https://fooobar.com/questions/17694715/how-to-create-rsa-keys-smaller-than-384-bits-in-c
вот к теме 384 битных ключей) |
|||
34
andrey i1c
05.08.20
✎
18:57
|
||||
35
andrey i1c
05.08.20
✎
18:57
|
(21) Serginio1 что скажете? выслушаю вас и можно закрывать ветку
|
|||
36
Serginio1
05.08.20
✎
19:46
|
1C никак не влияет на что либо. Это отдельные нетовские библиотеки. Каков смысл в уменьшении ключа мне не понятно.
Обычно парой приватный открытый ключ кодируют либо подпись (хэш документа) либо синхронный ключ. |
|||
37
andrey i1c
06.08.20
✎
12:15
|
(36) смысл в уменьшении ключа в том, что нам необходимо не генерировать собственные ключи, а воспользоваться уже готовым, который предоставил разработчик сайта.но готовый ключ с малым количеством символов загрузить не получается поскольку система просит ключи определенного размера. поэтому я решил взять минимальный ключ который генерирует система и под него подгонять наш собственный и менять на свой.
вот в принципе и вся задача) |
|||
38
Serginio1
06.08.20
✎
12:39
|
(37) Понятно. Тогда нужно у разработчиков узнать какими параметрами они пользуются для создания ключа
|
|||
39
andrey i1c
06.08.20
✎
12:45
|
(38) спасибо вам за помощь и документацию, более менее стало все понятно.
|
|||
40
andrey i1c
06.08.20
✎
12:48
|
(38) вот пример как это делается на php
<?php function decrypt( $ciphertext ){ $encryption_key='asd2343asdasaYdnnas89932asdasd'; $c = base64_decode($ciphertext); $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC"); $iv = substr($c, 0, $ivlen); $hmac = substr($c, $ivlen, $sha2len=32); $ciphertext_raw = substr($c, $ivlen+$sha2len); $plaintext = openssl_decrypt($ciphertext_raw, $cipher, $encryption_key, $options=OPENSSL_RAW_DATA, $iv); $calcmac = hash_hmac('sha256', $ciphertext_raw, $encryption_key, $as_binary=true); if (hash_equals($hmac, $calcmac)) return $plaintext; return false; } $code = strval( $_GET["code"] ); $word = decrypt( $code ); echo $word; ?> |
|||
41
andrey i1c
06.08.20
✎
12:49
|
А вот при кодировке "60020002" с ключом "asd2343asdasaYdnnas89932asdasd" получаем:
qKANzgLRUJt9zud5/MGMBbx07eDuaeq3It6i1dulvb8OFHqkF6v1iMHKZYtEGmUr0zqp0ElqNM2U7PnoY6mYlA== собственно сама задача |
|||
42
Serginio1
06.08.20
✎
13:19
|
Ну можно посмотреть openSSL
https://stackoverflow.com/questions/43366842/different-encryption-results-using-c-sharp-and-cryptojs https://stackoverflow.com/questions/50720013/using-openssl-with-c-sharp В примерах они используют Aes https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.aes.create?view=netframework-4.6.1 Либо используют RijndaelManaged https://stackoverflow.com/questions/5452422/openssl-encryption-using-net-classes https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rijndaelmanaged?view=netframework-4.6.1 |
|||
43
Serginio1
06.08.20
✎
13:28
|
||||
44
Serginio1
06.08.20
✎
16:46
|
Но Aes и RijndaelManaged это симметричные алгоритмы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |