Что нового

Как зашифровать картинку формата .jpg ?

urrya

Новичок
Сообщения
159
Репутация
1
Доброго времени суток гос-да и возможно дамы.
Помогите пожалуйста зашифровать картинку jpg формата.
Я могу конечно это сделать с помощью архиватора, но это не то что надо.
Может быть зашифровку картинки возможно сделать как то силами Autoit ?

К примеру текстовый файл я шифрую вот так -
Код:
Global $iDs = StringRegExpReplace("TestText 091", "[ ]", "")
$iDs = StringRegExpReplace($iDs, "[1]", "Q")
$iDs = StringRegExpReplace($iDs, "[2]", "W")
$iDs = StringRegExpReplace($iDs, "[3]", "E")
$iDs = StringRegExpReplace($iDs, "[4]", "R")
$iDs = StringRegExpReplace($iDs, "[5]", "T")
;--------------------------------------------------
$iDs = StringRegExpReplace($iDs, "[A]", "1")
$iDs = StringRegExpReplace($iDs, "[S]", "2")
$iDs = StringRegExpReplace($iDs, "[D]", "3")
$iDs = StringRegExpReplace($iDs, "[F]", "4")
$iDs = StringRegExpReplace($iDs, "[G]", "5")


но с картинкой этого не сделать к сожалению .

:scratch:
 

joiner

Модератор
Локальный модератор
Сообщения
3 061
Репутация
513
а зачем? :smile:
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
joiner сказал(а):
Пишу программку, которая умеет делать картинки, но надо что бы эти самые "картинки" можно было просматривать только моей программкой.
;)
 

joiner

Модератор
Локальный модератор
Сообщения
3 061
Репутация
513
можно использовать сжатие. в исходнике Autoit3Wrapper есть функции _WinAPI_LZNTCompress и _WinAPI_LZNTDecompress
картинки читаем в бинарном режиме и сжимаем а потом , когда нужно просмотреть, наоборот делаем.
можно , как мне кажется, разбить картинку на блоки, к примеру, 10. и записать их в другом порядке. :smile:
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
joiner сказал(а):
можно использовать сжатие. в исходнике Autoit3Wrapper есть функции _WinAPI_LZNTCompress и _WinAPI_LZNTDecompress
картинки читаем в бинарном режиме и сжимаем а потом , когда нужно просмотреть, наоборот делаем.
можно , как мне кажется, разбить картинку на блоки, к примеру, 10. и записать их в другом порядке. :smile:
интересная идея по поводу разбития на блоки, а можно не большой пример кода с пояснениями?
:scratch:


Тема решена.
Нашёл что нужно ;)

http://autoit-script.ru/index.php?topic=4881.45
 

joiner

Модератор
Локальный модератор
Сообщения
3 061
Репутация
513
сделал "по быстрому", но работает. скорее всего есть алгоритм получше
нужна одна картинка. в моем коде это foto.jpg
Код:
$fotos = @ScriptDir & '\foto.jpg';исходный файл
$fotod = @ScriptDir & '\foto1.jpg';перемешанный
$fos = FileOpen($fotos, 16)
$fr = FileRead($fos)
$part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
$strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
Local $i = 1
While 1
	$frp = FileRead($fos, $part)
	If @error = -1 Then ExitLoop
	DllStructSetData($strfile, $i, $frp)
	$i += 1
WEnd
FileClose($fos)
;пишем, смещая блоки
$fod = FileOpen($fotod, 18)
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 1))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 2))
FileClose($fod)
;----------------------------------------------------------------------------------------------
;приводим в прежний вид
$new = @ScriptDir & '\new.jpg';читаемый как исходный
$fotod = @ScriptDir & '\foto1.jpg';перемешанный
$fos = FileOpen($fotod, 16)
$fr = FileRead($fos)
$part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
$strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
Local $i = 1
While 1
	$frp = FileRead($fos, $part)
	If @error = -1 Then ExitLoop
	DllStructSetData($strfile, $i, $frp)
	$i += 1
WEnd
FileClose($fos)
;пишем, смещая блоки
$fod = FileOpen($new, 18)
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 2))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 1))
FileClose($new)
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
joiner сказал(а):
сделал "по быстрому", но работает. скорее всего есть алгоритм получше
нужна одна картинка. в моем коде это foto.jpg
Код:
$fotos = @ScriptDir & '\foto.jpg';исходный файл
$fotod = @ScriptDir & '\foto1.jpg';перемешанный
$fos = FileOpen($fotos, 16)
$fr = FileRead($fos)
$part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
$strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
Local $i = 1
While 1
	$frp = FileRead($fos, $part)
	If @error = -1 Then ExitLoop
	DllStructSetData($strfile, $i, $frp)
	$i += 1
WEnd
FileClose($fos)
;пишем, смещая блоки
$fod = FileOpen($fotod, 18)
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 1))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 2))
FileClose($fod)
;----------------------------------------------------------------------------------------------
;приводим в прежний вид
$new = @ScriptDir & '\new.jpg';читаемый как исходный
$fotod = @ScriptDir & '\foto1.jpg';перемешанный
$fos = FileOpen($fotod, 16)
$fr = FileRead($fos)
$part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
$strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
Local $i = 1
While 1
	$frp = FileRead($fos, $part)
	If @error = -1 Then ExitLoop
	DllStructSetData($strfile, $i, $frp)
	$i += 1
WEnd
FileClose($fos)
;пишем, смещая блоки
$fod = FileOpen($new, 18)
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 2))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 1))
FileClose($new)

Большое спасибо за участие!
:beer:


отлично работает -
Код:
Global $fotos = @DesktopDir & '\111.jpg';исходный файл
Global $fotod = @DesktopDir & '\222.jpg';перемешанный
Global $fos = FileOpen($fotos, 16)
Global $fr = FileRead($fos)
Global $part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
Global $strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
Global $i = 1
Do
    $frp = FileRead($fos, $part)
    If @error = -1 Then ExitLoop
    DllStructSetData($strfile, $i, $frp)
    $i += 1
Until $i = 6
FileClose($fos)
;пишем, смещая блоки
Global $fod = FileOpen($fotod, 18)
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 1))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 2))
FileClose($fod)

;----------------------------------------------------------------------------------------------
;приводим в прежний вид
$new = @DesktopDir & '\333.jpg'  ;перемешанный
$fotod = @DesktopDir & '\222.jpg';читаемый как исходный
$fos = FileOpen($fotod, 16)
$fr = FileRead($fos)
$part = Ceiling(BinaryLen($fr) / 5)
FileSetPos($fos, 0, 0)
$strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
$i = 1
Do
    $frp = FileRead($fos, $part)
    If @error = -1 Then ExitLoop
    DllStructSetData($strfile, $i, $frp)
    $i += 1
Until $i = 6
FileClose($fos)
;пишем, смещая блоки
$fod = FileOpen($new, 18)
FileWrite($fod, DllStructGetData($strfile, 3))
FileWrite($fod, DllStructGetData($strfile, 5))
FileWrite($fod, DllStructGetData($strfile, 2))
FileWrite($fod, DllStructGetData($strfile, 4))
FileWrite($fod, DllStructGetData($strfile, 1))
FileClose($fod)
 

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
Что то я не понял как это работает. Зашифровать то зашифровалось. А конечный 333.jpg не расшифрован.
Что надо сделать для того чтоб работало?
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
VermanVendetta13 сказал(а):
Что то я не понял как это работает. Зашифровать то зашифровалось. А конечный 333.jpg не расшифрован.
Что надо сделать для того чтоб работало?
вот как раз таки 333.jpg уже расшифрован, а 222.jpg это зашифрованная картинка ;)
 

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
urrya сказал(а):
VermanVendetta13 сказал(а):
Что то я не понял как это работает. Зашифровать то зашифровалось. А конечный 333.jpg не расшифрован.
Что надо сделать для того чтоб работало?
вот как раз таки 333.jpg уже расшифрован, а 222.jpg это зашифрованная картинка ;)
.

Ну вот как раз таки и нет. На оба файла пишет нельзя
 

joiner

Модератор
Локальный модератор
Сообщения
3 061
Репутация
513
одна функция для смешивания и восстановления файла. даже если по ошибке изменили файл, то его можно восстановить. файл не меняет имени и расширения
Код:
$pic = @ScriptDir & '\foto.jpg';для файлов не более 40мб
_CryptDecrypt($pic)
Func _CryptDecrypt($File)
	Local $part = FileGetSize($File) / 4
	If $part > (1048576 * 10) Then Return False
	Local $horigin = FileOpen($File, 16)
	If $horigin = -1 Then Return False
	Local $bindata = FileRead($horigin)
	If @error = -1 Then Return False
	FileClose($horigin)
	Local $strfile = DllStructCreate('byte[' & $part & '];byte[' & $part & '];byte[' & $part & '];byte[' & $part & ']')
	Local $b = 1, $frp
	For $i = 1 To 4
		$frp = BinaryMid($bindata, $b, $part)
		DllStructSetData($strfile, $i, $frp)
		$b += $part
	Next
	Local $hmixed = FileOpen($File, 18)
	If $hmixed = -1 Then Return False
	FileWrite($hmixed, DllStructGetData($strfile, 4))
	FileWrite($hmixed, DllStructGetData($strfile, 2))
	FileWrite($hmixed, DllStructGetData($strfile, 3))
	FileWrite($hmixed, DllStructGetData($strfile, 1))
	FileClose($hmixed)
	Return True
EndFunc   ;==>_CryptDecrypt
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
joiner,
А зачем Вы два раза читаете файл? Размер можно ведь получить через FileGetSize().
 

joiner

Модератор
Локальный модератор
Сообщения
3 061
Репутация
513
исправил
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
urrya,
Сделал функцию перемешивания файла и возврата его в исходное состояние.
Код:
Opt('MustDeclareVars', 1)

Global $sFile = @ScriptDir & '\File.jpg', $sFileMixed = @ScriptDir & '\File_jpg.mxd'

ConsoleWrite(_File_Mix($sFile) & @LF)
ConsoleWrite(_File_Mix($sFileMixed) & @LF)


#cs
	Если файл с "нормальным" именем, запишет перемешанное содержимое в файл с именем ИмяФайла_расширение.mxd в эту же папку
	Если файл с именем ИмяФайла_расширение.mxd, запишет исходное содержимое в файл с именем ИмяФайла.расширение в эту же папку

	Если все ОК, вернет True.
	При ошибке вернет False.

	!!!Функция не предназначена для перемешивания больших файлов!!!
#ce
Func _File_Mix($s_File)
	Local Const $s_HexStr = '8C1006DBD60E18CC92AD18834F047F3C8D8F678ACE598CF0A95E747A5286D9778F85E427710363AC'
	Local $i_Err = 1, $i_Size, $i_Mod, $i_Part, $a_Seq, $i_Mixed, $s_FileMixed, $h_File, $h_FileMixed, $h_FilePos, $b_Read

	$i_Size = FileGetSize($s_File)
	If Not $i_Size Then Return False
	$i_Mod = Mod($i_Size, 10)
	$i_Part = Int($i_Size / 10)
	$a_Seq = StringSplit(Dec(StringMid($s_HexStr, $i_Mod * 8 + 1, 8), 2), '')
	If $a_Seq[0] <> 10 Then Return False
	If StringRight($s_File, 4) = '.mxd' Then
		$i_Mixed = 1
		$s_FileMixed = StringReplace(StringTrimRight($s_File, 4), '_', '.', -1)
	Else
		$s_FileMixed = StringReplace($s_File, '.', '_', -1) & '.mxd'
	EndIf
	Do
		$h_File = FileOpen($s_File, 16)
		If $h_File = -1 Then ExitLoop
		$h_FileMixed = FileOpen($s_FileMixed, 18)
		If $h_FileMixed = -1 Then ExitLoop
		If $i_Mixed Then
			$h_FilePos = $h_FileMixed
		Else
			$h_FilePos = $h_File
		EndIf
		For $i = 1 To 10
			If Not FileSetPos($h_FilePos, $a_Seq[$i] * $i_Part, 0) Then ExitLoop 2;$FILE_BEGIN
			$b_Read = FileRead($h_File, $i_Part)
			If @error Then ExitLoop 2
			If Not FileWrite($h_FileMixed, $b_Read) Then ExitLoop 2
		Next
		If $i_Mod Then
			If Not FileSetPos($h_FilePos, $a_Seq[0] * $i_Part, 0) Then ExitLoop
			$b_Read = FileRead($h_File, $i_Mod)
			If @error Then ExitLoop
			If Not FileWrite($h_FileMixed, $b_Read) Then ExitLoop
		EndIf
		FileClose($h_File)
		FileClose($h_FileMixed)
		$i_Err = 0
	Until 1
	If $i_Err Then
		FileClose($h_File)
		FileClose($h_FileMixed)
		FileDelete($s_FileMixed)
	EndIf
	Return $i_Err = 0
EndFunc   ;==>_File_Mix
 

Вложения

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
madmasles сказал(а):
urrya,
Сделал функцию перемешивания файла и возврата его в исходное состояние.
Код:
Opt('MustDeclareVars', 1)

Global $sFile = @ScriptDir & '\File.jpg', $sFileMixed = @ScriptDir & '\File_jpg.mxd'

ConsoleWrite(_File_Mix($sFile) & @LF)
ConsoleWrite(_File_Mix($sFileMixed) & @LF)


#cs
	Если файл с "нормальным" именем, запишет перемешанное содержимое в файл с именем ИмяФайла_расширение.mxd в эту же папку
	Если файл с именем ИмяФайла_расширение.mxd, запишет исходное содержимое в файл с именем ИмяФайла.расширение в эту же папку

	Если все ОК, вернет True.
	При ошибке вернет False.

	!!!Функция не предназначена для перемешивания больших файлов!!!
#ce
Func _File_Mix($s_File)
	Local Const $s_HexStr = '8C1006DBD60E18CC92AD18834F047F3C8D8F678ACE598CF0A95E747A5286D9778F85E427710363AC'
	Local $i_Err = 1, $i_Size, $i_Mod, $i_Part, $a_Seq, $i_Mixed, $s_FileMixed, $h_File, $h_FileMixed, $h_FilePos, $b_Read

	$i_Size = FileGetSize($s_File)
	If Not $i_Size Then Return False
	$i_Mod = Mod($i_Size, 10)
	$i_Part = Int($i_Size / 10)
	$a_Seq = StringSplit(Dec(StringMid($s_HexStr, $i_Mod * 8 + 1, 8), 2), '')
	If $a_Seq[0] <> 10 Then Return False
	If StringRight($s_File, 4) = '.mxd' Then
		$i_Mixed = 1
		$s_FileMixed = StringReplace(StringTrimRight($s_File, 4), '_', '.', -1)
	Else
		$s_FileMixed = StringReplace($s_File, '.', '_', -1) & '.mxd'
	EndIf
	Do
		$h_File = FileOpen($s_File, 16)
		If $h_File = -1 Then ExitLoop
		$h_FileMixed = FileOpen($s_FileMixed, 18)
		If $h_FileMixed = -1 Then ExitLoop
		If $i_Mixed Then
			$h_FilePos = $h_FileMixed
		Else
			$h_FilePos = $h_File
		EndIf
		For $i = 1 To 10
			If Not FileSetPos($h_FilePos, $a_Seq[$i] * $i_Part, 0) Then ExitLoop 2;$FILE_BEGIN
			$b_Read = FileRead($h_File, $i_Part)
			If @error Then ExitLoop 2
			If Not FileWrite($h_FileMixed, $b_Read) Then ExitLoop 2
		Next
		If $i_Mod Then
			If Not FileSetPos($h_FilePos, $a_Seq[0] * $i_Part, 0) Then ExitLoop
			$b_Read = FileRead($h_File, $i_Mod)
			If @error Then ExitLoop
			If Not FileWrite($h_FileMixed, $b_Read) Then ExitLoop
		EndIf
		FileClose($h_File)
		FileClose($h_FileMixed)
		$i_Err = 0
	Until 1
	If $i_Err Then
		FileClose($h_File)
		FileClose($h_FileMixed)
		FileDelete($s_FileMixed)
	EndIf
	Return $i_Err = 0
EndFunc   ;==>_File_Mix

вот этот вариант идеальный, но один вопрос. можно ли каким нибудь образом добавить ваш код в этот скрипт?

Код:
#include <GUIConstants.au3>

GUICreate("My GUI menu",300,200)

Global $defaultstatus = "Готов"
Global $status

$filemenu = GUICtrlCreateMenu ("&Файл")
$fileitem = GUICtrlCreateMenuitem ("Открыть",$filemenu)
GUICtrlSetState(-1,$GUI_DEFBUTTON)
$helpmenu = GUICtrlCreateMenu ("?")
$saveitem = GUICtrlCreateMenuitem ("Сохранить",$filemenu)
GUICtrlSetState(-1,$GUI_DISABLE)
$infoitem = GUICtrlCreateMenuitem ("Инфо",$helpmenu)
$exititem = GUICtrlCreateMenuitem ("Выход",$filemenu)
$recentfilesmenu = GUICtrlCreateMenu ("Последние файлы",$filemenu,1)

GUICtrlCreateLabel ("Добро",  10, 30, 50)
GUICtrlCreateLabel ("пожаловать", 47, 30, 60)

$separator1 = GUICtrlCreateMenuitem ("",$filemenu,2)    ; create a separator line

$viewmenu = GUICtrlCreateMenu("Вид",-1,1)  ; is created before "?" menu
$viewstatusitem = GUICtrlCreateMenuitem ("Статус состояния",$viewmenu)
GUICtrlSetState(-1,$GUI_CHECKED)
$okbutton = GUICtrlCreateButton ("OK",50,130,70,20)
GUICtrlSetState(-1,$GUI_FOCUS)
$cancelbutton = GUICtrlCreateButton ("Выход",180,130,70,20)



$statuslabel = GUICtrlCreateLabel ($defaultstatus,0,165,300,16,BitOr($SS_SIMPLE,$SS_SUNKEN))

GUISetState ()
While 1
    $msg = GUIGetMsg()

    If $msg = $fileitem Then
        $file = FileOpenDialog("Выберете файл...",@TempDir,"All (*.*)")
        If @error <> 1 Then GUICtrlCreateMenuitem ($file,$recentfilesmenu)
    EndIf
    If $msg = $viewstatusitem Then
        If BitAnd(GUICtrlRead($viewstatusitem),$GUI_CHECKED) = $GUI_CHECKED Then
            GUICtrlSetState($viewstatusitem,$GUI_UNCHECKED)
            GUICtrlSetState($statuslabel,$GUI_HIDE)
        Else
            GUICtrlSetState($viewstatusitem,$GUI_CHECKED)
            GUICtrlSetState($statuslabel,$GUI_SHOW)
        EndIf
    EndIf
    If $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton Or $msg = $exititem Then ExitLoop
    If $msg = $infoitem Then Msgbox(0,"Инфо","В разработке...")
WEnd
GUIDelete()

Exit

я так попытался это сделать, заменив File.jpg на $file.. но чтот не так


и ище кое что осталось мне не ясным. что это такое?
Код:
Local Const $s_HexStr = '8C1006DBD60E18CC92AD18834F047F3C8D8F678ACE598CF0A95E747A5286D9778F85E427710363AC'
 
Верх