Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

1C как подключиться к внешнему объекту через com используя параметр?

1C как подключиться к внешнему объекту через com используя параметр?
Я
   andrey i1c
 
04.08.20 - 11:10
Есть код
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider") - работает;
Как подключиться к объекту RSACryptoServiceProvider(Int32)- (используя параметр)?
   andrey i1c
 
1 - 04.08.20 - 11:11
на другом языке это
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);
Надо реализовать через 1С
   acht
 
2 - 04.08.20 - 11:22
Никак. COM не использует конструторы с параметрами.

Пиши через RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(), генерируй ключи самостоятельно. Так же, как и "на другом языке"
   andrey i1c
 
3 - 04.08.20 - 11:24
(2) то есть готовый ключ, который мне дали я не смогу вставить выходит дело? только если сгенерировать его на стороне 1С самостоятельно?
   andrey i1c
 
4 - 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)"
И строка...

Ты уж или трусики, или крестик...
   asady
 
6 - 04.08.20 - 11:48
(0) попробуй
ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider",2048);
   acht
 
7 - 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 с созданной случайным образом парой ключей указанного размера.

С созданной. Случайным. Образом. Парой. Ключей. Указанного. Размера.
Если у тебя есть готовый ключ для использования, зачем ты используешь этот конструктор?
   acht
 
8 - 04.08.20 - 11:51
(4) > на свой "asd2343asdasaYdnnas89932asdasd" 

Отойди от программированиея, пожалуйста. Книдки там почитай. Не твое пока это.
   andrey i1c
 
9 - 04.08.20 - 14:18
(8) ну так подскажи чем воспользоваться для применения шифрования со своим ключом?
   andrey i1c
 
10 - 04.08.20 - 14:29
(6) а то судя по примеру больше слов и понтов, которые на ветер, но не практики.
   Serginio1
 
11 - 04.08.20 - 14:40
   Serginio1
 
12 - 04.08.20 - 14:41
   andrey i1c
 
13 - 04.08.20 - 14:59
(11) спасибо, после отпишусь.
   andrey i1c
 
14 - 04.08.20 - 15:41
(12) класс System.Security.Cryptography.X509Certificates.X509Chain не совсем подходит для моего случая, задача состоит в шифровании данных методом RSA, передав в него уже готовый публичный ключ. Кроме как работа с System.Security.Cryptography.RSACryptoServiceProvider ничего не получается, но в нем нельзя передать готовый публичный ключ...
Вопрос актуален, но решений как таковых нет со стороны 1С
   Serginio1
 
15 - 04.08.20 - 15:49
(14) Это пример
в твоем случае
System.Security.Cryptography.RSACryptoServiceProvider
то есть 
 Врап = Новый COMОбъект("NetObjectToIDispatch45");
RSACryptoServiceProvider=Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider");

ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider,2048);
   Serginio1
 
16 - 04.08.20 - 16:04
   acht
 
17 - 04.08.20 - 16:07
(10) Ждем завтра от тебя новую тему
   andrey i1c
 
18 - 04.08.20 - 17:15
(15) спасибо большое получилось!!! правда пришлось размер передаваемого ключа увеличить до 88 символов. Прошлый публичный ключ на 30 символов вызывает ошибку.
ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider, 512); 
указал значение 512 бит так как ниже не пропускает....и вызывает ошибку "Недопустимая длина массива знаков Base-64"
или есть решение еще уменьшить длину ключа?
   Serginio1
 
19 - 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
   andrey i1c
 
20 - 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);
   Serginio1
 
21 - 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 оно уже загружено. Почитай статью
   andrey i1c
 
22 - 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);//Импортирует двоичный объект,в параметре наш массив 


в чем может быть дело?
   andrey i1c
 
23 - 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
   Serginio1
 
24 - 05.08.20 - 15:49
   andrey i1c
 
25 - 05.08.20 - 15:54
(24) я на форуме прочитал вот это вроде сработало 
     exported = ОбъектШифрования.ExportCspBlob(true);
     ОбъектШифрования.ImportCspBlob(exported);
   andrey i1c
 
26 - 05.08.20 - 15:56
только параметр в моем случае false
   andrey i1c
 
27 - 05.08.20 - 15:57
(26) но это экспорт не подходит...
   andrey i1c
 
28 - 05.08.20 - 15:57
поразбираюсь, в конце отпишусь о результатах!
   Serginio1
 
29 - 05.08.20 - 16:15
(25) Угу
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
   Serginio1
 
30 - 05.08.20 - 16:18
 
 Рекламное место пустует
   andrey i1c
 
31 - 05.08.20 - 18:31
(29)

Выгрузил и преобразовал данные ключей, которые формирует RSA 
    compressed = ОбъектШифрования.ExportCspBlob(false);
    стр64=Convert.ToBase64String(compressed);// Переведем сжатые данные в Base64

посмотрел что длина ключа составляет 112 символов при 512 бит.

Если я записываю свой ключ размером 112 символов, то все срабатывает.
Мое предположение, что в RSA используется минимальный заложенный размер 512 бит ибо меньше совсем не безопасно. И система генерирует либо принимаем методом ImportCspBlob не менее 112 символов которые формируются при 512 бит. Но можно и больше установить.

Возможно ошибаюсь, но пока что вот так.
   andrey i1c
 
32 - 05.08.20 - 18:52
(31) хотя минимум все же 384 бит. А это уже при использовании метода ImportCspBlob ключ может иметь 92 символа. А при использовании FromXmlString ключ может содержать 64 символа. В принципе уже более менее то что надо. Все проверил работает.  

https://fooobar.com/questions/8242236/minimum-key-length-of-rsa  

Но меньшее не нашел, возможно это будут ограничения со стороны 1С )))
   andrey i1c
 
33 - 05.08.20 - 18:55
   andrey i1c
 
34 - 05.08.20 - 18:57
   andrey i1c
 
35 - 05.08.20 - 18:57
(21) Serginio1 что скажете? выслушаю вас и можно закрывать ветку
   Serginio1
 
36 - 05.08.20 - 19:46
1C никак не влияет на что либо. Это отдельные нетовские библиотеки. Каков смысл в уменьшении ключа мне не понятно.
Обычно парой приватный открытый ключ кодируют либо подпись (хэш документа) либо синхронный ключ.
   andrey i1c
 
37 - 06.08.20 - 12:15
(36) смысл в уменьшении ключа в том, что нам необходимо не генерировать собственные ключи, а воспользоваться уже готовым, который предоставил разработчик сайта.но готовый ключ с малым количеством символов загрузить не получается поскольку система просит ключи определенного размера. поэтому я решил взять минимальный ключ который генерирует система и под него подгонять наш собственный и менять на свой.
вот в принципе и вся задача)
   Serginio1
 
38 - 06.08.20 - 12:39
(37) Понятно. Тогда нужно у разработчиков узнать какими параметрами они пользуются для создания ключа
   andrey i1c
 
39 - 06.08.20 - 12:45
(38) спасибо вам за помощь и документацию, более менее стало все понятно.
   andrey i1c
 
40 - 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;
?>
   andrey i1c
 
41 - 06.08.20 - 12:49
А вот при кодировке "60020002" с ключом "asd2343asdasaYdnnas89932asdasd" получаем:

qKANzgLRUJt9zud5/MGMBbx07eDuaeq3It6i1dulvb8OFHqkF6v1iMHKZYtEGmUr0zqp0ElqNM2U7PnoY6mYlA==

собственно сама задача
   Serginio1
 
42 - 06.08.20 - 13:19
   Serginio1
 
43 - 06.08.20 - 13:28
   Serginio1
 
44 - 06.08.20 - 16:46
Но Aes и RijndaelManaged это  симметричные алгоритмы


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.