-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEncToJpg.ps1
More file actions
100 lines (80 loc) · 4.85 KB
/
EncToJpg.ps1
File metadata and controls
100 lines (80 loc) · 4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
function Convert-ImageToCompressedEncryptedBinary {
param (
[string]$ImagePath
)
# Чистим переменные от кавычек, а то в ошибку сыпемся
$ImagePath = $ImagePath -replace '"', ''
# Проверяем что файл вообще существует
if (!(Test-Path $ImagePath)) {
Write-Host "Файл не существует: $ImagePath"
return
}
$Bytes = [System.IO.File]::ReadAllBytes($ImagePath)
$CompressedStream = New-Object System.IO.MemoryStream
$DeflateStream = New-Object System.IO.Compression.DeflateStream ($CompressedStream, [System.IO.Compression.CompressionMode]::Compress)
$DeflateStream.Write($Bytes, 0, $Bytes.Length)
$DeflateStream.Close()
$CompressedBytes = $CompressedStream.ToArray()
$Key = [System.Text.Encoding]::UTF8.GetBytes("9s1ZyTdp3NciKGQdGCeS")
# Да, я знаю что ключ шифрования нельзя хранить в коде, но сам проект пишется просто по приколу, так что целям проекта это не мешает.
# fyi ключ можно заменить в любой момент :)
$Aes = [System.Security.Cryptography.Aes]::Create()
$Aes.Key = $Key + (New-Object byte[] (32 - $Key.Length))
$Aes.IV = New-Object byte[] (16)
$Encryptor = $Aes.CreateEncryptor()
$EncryptedBytes = $Encryptor.TransformFinalBlock($CompressedBytes, 0, $CompressedBytes.Length)
$OutputPath = [System.IO.Path]::ChangeExtension($ImagePath, ".bin")
[System.IO.File]::WriteAllBytes($OutputPath, $EncryptedBytes)
Write-Host "Файл сохранен: $OutputPath"
}
function Convert-EncryptedBinaryToImage {
param (
[string]$EncodedFilePath,
[string]$OutputImagePath
)
# Чистим переменные от кавычек, а то в ошибку сыпемся
$EncodedFilePath = $EncodedFilePath -replace '"', ''
$OutputImagePath = $OutputImagePath -replace '"', ''
# Если URL, то проверяем что он живой. Если Файл, то проверяем что он существует
if ($EncodedFilePath -match "^https?:\/\/.*") {
try {
$EncryptedBytes = Invoke-WebRequest -Uri $EncodedFilePath -UseBasicParsing | Select-Object -ExpandProperty Content
} catch {
Write-Host "Ошибка загрузки файла по URL: $_"
return
}
} elseif (Test-Path $EncodedFilePath) {
$EncryptedBytes = [System.IO.File]::ReadAllBytes($EncodedFilePath)
} else {
Write-Host "Файл не найден: $EncodedFilePath"
return
}
$Key = [System.Text.Encoding]::UTF8.GetBytes("9s1ZyTdp3NciKGQdGCeS")
# Да, я знаю что ключ шифрования нельзя хранить в коде, но сам проект пишется просто по приколу, так что целям проекта это не мешает.
# fyi ключ можно заменить в любой момент :)
$Aes = [System.Security.Cryptography.Aes]::Create()
$Aes.Key = $Key + (New-Object byte[] (32 - $Key.Length))
$Aes.IV = New-Object byte[] (16)
$Decryptor = $Aes.CreateDecryptor()
$DecryptedBytes = $Decryptor.TransformFinalBlock($EncryptedBytes, 0, $EncryptedBytes.Length)
$CompressedStream = New-Object System.IO.MemoryStream (,$DecryptedBytes)
$DeflateStream = New-Object System.IO.Compression.DeflateStream ($CompressedStream, [System.IO.Compression.CompressionMode]::Decompress)
$OutputStream = New-Object System.IO.MemoryStream
$DeflateStream.CopyTo($OutputStream)
$DeflateStream.Close()
$DecompressedBytes = $OutputStream.ToArray()
[System.IO.File]::WriteAllBytes($OutputImagePath, $DecompressedBytes)
Write-Host "Изображение восстановлено: $OutputImagePath"
}
Write-Host "Выберите действие:`n1. Зашифровать изображение`n2. Расшифровать изображение"
$choice = Read-Host "Введите 1 или 2"
if ($choice -eq "1") {
$imagePath = Read-Host "Введите путь к картинке. В формате C:\somedir\somefile.jpg"
Convert-ImageToCompressedEncryptedBinary -ImagePath $imagePath
} elseif ($choice -eq "2") {
$encodedFilePath = Read-Host "Введите путь до закодированного файла или URL с данными в RAW"
$outputImagePath = Read-Host "Введите путь куда сохранить вывод. В формате C:\somedir\somefile.jpg"
Convert-EncryptedBinaryToImage -EncodedFilePath $encodedFilePath -OutputImagePath $outputImagePath
} else {
Write-Host "Неверный ввод. Запустите скрипт заново."
}