Использование PRF
Выработка ключа.
public void DeriveKey()
{
// byte[] label
// byte[] seed
// Инициализируем PRF на основе симметричного ключа
// (в данном примере будет сгенерирован случайный).
using (var key = new Gost28147CryptoServiceProvider())
{
using (PrfGost prf = new PrfGost3411_2012_256(
key,
label: label,
seed: seed))
{
// Получаем новый симметричный ключ.
Gost28147 key = prf.DeriveKey();
}
}
}
Выработка последовательности байт.
public void DeriveBytes()
{
// byte[] label
// byte[] seed
// Инициализируем PRF на основе симметричного ключа
// (в данном примере будет сгенерирован случайный).
using (var key = new Gost28147CryptoServiceProvider())
{
using (PrfGost prf = new PrfGost3411_2012_256(
key,
label: label,
seed : seed))
{
// Получаем 256 бит выхода PRF.
byte[] array = prf.DeriveBytes();
}
}
}
Использование KdfTree
public void Deversify()
{
// byte[] label
// byte[] context
// В конструктор может быть передан алгоритм ключа,
// используемый в KdfTree [CALG_GR3412_2015_K,
// CALG_GR3412_2015_M, CALG_G28147]. По умолчанию
// используется CALG_GR3412_2015_K. Ключ будет
// сгенерирован случайно.
//
// Альтернативно можно передать существующий ключ через
// KdfTree(IntPtr keyHandle, IntPtr providerHandle).
// Передав хэндлы из объекта симметричного ключа
// XXXCryptoServiceProvider.
using (var provider = new KdfTree())
{
// Хотим получать провайдер ключа ГОСТ 34.12-2015 Магма.
// Для получения провайдеров прочих алгоритмов ключа
// необходимо использовать соответствующие методы
// DiversifyXXX().
using (var dprov = provider.Diversify3412_2015_M(
label: label,
context: context))
{
// Использование полученного провайдера dprov
// диверсифицированного ключа. В примере
// просто проверяем oid.
var oid = dprov.CipherOid;
Assert.Equal(OID_CP_GOST_R3412_2015_M, oid);
}
}
}
Использование PBKDF
public void TestGen3411_2012_256_34_12_2015_M()
{
// byte[] password
// byte[] salt
// В конструктор может быть передан алгоритм хэша,
// используемый в PBKDF [CALG_PBKDF2_2012_256,
// CALG_PBKDF2_2012_512]. По умолчанию
// используется CALG_PBKDF2_2012_256.
using (var provider = new PbKdf())
{
// Хотим получать провайдер ключа ГОСТ 34.12-2015 Магма.
// Для получения провайдеров прочих алгоритмов ключа
// необходимо использовать соответствующие методы
// DiversifyXXX().
using (var dprov = provider.Gen3412_2015_M(
password: password,
salt: salt))
{
// Использование полученного провайдера dprov
// сгенерированного ключа. В примере
// просто проверяем oid.
var oid = dprov.CipherOid;
Assert.Equal(GostConstants.OID_CP_GOST_R3412_2015_M, oid);
}
}
}