Создание ключей для шифрования и расшифровки

Создание ключей и управление ими — это важная часть процесса шифрования. Симметричные алгоритмы требуют создания ключа и вектора инициализации (IV). Этот ключ должен быть секретом от тех, кто не должен расшифровывать данные. IV не должен быть секретом, но следует изменить для каждого сеанса. Асимметричные алгоритмы требуют создания открытого ключа и закрытого ключа. Открытый ключ может быть известен любому пользователю, но расшифровка должна знать только соответствующий закрытый ключ. В этом разделе описывается создание ключей и управление ими для симметричных и асимметричных алгоритмов.

Симметричные ключи

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

Для обмена симметричным ключом и IV с удаленной стороной обычно шифруется симметричный ключ с помощью асимметричного шифрования. Отправка ключа в небезопасной сети без шифрования небезопасна, так как любой, кто перехватывает ключ, и IV может расшифровать данные.

В следующем примере показано создание нового экземпляра класса реализации по умолчанию для алгоритма Aes :

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

Выполнение предыдущего кода создает новый ключ и IV и задает их в качестве значений для свойств Key и IV соответственно.

Иногда может понадобиться создать несколько ключей. В этой ситуации можно создать новый экземпляр класса, реализующего симметричный алгоритм. Затем создайте новый ключ и IV, вызвав GenerateKey методы и GenerateIV методы. В следующем примере кода показано, как создать новые ключи и IVs после создания нового экземпляра симметричного криптографического класса:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

Выполнение предыдущего кода создает новый экземпляр Aes и создает ключ и IV. При вызове и методах создается GenerateKey еще один ключ и GenerateIV IV.

Асимметричные ключи

.NET предоставляет RSA класс для асимметричного шифрования. При использовании метода без Create() параметров для создания нового экземпляра RSA класс создает пару открытого и закрытого ключа. Асимметричные ключи можно сохранять для использования в нескольких сеансах или создавать только для отдельного сеанса. Хотя вы можете сделать открытый ключ доступным, необходимо внимательно защитить закрытый ключ.

Пара открытого и закрытого ключа создается при создании нового экземпляра асимметричного класса алгоритма. После создания нового экземпляра класса можно извлечь ключевые сведения с помощью ExportParameters метода. Этот метод возвращает структуру, содержащую ключевые RSAParameters сведения. Метод также принимает логическое значение, указывающее, следует ли возвращать только сведения с открытым ключом или возвращать как открытый ключ, так и сведения о закрытом ключе.

Вы также можете использовать другие методы для извлечения ключевых сведений, таких как:

Метод можно использовать ImportParameters для инициализации RSA экземпляра RSAParameters в значение структуры. Или можно использовать RSA.Create(RSAParameters) метод для создания нового экземпляра.

Никогда не храните асимметричные закрытые ключи или как обычный текст на локальном компьютере. Если необходимо сохранить закрытый ключ, необходимо использовать контейнер ключей. Дополнительные сведения о хранении закрытого ключа в контейнере ключей см. в разделе "Практическое руководство. Хранение асимметричных ключей в контейнере ключей".

В следующем примере кода создается новый экземпляр класса, создается пара открытого и закрытого ключа и сохраняется информация открытого RSA ключа в RSAParameters структуре:

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

См. также