Шифрование может помочь защитить данные от просмотра и изменения, а также обеспечить безопасные средства связи по незащищенным каналам. Например, данные могут быть зашифрованы с использованием алгоритма шифрования, переданы в зашифрованном состоянии, а затем расшифрованы предполагаемым получателем. Если третья сторона перехватит зашифрованные данные, расшифровать их будет сложно.
Для достижения этих целей вы создаете схемы шифрования, используя комбинацию алгоритмов и соглашений, называемых примитивами шифрования. Включая шифрование с закрытым ключом (симметричное шифрование), шифрование с открытым ключом (асимметричное шифрование), криптографические подписи и криптографические хэши.
Для реализации алгоритма регистрационного кода мы используем шифрование с открытым ключом (асимметричное шифрование).
При шифровании с открытым ключом используется закрытый ключ, который должен храниться в секрете от неавторизованных пользователей, и открытый ключ, который может быть доступен кому угодно. И открытый, и закрытый ключи математически связаны; данные, зашифрованные с помощью открытого ключа, можно расшифровать только с помощью закрытого ключа, а данные, подписанные с помощью закрытого ключа, можно проверить только с помощью открытого ключа.
Что касается регистрационного кода, мы используем закрытый ключ для подписи строки (имя пользователя), а затем используем открытый ключ для проверки подписи (регистрационный код). Поскольку открытый ключ можно использовать только для проверки, мы можем с уверенностью распространять открытый ключ; закрытый ключ используется для подписи, поэтому закрытый ключ должен храниться в руках разработчика. Таким образом достигается цель сертификации регистрации. Все программное обеспечение, зарегистрированное в настоящее время в режиме «имя пользователя, регистрационный код», должно использовать эту технологию.
Сначала мы генерируем открытый ключ и закрытый ключ, которые хотим использовать.
Частный rsa как новый Security.Cryptography.RSACryptoServiceProvider
Класс RSACryptoServiceProvider предоставляет реализацию алгоритма RSA для выполнения асимметричного шифрования и дешифрования. Нужные нам открытый и закрытый ключи можно сгенерировать с помощью ToXMLString.
rsa.ToXmlString(False)
rsa.ToXmlString(True)
Если параметр имеет значение False, будет создан только открытый ключ; если значение True, будут сгенерированы как открытый ключ, так и закрытый ключ. Обычно мы получаем строку открытого ключа через ToXmlString(False); получаем строку закрытого ключа через ToXmlString(True) (хотя она содержит открытый ключ). Мы можем сохранить эти два ключа на локальном компьютере, определить и использовать их через строковые константы. Другими словами, наша регистрационная информация будет использовать уникальные открытые и закрытые ключи.
Затем мы подписываем указанную строку открытым и закрытым ключами.
rsa.FromXmlString(PRIVATE_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)
Dim sha As New Security .Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(result)
SerialNumber = Convert.ToBase64String(regkey)
Повторно инициализировать объект rsa с помощью только что полученного закрытого ключа , а затем подпись выполняется через класс RSAPKCS1SignatureFormatter. Мы преобразуем входную строку в массив байтов (наше имя пользователя по умолчанию может состоять только из символов ASCII) и вычисляем ее хэш-значение с помощью алгоритма хеширования SHA1. Затем используйте метод CreateSignature, чтобы подписать полученное значение хеш-функции. Наконец, мы конвертируем полученный массив байтов в строку в качестве регистрационного кода. Это процесс генерации регистрационного кода. Мы можем повторно использовать эту программу для подписи разных имен пользователей и получения соответствующих им разных регистрационных кодов.
Наконец, мы проверяем имя пользователя и регистрационный код, которые мы только что получили.
rsa.FromXmlString(PUBLIC_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() As Byte = Convert.FromBase64String(SerialNumber)
Dim sha As New Security.Cryptography.SHA1Managed
Dim name () As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Result = f.VerifySignature(name, key)
На этот раз мы используем открытый ключ для инициализации объекта rsa, а затем проверяем подпись через класс RSAPKCS1SignatureDeformatter. Обратно преобразуем полученный регистрационный код в массив байтов и выполняем расчет хеша имени пользователя для получения значения хеш-функции; Наконец, проверьте его через VerifySignature.
Как видно из приведенной выше программы, для генерации регистрационного кода требуется закрытый ключ (закрытый ключ сопровождается информацией об открытом ключе), и может быть сгенерировано любое количество пар имени пользователя и регистрационного кода. С помощью открытого ключа мы можем только проверять, но не генерировать. Таким образом, открытый ключ можно безопасно раздать всем пользователям для проверки, а закрытый ключ — нет. Таким образом, открытый ключ и алгоритм проверки могут быть включены в выпущенную версию. Потому что даже если пользователь получит открытый ключ и алгоритм проверки, его нелегко взломать.
Популярные сегодня регистрационные машины в Интернете в основном взламывают закрытый ключ программного обеспечения, тем самым обеспечивая неограниченное создание необходимой регистрационной информации. Но если пользователи декомпилируют ваш продукт и изменят промежуточный код, это обойдет логику принятия решения о регистрации. Это не проблема, которую может решить данная статья. Потому что даже если вы используете технологию веб-сервиса для онлайн-активации или регистрации, вы все равно можете анализировать информацию о сервере посредством прослушивания сети и имитировать поддельный сервер.
http://www.cnblogs.com/farrio/archive/2006/12/01/579296.html