Что нового

Как зашифровать картинку формата .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,556
Репутация
628
а зачем? :smile:
 
Автор
urrya

urrya

Новичок
Сообщения
159
Репутация
1
joiner сказал(а):

Пишу программку, которая умеет делать картинки, но надо что бы эти самые "картинки" можно было просматривать только моей программкой.
;)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
можно использовать сжатие. в исходнике 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,556
Репутация
628
сделал "по быстрому", но работает. скорее всего есть алгоритм получше
нужна одна картинка. в моем коде это 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,556
Репутация
628
одна функция для смешивания и восстановления файла. даже если по ошибке изменили файл, то его можно восстановить. файл не меняет имени и расширения
Код:
$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,322
joiner,
А зачем Вы два раза читаете файл? Размер можно ведь получить через FileGetSize().
 

joiner

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
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
 

Вложения

  • File.jpg
    File.jpg
    22.4 КБ · Просмотры: 7

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'
 
Верх