Доброго времени суток! В этой статье я хотел бы рассказать вам, как можно абсолютно безопасно, удобно и приватно засылать ваши данные, куда вам надо. Для меня главным плюсом является то, что зашифрованные данные можно спокойно публиковать в открытом доступе (ведь их все равно никто не прочитает).
И в шифровании нам поможет логика работы https. Почитать получше за неё вы можете тут: https://ru.wikipedia.org/wiki/HTTPS
Нам же понадобится лишь ее часть. Так же нужно иметь представление о симметричном и асимметричном шифровании, нам понадобится RSA (асимметричный алгоритм) и AES (симметричный алгоритм)
Для отправки данных на сервер с ПК, ПК получает от сервера публичный ключ (это из https). В нашем случае приватный ключ лежит на нашем ПК, публичный ключ может быть захардкоджен в нашу программу в виде массива байт:
Для примера взят код на C#, весь проект шифровальщика лежит тут: https://github.com/LYKTRACE/Workplace
Далее, после процедуры упаковки собранных данных в единый файл для простоты шифрования, мы используем только что сгенерированный симметричный AES ключ и нулевой вектор инициализации для шифрования архива с данными.
Далее мы получаем ключ на выходе из функции шифрования и шифруем этот ключ при помощи алгоритма RSA и нашего публичного ключа. Далее мы сохраняем получившийся набор байт в отдельный файл и пакуем зашифрованный архив и файл с зашифрованным ключом в еще один архив. Особенностью асимметричного шифрования является наличие двух ключей: публичного - для шифрования и приватного - для расшифровки зашифрованного публичным ключом, что как раз нам и нужно, так как именно при помощи приватного ключа, который хранится на нашем компьютере мы впоследствии и расшифруем симметричный ключ и сможем расшифровать архив с данными, чего не смогут сделать третьи лица без нашего приватного ключа. Вот так просто мы можем защитить свои данные!
P.S. Не бейте за непрофессионализм написания статей, это пилотная, так сказать:-)
И в шифровании нам поможет логика работы https. Почитать получше за неё вы можете тут: https://ru.wikipedia.org/wiki/HTTPS
Нам же понадобится лишь ее часть. Так же нужно иметь представление о симметричном и асимметричном шифровании, нам понадобится RSA (асимметричный алгоритм) и AES (симметричный алгоритм)
Для отправки данных на сервер с ПК, ПК получает от сервера публичный ключ (это из https). В нашем случае приватный ключ лежит на нашем ПК, публичный ключ может быть захардкоджен в нашу программу в виде массива байт:
Код:
static private byte[] PublicKey = {6,2,0,0,0,164,0,0,82,83,65,49,0,4,0,0,1,0,1,0,225,33,195,138,87,169,156,4,45,76,48,162,156,169,207,205,77,181,102,64,31,201,242,34,106,138,87,192,125,122,119,165,77,3,87,213,56,183,18,195,105,128,169,243,1,72,16,120,124,40,248,68,64,236,91,86,190,50,211,132,246,163,56,82,77,195,62,227,114,80,98,165,78,190,51,190,52,167,233,250,66,140,154,145,143,220,181,149,112,126,184,240,195,216,29,0,186,133,84,184,42,174,186,33,41,114,122,253,177,211,76,189,20,22,222,80,39,159,1,10,208,99,146,138,230,55,103,144};
Далее, после процедуры упаковки собранных данных в единый файл для простоты шифрования, мы используем только что сгенерированный симметричный AES ключ и нулевой вектор инициализации для шифрования архива с данными.
Код:
//Весь код приводить смысла нет, проект есть в репозитории, взял пару функций для демонстрации.
public byte[] EncryptKey(byte[] key, byte[] PublicKey)//шифрование aes ключа публичным ключом
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
rsa.ImportCspBlob(PublicKey);
return rsa.Encrypt(key, true);
}
public void EncryptFile(string inputFile, string outputFile, byte[] skey, byte[] EncryptedKey)//сборка архива с данными
{
try
{
using (RijndaelManaged aes = new RijndaelManaged())
{
byte[] key = skey;
byte[] IV = skey;
using (FileStream fsCrypt = new FileStream(Path.GetDirectoryName(outputFile)+"\\Encrypted", FileMode.Create))
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte)data);
}
}
}
}
}
}
File.WriteAllBytes(Path.GetDirectoryName(outputFile) + "\\key", EncryptedKey);
CompressDirectory(Path.GetDirectoryName(outputFile), outputFile);
File.Delete(Path.GetDirectoryName(outputFile) + "\\Encrypted");
File.Delete(Path.GetDirectoryName(outputFile) + "\\key");
}
catch (Exception ex)
{
// failed to encrypt file
}
}
P.S. Не бейте за непрофессионализм написания статей, это пилотная, так сказать:-)