Инструмент: OS-Windows 7 64bit, Visual Studio 2012, 4.5 .NET Framework. Язык: C#.Как защитить закрытый ключ (от Triple DES) в приложении C#?
Я создал одно консольное приложение. В этом приложении я использовал алгоритм шифрования данных (DES-Symmetric Algorithm) для шифрования и дешифрования данных.
Теперь в этом подходе используется закрытый или секретный ключ. Я хочу защитить этот ключ от клиента/Hack. Как я могу его защитить?
На данный момент я сохранил KEY в реестре и прочитал этот ключ из реестра для шифрования и дешифрования, когда это необходимо. Но из реестра любой знающий разработчик, как вы, ребята, может легко прочитать ключ.
Ниже мой DES код алгоритма (я получил этот код из MSDN):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace DES_Encrypt_Decrypt
{
public class Program
{
static void Main(string[] args)
{
var text = "This is Plain Text";
var encryptedText = CryptoGraphyExample.EncryptPlainTextToCipherText(text);
var decryptedText = CryptoGraphyExample.DecryptCipherTextToPlainText(encryptedText);
Console.WriteLine("Passed Text = " + text);
Console.WriteLine("EncryptedText = " + encryptedText);
Console.WriteLine("DecryptedText = " + decryptedText);
Console.ReadLine();
}
}
public class CryptoGraphyExample
{
private const string _securityKey = "MyComplexKey";
// This is my secret key and I want to secure it to the client machine.
public static string EncryptPlainTextToCipherText(string PlainText)
{
byte[] toEncryptedArray = UTF8Encoding.UTF8.GetBytes(PlainText);
MD5CryptoServiceProvider objMD5CryptoService = new MD5CryptoServiceProvider();
byte[] securityKeyArray = objMD5CryptoService.ComputeHash(UTF8Encoding.UTF8.GetBytes(_securityKey));
objMD5CryptoService.Clear();
var objTripleDESCryptoService = new TripleDESCryptoServiceProvider();
objTripleDESCryptoService.Key = securityKeyArray;
objTripleDESCryptoService.Mode = CipherMode.ECB;
objTripleDESCryptoService.Padding = PaddingMode.PKCS7;
var objCrytpoTransform = objTripleDESCryptoService.CreateEncryptor();
byte[] resultArray = objCrytpoTransform.TransformFinalBlock(toEncryptedArray, 0, toEncryptedArray.Length);
objTripleDESCryptoService.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string DecryptCipherTextToPlainText(string CipherText)
{
byte[] toEncryptArray = Convert.FromBase64String(CipherText);
MD5CryptoServiceProvider objMD5CryptoService = new MD5CryptoServiceProvider();
byte[] securityKeyArray = objMD5CryptoService.ComputeHash(UTF8Encoding.UTF8.GetBytes(_securityKey));
objMD5CryptoService.Clear();
var objTripleDESCryptoService = new TripleDESCryptoServiceProvider();
objTripleDESCryptoService.Key = securityKeyArray;
objTripleDESCryptoService.Mode = CipherMode.ECB;
objTripleDESCryptoService.Padding = PaddingMode.PKCS7;
var objCrytpoTransform = objTripleDESCryptoService.CreateDecryptor();
byte[] resultArray = objCrytpoTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
objTripleDESCryptoService.Clear();
return UTF8Encoding.UTF8.GetString(resultArray);
}
}
}
У вас есть аппаратный модуль безопасности? –
Нет. На самом деле я хочу использовать этот подход для защиты ключа продукта. Я буду шифровать ключ продукта. И для этого мне нужен один закрытый ключ, который я упоминаю в коде. Поэтому я хочу получить секретный ключ, поэтому никто не может получить этот ключ. Потому что, если раз декомпилировать код, Key будет легко виден. – Jaimesh
Итак, вам нужно решение DRM. Нет совершенной безопасности или даже хорошей безопасности. –