Имя: Пароль:
1C
1С v8
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
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
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
43 Serginio1
 
06.08.20
13:28
44 Serginio1
 
06.08.20
16:46
Но Aes и RijndaelManaged это  симметричные алгоритмы
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший