230 lines
9.6 KiB
C#

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MyApplication
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
const int STD_PORT = 1234;
const string STD_IP = "127.0.0.1";
const int STD_BUFF = 256;
string fileName = "";
public MainWindow()
{
InitializeComponent();
}
private void Select_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.FileName = ""; // Default file name
dialog.DefaultExt = "*."; // Default file extension
dialog.Filter = "All|*.*"; // Filter files by extension
bool? result = dialog.ShowDialog();
if (result == true)
{
fileName = dialog.FileName;
lableAddress.Content = fileName;
send_Button.IsEnabled = true;
}
}
private void Send_Click(object sender, RoutedEventArgs e)
{
lableFinish.Content = "";
Send();
}
private void Recive_Click(object sender, RoutedEventArgs e)
{
lableFinish.Content = "";
Recive();
}
private void Recive()
{
string downloadsPath = KnownFolders.GetPath(KnownFolder.Downloads);
TcpListener tcpListener = new TcpListener(IPAddress.Parse(STD_IP), STD_PORT);
tcpListener.Start();
using TcpClient tcpClient = tcpListener.AcceptTcpClient();
using NetworkStream networkStream = tcpClient.GetStream();
//--------------------------------------------------------------------------------------------------Recive Name of File------------------------------------
byte[] buffer = new byte[STD_BUFF];
int readBytes = networkStream.Read(buffer, 0, buffer.Length);
if (readBytes < 0) return;
string fileName = Encoding.UTF8.GetString(buffer,0, readBytes);
string fileDestination = downloadsPath + "\\" + fileName;
lableFileName.Content = fileDestination;
//-----------------------------------------------------------------------------------------------Send Size of File------------------------------------
buffer = new byte[STD_BUFF];
readBytes = networkStream.Read(buffer, 0, buffer.Length);
if (readBytes < 0) return;
int bufferCount = BitConverter.ToInt32(buffer, 0);
lableSize.Content = bufferCount.ToString();
//-------------------------------------------------------------------------------------------------ECDiffieHellmanCng--------------------
using ECDiffieHellmanCng eCDiffieHellmanCng = new ECDiffieHellmanCng();
eCDiffieHellmanCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
eCDiffieHellmanCng.HashAlgorithm = CngAlgorithm.Sha256;
byte[] myPublicKey = eCDiffieHellmanCng.PublicKey.ToByteArray();
networkStream.Write(myPublicKey, 0, myPublicKey.Length);
byte[] therePublicKey = new byte[140];
readBytes = networkStream.Read(therePublicKey, 0, therePublicKey.Length);
if (readBytes < 0) return;
CngKey thereKey = CngKey.Import(therePublicKey, CngKeyBlobFormat.EccPublicBlob);
byte[] Key = eCDiffieHellmanCng.DeriveKeyMaterial(thereKey);
using Aes aes = Aes.Create();
aes.Key = Key;
aes.IV = Encoding.UTF8.GetBytes("sestnajst1616161");
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
using CryptoStream cryptoStream = new CryptoStream(networkStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
using FileStream fileStream = new FileStream(fileDestination, FileMode.OpenOrCreate);
for (int i = 0; i < bufferCount; i++)
{
buffer = new byte[STD_BUFF];
readBytes = cryptoStream.Read(buffer, 0, buffer.Length);
fileStream.Write(buffer, 0, readBytes);
}
cryptoStream.Close();
aes.Clear();
eCDiffieHellmanCng.Clear();
networkStream.Close();
tcpClient.Close();
tcpListener.Stop();
lableFinish.Content = "finished";
}
void Send()
{
using TcpClient tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse(STD_IP), STD_PORT);
using NetworkStream networkStream = tcpClient.GetStream();
//--------------------------------------------------------------------------------------------------Send Name of File------------------------------------
string[] fileNames = fileName.Split("\\");
byte[] nameInBytes = Encoding.UTF8.GetBytes(fileNames.Last());
networkStream.Write(nameInBytes, 0, nameInBytes.Length);
lableFileName.Content = fileName;
using FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Read);
//-----------------------------------------------------------------------------------------------Send Size of File------------------------------------
int bufferCount = Convert.ToInt32(Math.Ceiling((double)fileStream.Length / (double)STD_BUFF));
byte[] size = BitConverter.GetBytes(bufferCount);
networkStream.Write(size, 0, size.Length);
lableSize.Content = bufferCount.ToString();
//-------------------------------------------------------------------------------------------------ECDiffieHellmanCng--------------------
using ECDiffieHellmanCng eCDiffieHellmanCng = new ECDiffieHellmanCng();
eCDiffieHellmanCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
eCDiffieHellmanCng.HashAlgorithm = CngAlgorithm.Sha256;
//----------------------------------------------------------------------Send my key--------------
byte[] myPublicKey = eCDiffieHellmanCng.PublicKey.ToByteArray();
networkStream.Write(myPublicKey, 0, myPublicKey.Length);
//-------------------------------------------------------------------Recive there key and create private key------------------------
byte[] therePublicKey = new byte[140];
int readByte = networkStream.Read(therePublicKey, 0, therePublicKey.Length);
if (readByte < 0) return;
CngKey thereKey = CngKey.Import(therePublicKey, CngKeyBlobFormat.EccPublicBlob);
byte[] Key = eCDiffieHellmanCng.DeriveKeyMaterial(thereKey);
//---------------------------------------------------------------------------AES Crete
using Aes aes = Aes.Create();
aes.Key = Key;
aes.IV = Encoding.UTF8.GetBytes("sestnajst1616161");
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
//----------------------------------------------------------------------------Create crypto strim
using CryptoStream cryptoStream = new CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Read);
for(int i = 0; i < bufferCount+1; i++)
{
byte[] buffer = new byte[STD_BUFF];
int returndCaunt = cryptoStream.Read(buffer, 0, buffer.Length);
networkStream.Write(buffer, 0, returndCaunt);
}
cryptoStream.Close();
aes.Clear();
eCDiffieHellmanCng.Clear();
networkStream.Close();
networkStream.Close();
tcpClient.Close();
lableFinish.Content = "finished";
}
public enum KnownFolder
{
Contacts,
Downloads,
Favorites,
Links,
SavedGames,
SavedSearches
}
public static class KnownFolders
{
private static readonly Dictionary<KnownFolder, Guid> _guids = new()
{
[KnownFolder.Contacts] = new("56784854-C6CB-462B-8169-88E350ACB882"),
[KnownFolder.Downloads] = new("374DE290-123F-4565-9164-39C4925E467B"),
[KnownFolder.Favorites] = new("1777F761-68AD-4D8A-87BD-30B759FA33DD"),
[KnownFolder.Links] = new("BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968"),
[KnownFolder.SavedGames] = new("4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4"),
[KnownFolder.SavedSearches] = new("7D1D3A04-DEBB-4115-95CF-2F29DA2920DA")
};
public static string GetPath(KnownFolder knownFolder)
{
return SHGetKnownFolderPath(_guids[knownFolder], 0);
}
[DllImport("shell32",
CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
private static extern string SHGetKnownFolderPath(
[MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags,
nint hToken = 0);
}
}
}