Я купил некоторое оборудование, которое разделяет документ о том, как аутентифицироваться здесь:
Crypto, определенно, не моя вещь, и я пытаюсь понять, как и в какой форме криптона это попытка найти онлайн-примеры, чтобы я мог попробовать и общаться с использованием С# и предпочтительного ядра.net, чтобы я мог быть x-plat.
Теперь есть код здесь, что делает именно это, кроме него в Node.js, я считаю, и я не знаю, крипто LIB
Таким образом, это то, что они заявляют в документации:
- Приобретите открытый ключ Miniservers через "jdev/sys/getPublicKey" → {publicKey} a. Хранить на клиенте. B. Формат: X.509 закодированный ключ в ANS.1
- откройте соединение WebSocket a. используйте следующий путь: "ws://{ipOrUrl}: {port}/ws/rfc6455" b. укажите "remotecontrol" как Sec-WebSocket-Protocol. с. wss://не поддерживается Miniserver.
- Сгенерируйте ключ AES256 → {key} (Hex)
- Создайте случайный AES iv (16 байт) → {iv} (Hex)
- RSA Шифровать ключ AES + iv с помощью {publicKey} → {session-key} (Base64) a. "{key}: {iv}" - полезная нагрузка, которая должна быть зашифрована с использованием RSA
- Обмен ключами через "jdev/sys/keyexchange/{session-key}"
- Создайте случайную соль, шестую строку (длина может меняться, например, 2 байта) → {salt}
- Теперь есть два варианта: a. Если существует токен, выполните аутентификацию, как описано в разделе Аутентификация с использованием токенов b. Если необходимо приобрести токен, действуйте так, как описано в разделе "Приобретение токенов". Конфигурация 9.3. Общение с мини-сервером Страница 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
Прощай, пылай!
поэтому я еще раз взглянул на инструкции и просто попытался проложить себе путь... это похоже на то, что я на правильном пути:
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
}