Руководство по аутентификации Crypto / Token - PullRequest
0 голосов
/ 20 сентября 2018

Я купил какое-то оборудование, в котором есть документ о том, как аутентифицировать здесь :

Крипто определенно не моя вещь, и я пытаюсь понять, как или даже в какой формеКрипто, это попытка найти примеры в Интернете, чтобы я мог пытаться общаться с использованием c # и предпочтительного ядра .net, чтобы я мог быть x-plat.

Теперь есть код здесь , который делает именно это, за исключением того, что он находится в файле node.js. Я верю и не знаю, что такое крипто-библиотека

В итоге это то, что они заявляютв документации:

Получить открытый ключ Miniservers через «jdev / sys / getPublicKey» -> {publicKey} a.Хранить на клиенте б.Формат: кодированный ключ X.509 в ANS.1 открывает соединение через WebSocket a.используйте следующий путь: «ws: // {ipOrUrl}: {порт} / ws / rfc6455» b.укажите «remotecontrol» в качестве Sec-WebSocket-Protocol.с.wss: // не поддерживается Miniserver. Создание ключа AES256 -> {ключ} (шестнадцатеричный код) Создание случайного AES iv (16 байт) -> {iv} (Hex) RSA Зашифруйте ключ AES + iv с помощью {publicKey} -> {session-key} (Base64) a.«{Ключ}: {iv}» - это полезная нагрузка, которая должна быть зашифрована с использованием RSA Обмен ключами через «jdev / sys / keyexchange / {session-key}» Создатьслучайная соль, шестнадцатеричная строка (длина может варьироваться, например, 2 байта) -> {соль} Теперь есть два варианта: a.Если токен существует, выполните аутентификацию, как описано в разделе Аутентификация с использованием токенов b.Если необходимо получить токен, действуйте, как описано в разделе «Получение токенов». 9.3 Связь с Miniserver Страница 5 из 21 После успешной аутентификации на основе токенов или получения нового токена сокет аутентифицируется и готов к работе..

Так что я почти уверен, что у меня все хорошо с шагом 2 (возможно, не с форматированным ключом, кодированным x.509 .. Я воспринял это как удаление отступов и простополучите значения base64:

        UriBuilder builder = new UriBuilder("http://192.168.0.77");
        using (var request = new LxHttpRequest(builder.Uri))
        {
            CancellationToken token = new CancellationToken();
            string result = request.GetStringAsync("jdev/sys/getPublicKey", token).Result;
            var res = ResultConverter.Deserialize(result);

            Console.WriteLine(TokenAuth.parsePublicKey(res.Content));
        }

Шаг 3, я клонировал код из loxnet , который, я думаю, является хорошей отправной точкой, поэтому я доволен этим ..

Шаг4/5, вот где я нахожусь:

         var aes = new AesCryptoServiceProvider();
            aes.GenerateIV();
            byte[] iv = aes.IV;
            aes.GenerateKey();
            Console.WriteLine("Key base64: {0}", Convert.ToBase64String(aes.Key));

, но примерно в этот момент у меня маринована голова, и я раздражаюсь .. Я ценю, что это похоже на просьбу о помощи с домашней работой - но я 'Я надеюсь, что кто-то может объяснить, как это называется, поэтому я могу продолжать поиск - если кто-то не может помочь с примерами / фрагментами или предложением пакета nuget, который выполняет сложную работу - я взглянул на bouncycastle, но этозаставил мои глаза хотеть истекать кровью, пытаясь что-то понять: D: D

Пожалуйста, полегче с пламенем!

1 Ответ

0 голосов
/ 21 сентября 2018

, поэтому я еще раз взглянул на инструкции и просто попытался пройтись по нему ... это выглядит так, будто я на правильном пути:

    private static void CryptoTest()
    {
        byte[] serversPublicKey = GetPublicKey();

        // Create a new instance of RSACryptoServiceProvider.
        var RSA = new RSACryptoServiceProvider();
        var RSAKeyInfo = RSA.ExportParameters(includePrivateParameters: false);

        // Set RSAKeyInfo withthe provided public key. 
        RSAKeyInfo.Modulus = serversPublicKey;
        RSA.ImportParameters(RSAKeyInfo);

        // Generate New AES key
        var aes = new AesCryptoServiceProvider();
        aes.GenerateIV();
        aes.GenerateKey();

        byte[] sessionKey;

        using (var stream = new MemoryStream())
        {
            using (var writer = new BinaryWriter(stream))
            {
                // Encrypt the aes key and iv
                writer.Write(aes.Key);
                writer.Write(":");
                writer.Write(aes.IV);
            }

            sessionKey = RSA.Encrypt(stream.ToArray(), RSAEncryptionPadding.Pkcs1);
        }

        Console.WriteLine($"Encrypted Session Key (Base64): {Convert.ToBase64String(sessionKey)}");

        // Todo Step 7 send key to server

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...