Esempio n. 1
0
        private void ReciveNewFile(Message message)
        {
            var fields = message.StringMessage.Split('$');

            if (fields.Length < 3)
            {
                SendResult(false, "Параметры неверны");
            }
            var transferId     = fields[0];
            var rsaParamKey    = fields[1];
            var newFileKey     = fields[2];
            var transferParams = _dbController.GetTransferParams(transferId);

            if (transferParams == null)
            {
                SendResult(false, "Файл не найден");
                return;
            }
            SHA1 hash             = SHA1.Create();
            var  rsaParamsKeyHash = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(rsaParamKey)));
            var  rsaFilePath      = _dbController.GetPrivateKeyPath(_userId, rsaParamsKeyHash);

            if (rsaFilePath == null)
            {
                SendResult(false, "Неверный ключ обмена");
                return;
            }
            CryptoController crypto = new CryptoController();
            var oldFileKeyBytes     = crypto.DecryptDataWithRsaFile(rsaFilePath, rsaParamKey,
                                                                    StringToByteConverter(transferParams[2]));

            if (oldFileKeyBytes == null)
            {
                SendResult(false, "Ошибка извлечения ключа файла");
                return;
            }
            var oldFileKey = ByteToStringConverter(oldFileKeyBytes);

            crypto.ChangeEncryptKey(transferParams[0], oldFileKey, newFileKey);
            string fileHash;
            string fileLength;

            using (FileStream fs = new FileStream(transferParams[0], FileMode.Open))
            {
                fileHash   = ByteToStringConverter(hash.ComputeHash(fs));
                fileLength = fs.Length.ToString();
            }
            var newFileHash = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(newFileKey)));

            _dbController.SaveNewPrivateFile(transferParams[1], transferParams[0],
                                             fileLength, fileHash, true, newFileHash);
            _dbController.UpdateTransferStatus(transferId);
            SendResult(true);
        }
Esempio n. 2
0
        /// <summary>
        /// Смена ключа шифрования файла
        /// Или его установка, если файл еще не зашифрован
        /// </summary>
        /// <param name="message"></param>
        private void ChangeFileKey(Message message)
        {
            var fields = message.StringMessage.Split('$');

            if (fields.Length < 3)
            {
                SendResult(false, "Неверные параметры");
            }
            SHA1             hash     = SHA1.Create();
            var              fileKey  = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(fields[1])));
            CryptoController crypto   = new CryptoController();
            var              filePath = _dbController.GetPrivateFilePath(fields.First(), fileKey);

            if (filePath == null)
            {
                SendResult(false, "Неверный ключ");
                return;
            }
            crypto.ChangeEncryptKey(filePath, fields[1], fields[2]);
            fileKey = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(fields[2])));
            _dbController.UpdateFileKey(fields[0], fileKey);
            SendResult(true, String.Empty);
        }
Esempio n. 3
0
        private void ShareFile(Message message)
        {
            var fields = message.StringMessage.Split('$');

            if (fields.Length < 5)
            {
                SendResult(false, "Параметры неверны");
            }
            var  userIdTo     = fields[0];
            var  fileId       = fields[1];
            var  fileName     = fields[2];
            var  fileKey      = fields[3];
            var  comment      = fields[4];
            var  sendFilePath = CreatePrivateFileName(fileName);
            SHA1 hash         = SHA1.Create();
            var  fileKeyHash  = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(fileKey)));
            var  filePath     = _dbController.GetPrivateFilePath(fileId, fileKeyHash);

            if (filePath == null)
            {
                SendResult(false, "Неверный ключ");
                return;
            }
            if (!File.Exists(filePath))
            {
                SendResult(false, "Файл не найден в файловой системе. Ошибка сервера");
                Console.WriteLine("Файл не найден в файловой системе: " + filePath);
                return;
            }
            try
            {
                File.Copy(filePath, sendFilePath);
            }
            catch (Exception)
            {
                SendResult(false, "Не удалось отправть файл");
                return;
            }
            var rsaPublicFile = _dbController.GetPublicKeyPath(userIdTo);

            if (String.IsNullOrEmpty(rsaPublicFile) || !_dbController.GetUserShareState(userIdTo))
            {
                SendResult(false, "Пользователь не имеет открытого ключа или запретил получение файлов");
                try
                {
                    File.Delete(sendFilePath);
                }
                catch (Exception)
                {
                    //
                }
                return;
            }
            var newFileKey          = GenerateNewFileKey(10);
            CryptoController crypto = new CryptoController();

            crypto.ChangeEncryptKey(sendFilePath, fileKey, newFileKey);
            newFileKey = ByteToStringConverter(crypto.EncryptDataWithRsaFile(rsaPublicFile,
                                                                             StringToByteConverter(newFileKey)));
            _dbController.ShareFile(sendFilePath, fileName, userIdTo, newFileKey, comment);
            SendResult(true);
        }