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); }
/// <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); }
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); }