open System
open System.IO
open System.Security.Cryptography

// Funkcja do generowania losowego klucza i wektora inicjalizacyjnego
let generateKeyAndIV () =
    let aes = Aes.Create()
    aes.GenerateKey()
    aes.GenerateIV()
    (aes.Key, aes.IV)

// Funkcja do szyfrowania danych
let encryptData (data: byte[]) (key: byte[]) (iv: byte[]) =
    use aesAlg = Aes.Create()
    aesAlg.Key <- key
    aesAlg.IV <- iv
    use encryptor = aesAlg.CreateEncryptor()
    use ms = new MemoryStream()
    use cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)
    cs.Write(data, 0, data.Length)
    cs.Close()
    ms.ToArray()

// Funkcja do deszyfrowywania danych
let decryptData (encryptedData: byte[]) (key: byte[]) (iv: byte[]) =
    use aesAlg = Aes.Create()
    aesAlg.Key <- key
    aesAlg.IV <- iv
    use decryptor = aesAlg.CreateDecryptor()
    use ms = new MemoryStream(encryptedData)
    use cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)
    let decrypted = Array.zeroCreate<byte> encryptedData.Length
    cs.Read(decrypted, 0, decrypted.Length) |> ignore
    decrypted

// Funkcja do zapisywania danych do pliku
let writeToFile (filePath: string) (data: byte[]) =
    File.WriteAllBytes(filePath, data)

// Funkcja do odczytywania danych z pliku
let readFromFile (filePath: string) =
    File.ReadAllBytes(filePath)

// Funkcja główna programu
let main () =
    Console.WriteLine("Podaj ścieżkę do pliku, który chcesz zaszyfrować:")
    let filePath = "P:\kurs c#\kod\szyfr.txt"
    
    try
        let dataToEncrypt = readFromFile filePath

        let (key, iv) = generateKeyAndIV ()
        let encryptedData = encryptData dataToEncrypt key iv

        let encryptedFilePath = "P:\kurs c#\kod\szyfr1.txt"
        writeToFile encryptedFilePath encryptedData

        Console.WriteLine("Plik zaszyfrowany pomyślnie zapisany.")

        let encryptedFilePath2 = "P:\kurs c#\kod\szyfr1.txt"
        let encryptedData2 = readFromFile encryptedFilePath2

        let decryptedData = decryptData encryptedData2 key iv

        let decryptedFilePath = "P:\kurs c#\kod\szyfr2.txt"
        writeToFile decryptedFilePath decryptedData

        Console.WriteLine("Plik odszyfrowany pomyślnie zapisany.")
    with
        | ex -> Console.WriteLine(sprintf "Wystąpił błąd: %s" ex.Message)

// Wywołanie funkcji głównej
main()
