Создание ключей для шифрования и расшифровки
Создание ключей и управление ими — важная часть криптографического процесса. Использование симметричных алгоритмов требует создания ключа и вектора инициализации (IV), которые должны храниться в секрете от всех лиц, которые не имеют права на расшифровку данных. Для использования асимметричных алгоритмов требуется создание открытого и закрытого ключей. Открытый ключ может быть предоставлен кому угодно, в то время как закрытый ключ известен только лицу, которое должно расшифровать данные, зашифрованные с помощью открытого ключа. В разделе описывается создание ключей и управление ими в случае использования как симметричного, так и асимметричного алгоритмов шифрования.
Симметричные ключи
Классы симметричного шифрования, предоставляемые .NET Framework, для шифрования и расшифровки данных требуют ключ и новый вектор инициализации (IV). При создании с помощью стандартного конструктора нового экземпляра одного из управляемых классов симметричного шифрования, автоматически создаются новые ключ и вектор инициализации. Любое лицо, которому требуется разрешить расшифровать данные, должно иметь такие же ключ и вектор инициализации, а также использовать тот же самый алгоритм шифрования. Обычно новые ключ и вектор инициализации следует создавать заново для каждого очередного сеанса связи, и их не следует сохранять для использования в следующем сеансе.
Для передачи симметричного ключа и вектора инициализации удаленной стороне они обычно шифруются с помощью асимметричного шифрования. Пересылка ключа и вектора инициализации через незащищенную сеть без их шифрования является небезопасной, так как любое лицо, перехватившее их, сможет расшифровывать данные. Дополнительные сведения о шифровании и пересылке ключа и вектора инициализации см. в разделе Создание криптографической схемы.
В следующем примере демонстрируется создание нового экземпляра класса TripleDESCryptoServiceProvider, реализующего алгоритм TripleDES.
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
При выполнении этого кода создаются новые ключ и вектор инициализации, которые присваиваются свойствам Key и IV соответственно.
Иногда может понадобиться создать множество ключей. В этой ситуации можно создать новый экземпляр класса, реализующего симметричный алгоритм, а затем создавать новые ключ и вектор инициализации с помощью методов GenerateKey и GenerateIV. Приведенный ниже в качестве примера код демонстрирует, как создавать новые ключи и векторы инициализации после того, как создан новый экземпляр класса асимметричного шифрования.
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();
В процессе выполнения этого кода ключ и вектор инициализации создаются при создании нового экземпляра TripleDESCryptoServiceProvider. Другие ключ и вектор инициализации создаются при вызове методов GenerateKey и GenerateIV.
Асимметричные ключи
Для осуществления асимметричного шифрования в .NET Framework предоставляются классы RSACryptoServiceProvider и DSACryptoServiceProvider. Эти классы создают набор из открытого и закрытого ключей при использовании стандартного конструктора для создания нового экземпляра класса. Асимметричные ключи могут либо храниться для использования в нескольких сеансах, либо создаваться отдельно для каждого сеанса. В то время как открытый ключ можно сделать общедоступным, закрытый ключ должен быть надежно защищен.
Генерация набора, состоящего из открытого и закрытого ключей, осуществляется при создании нового экземпляра класса асимметричного алгоритма. После создания нового экземпляра класса можно извлечь информацию о ключе одним из двух способов.
Метод ToXMLString возвращает информацию о ключе в формате XML.
Метод ExportParameters, который возвращает структуру RSAParameters, содержащую ключевые сведения.
Оба метода принимают в качестве параметра логическое значение, которое показывает, следует ли возвращать сведения только об открытом ключе или же и об открытом, и о закрытом ключах. Класс RSACryptoServiceProvider может быть инициализирован значением структуры RSAParameters с помощью метода ImportParameters.
Асимметричные закрытые ключи никогда не должны храниться в распечатанном виде или в виде простого текста на локальном компьютере. Если необходимо хранить закрытый ключ, следует использовать для этого контейнер ключа. Дополнительные сведения о хранении закрытого ключа в контейнере ключа см. в разделе Практическое руководство. Хранение асимметричных ключей в контейнере ключей.
В следующем примере создается новый экземпляр класса RSACryptoServiceProvider, создающий открытый и закрытый ключи, и сведения об открытом ключе записываются в структуру RSAParameters.
'Generate a public/private key pair.
Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider()
'Save the public key information to an RSAParameters structure.
Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
См. также
Задачи
Практическое руководство. Хранение асимметричных ключей в контейнере ключей