<

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

Войти
  1. andrey i1c

    04-08-2020 11:10

    Есть код
    ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider") - работает;
    Как подключиться к объекту RSACryptoServiceProvider(Int32)- (используя параметр)?

  2. andrey i1c

    04-08-2020 11:11

    на другом языке это
    RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(2048);
    Надо реализовать через 1С

  3. acht

    04-08-2020 11:22

    Никак. COM не использует конструторы с параметрами.

    Пиши через RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(), генерируй ключи самостоятельно. Так же, как и "на другом языке"

  4. andrey i1c

    04-08-2020 11:24

    (2) то есть готовый ключ, который мне дали я не смогу вставить выходит дело? только если сгенерировать его на стороне 1С самостоятельно?

  5. andrey i1c

    04-08-2020 11:27

    (2) Метод ToXmlString формирует следующий публичный ключ в строке:
    ПубличныйКлюч = "<RSAKeyValue><Modulus>xjNPmhIHTDnnbWpcG/XtSYmDx43vZuN1Em2TUdznCqtebrrzK4rGqJBHTxgKGNYlNMn4TEw+CyPgmjzJIeBrW8a5bvweoNwIAyy/8lAtvP/QE4nLV2ABXKOjky06Ys1GRKprxHAqu8Kcl3X9J64FN63MZp+zOd0rqHmVEOqdLAU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

    Пытаюсь заменить на свой "asd2343asdasaYdnnas89932asdasd" получаю ошибку "Недопустимая длина для массива символов Base-64"

  6. ДенисЧ

    04-08-2020 11:39

    "RSACryptoServiceProvider(Int32)"
    И строка...

    Ты уж или трусики, или крестик...

  7. asady

    04-08-2020 11:48

    (0) попробуй
    ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider",2048);

  8. acht

    04-08-2020 11:50

    (3) https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.-ctor?view=netframework-4.8

    RSACryptoServiceProvider(Int32) Инициализирует новый экземпляр класса RSACryptoServiceProvider с созданной случайным образом парой ключей указанного размера.

    С созданной. Случайным. Образом. Парой. Ключей. Указанного. Размера.
    Если у тебя есть готовый ключ для использования, зачем ты используешь этот конструктор?

  9. acht

    04-08-2020 11:51

    (4) > на свой "asd2343asdasaYdnnas89932asdasd"

    Отойди от программированиея, пожалуйста. Книдки там почитай. Не твое пока это.

  10. andrey i1c

    04-08-2020 14:18

    (8) ну так подскажи чем воспользоваться для применения шифрования со своим ключом?

  11. andrey i1c

    04-08-2020 14:29

    (6) а то судя по примеру больше слов и понтов, которые на ветер, но не практики.

  12. Serginio1

    04-08-2020 14:40

    http://catalog.mista.ru/1c/articles/448668/

  13. Serginio1

    04-08-2020 14:41

    Пример использования
    https://ru.stackoverflow.com/questions/532477/%d0%9f%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d0%bf%d0%be%d0%b4%d0%bf%d0%b8%d1%81%d0%b8-%d0%ad%d0%a6%d0%9f-%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb%d0%b5-online-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%81%d0%b5%d1%80%d1%82%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%82%d0%b0-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8f-c-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b1%d0%b8%d0%b1

  14. andrey i1c

    04-08-2020 14:59

    (11) спасибо, после отпишусь.

  15. andrey i1c

    04-08-2020 15:41

    (12) класс System.Security.Cryptography.X509Certificates.X509Chain не совсем подходит для моего случая, задача состоит в шифровании данных методом RSA, передав в него уже готовый публичный ключ. Кроме как работа с System.Security.Cryptography.RSACryptoServiceProvider ничего не получается, но в нем нельзя передать готовый публичный ключ...
    Вопрос актуален, но решений как таковых нет со стороны 1С

  16. Serginio1

    04-08-2020 15:49

    (14) Это пример
    в твоем случае
    System.Security.Cryptography.RSACryptoServiceProvider
    то есть
    Врап = Новый COMОбъект("NetObjectToIDispatch45");
    RSACryptoServiceProvider=Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider");

    ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider,2048);

  17. Serginio1

    04-08-2020 16:04

    https://stackoverflow.com/questions/18871091/rsa-asymmentic-encryption-exception

  18. acht

    04-08-2020 16:07

    (10) Ждем завтра от тебя новую тему

  19. andrey i1c

    04-08-2020 17:15

    (15) спасибо большое получилось!!! правда пришлось размер передаваемого ключа увеличить до 88 символов. Прошлый публичный ключ на 30 символов вызывает ошибку.
    ОбъектШифрования= Врап.СоздатьОбъект(RSACryptoServiceProvider, 512);
    указал значение 512 бит так как ниже не пропускает....и вызывает ошибку "Недопустимая длина массива знаков Base-64"
    или есть решение еще уменьшить длину ключа?

  20. Serginio1

    04-08-2020 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

  21. andrey i1c

    04-08-2020 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);