AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
132 stars 42 forks source link

Создание симметричных ключей для тестов #47

Closed vladikKBR85 closed 1 year ago

vladikKBR85 commented 1 year ago

Добрый день.

Пробую реализовать обмен пакетами содержащими имитовставки. Подскажите, пожалуйста, как можно расшарить симметричный ключ между двумя сервисами для тестов? Аналогично вот этому коду?

                public void ShouldComputeHMAC(ProviderType providerType)
        {
            // Given
            var dataStream = CreateDataStream();
            var sharedKey = new Gost_28147_89_SymmetricAlgorithm(providerType);

            // When
            var hmacDataStream = CreateHmacDataStream(sharedKey, dataStream);
            var isValidHmacDataStream = VerifyHmacDataStream(sharedKey, hmacDataStream);

            // Then
            Assert.IsTrue(isValidHmacDataStream);
        }

К сожалению- не имею совершенно не имею опыта в криптографии.

AlexMAS commented 1 year ago

Здравствуйте!

У экземпляра симметричного ключа есть методы экспорта/импорта. Им можно воспользоваться для передачи ключа по сети или чтобы сохранить в файл/хранилище.

Возможно, я неправильно понял вопрос. :)

vladikKBR85 commented 1 year ago

Да, разобрался, спасибо! Скажите, пожалуйста, а поддержка Astra Linux не планируется?

vladikKBR85 commented 1 year ago

Видимо, не до конца разобрался..

                var test = new Gost_28147_89_SymmetricAlgorithm();
                var key = test.EncodePrivateKey(test, GostKeyExchangeExportMethod.CryptoProKeyExport);
                File.WriteAllBytes("winkey.txt", key);
                key = File.ReadAllBytes("winkey.txt");
                var test2 = new Gost_28147_89_SymmetricAlgorithm();
                var keyV = test2.DecodePrivateKey(key, GostKeyExchangeExportMethod.CryptoProKeyExport);

Выдает нативное исключение.. Подскажите, как правильно выполнять импорт?

AlexMAS commented 1 year ago

Возможно, не совсем удачные комментарии к методу EncodePrivateKey. Первым параметром он принимает общий секретный ключ, на основе которого шифруется текущий (экземпляр класса, у которого вызывается метод EncodePrivateKey).

Таким образом, у вас будет два экземпляра Gost_28147_89_SymmetricAlgorithm. Первый - общий секретный ключ, его знают обе стороны взаимодействия. Его можно создать, например, на основе секретной фразы, сохранённой в конфигурации приложения. Второй - тот ключ, который вы хотите закодировать в массив байт для передачи.

Вызов выглядит примерно так:

var keyBytes = key.EncodePrivateKey(sharedKey, ...);

Обратный процесс:

var key = sharedKey.DecodePrivateKey(keyBytes, ....);

P.s. Это если мне не изменяет память, сейчас не могу проверить. :)

Относительно Astra Linux и о крипто провайдерах. Затруднительно собрать стенд для разработки, к сожалению, обещать ничего не могу.

vladikKBR85 commented 1 year ago

Огромное спасибо, все получилось!