PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Шифрование строк


Шифрование строк

Сообщений 1 страница 10 из 10

1

Так для собственного развития побаловался с ассемблерными вставками. Подойдет для шифрования текста любой длины. Себе сделал библиотеку. Если кому надо:
ТУТ кладем в папку: PureBasic\PureLibraries\UserLibraries

Код:
ProcedureDLL.s SHIFR(stroka.s,Regim.b)
  *st=@stroka  
  Lenn=Len(stroka)
  EnableASM
  MOV edx,*st
  XOr ecx,ecx
  XOr edi,edi
  !hhh:
  INC ecx
  MOV al,[edx+edi]
  CMP Regim,0
  JZ uuu
  ROL al,5
  XOr al,6
  JMP yyy
  !uuu:
  XOr al,6
  ROR al,5
  !yyy: 
  MOV [edx+edi],al
  INC edi
  CMP ecx,Lenn
  JNZ hhh
DisableASM
ProcedureReturn stroka
EndProcedure

Пример работы:

Код:
SHSTR.s=SHIFR("PureBasic",1) ; шифруем (ставим параметр 1) 

Debug SHSTR

Debug SHIFR(SHSTR,0) ; дешифруем (ставим параметр 0)  можно и наоборот

0

2

В кодархиве есть пример XorAsm , немного переделал и прокомметировал на всякий:

Код:
ProcedureDLL.s SHIFR1(stroka.s,Parol.s)
  *st=@stroka  ; адрес строки
  Lenn=Len(stroka) ; длина строки
  *par=@Parol  ; адрес пароля
  lenpar=Len(parol) ;длина пароля
  
  EnableASM
  MOV edx,*st  ;заносим адрес строки
  MOV ebx,*par ;заносим адрес пароля
  XOR edi,edi ; смещение адреса строки ставим на ноль
  XOR esi,esi ; смещение адреса пароля ставим на ноль
  !Main: ; внешний цикл
  MOV al,[edx+edi] ; заносим один символ строки
  !Doch: ; внутренний цикл
  MOV ah,[ebx+esi] ; заносим один символ пароля
  XOR al,ah   ; ксорим
  INC esi    ; следующий символ пароля
  CMP esi,lenpar ; проверка на длину пароля
  JNZ Doch  ; если не достигнута длина
  XOR esi,esi ; ставим указатель адреса пароля на первый символ
  MOV [edx+edi],al ; записываем шифрованный символ туда, откуда брали
  INC edi  ; следующий символ строки
  CMP edi,Lenn ; проверка на длину строки
  JNZ Main ; если строка не кончилась
DisableASM
ProcedureReturn stroka
EndProcedure

SHSTR.s=SHIFR1("PureBasic","123456") ; шифруем с паролем

Debug SHSTR

Debug SHIFR1(SHSTR,"123456"); дешифруем с паролем

Отредактировано haav (09.10.2010 07:17:39)

0

3

Объясните, как работать с функцией StartAESCipher(#Cipher, *Key, Bits, *InitializationVector, Mode),
конкретней интересует *InitializationVector, откуда её брать?
Bits-это значения: 128, 192 и 256, в пример из справки подставляю 192 или 256 получается ахинея :question:

0

4

lakomet
В справке:

'InitializationVector' is a random data block

Случайный блок данных. Считай вспомогательный ключ. Размер зависит от параметра Bits ( и дальше по тексту справки)
Пример реализации:

Код:
; Demo: Streaming AES file encode/decode 
	; netmaestro August 2010 
	; Purebasic 4.51 
	 
	Declare Encode(void) 
	Declare Decode(void) 
	 
	OpenWindow(0,0,0,200,120,"Cryptor!",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
	ButtonGadget(0, 50,20,100,20,"Encrypt a file") 
	ButtonGadget(1, 50,50,100,20,"Decrypt a file") 
	CreateStatusBar(0, WindowID(0)) 
	AddStatusBarField(200) 
	StatusBarProgress(0,0,0,#PB_ProgressBar_Smooth,0,100) 
	 
	Repeat 
	EventID = WaitWindowEvent() 
	Select EventID 
	Case #PB_Event_Gadget 
	Select EventGadget() 
	Case 0 
	CreateThread(@Encode(), 0) 
	 
	Case 1 
	CreateThread(@Decode(), 0) 
	EndSelect 
	EndSelect 
	Until EventID = #PB_Event_CloseWindow 
	 
	End 
	 
	 
	Procedure Encode(void) 
	 
	chunksize = 4096 
	rawfilename$ = OpenFileRequester("Please choose a file to encrypt:","","",0) 
	encfilename$ = rawfilename$+".enc" 
	 
	If OpenFile(0, rawfilename$) 
	If CreateFile(1, encfilename$) 
	DisableGadget(0,1) 
	DisableGadget(1,1) 
	 
	length.q = Lof(0) 
	numparts = length/chunksize 
	lastchunksize = length%chunksize 
	If lastchunksize 
	numparts+1 
	lastchunk = numparts 
	Else 
	lastchunk = 0 
	EndIf 
	 
	*raw     = AllocateMemory(chunksize)  
	*secure  = AllocateMemory(chunksize)  
	 
	StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Encode) 
	 
	For i=1 To numparts 
	If i=lastchunk 
	FillMemory(*raw, chunksize, 0, #PB_Byte) 
	ReadData(0, *raw, lastchunksize) 
	Else 
	ReadData(0, *raw, chunksize) 
	EndIf 
	AddCipherBuffer(0, *raw, *secure, chunksize) 
	WriteData(1, *secure, chunksize) 
	prog.d = i/numparts*100 
	StatusBarProgress(0,0, Int(prog)) 
	Delay(1) 
	Next 
	If lastchunksize 
	WriteLong(1, lastchunksize) 
	Else 
	WriteLong(1, chunksize) 
	EndIf 
	 
	FinishCipher(0)  
	CloseFile(0) 
	CloseFile(1) 
	 
	FreeMemory(*raw) 
	FreeMemory(*secure) 
	 
	MessageRequester("Finished", "Encrypted file "+encfilename$+" saved",#MB_ICONINFORMATION) 
	StatusBarProgress(0,0,0) 
	 
	DisableGadget(0,0) 
	DisableGadget(1,0) 
	 
	EndIf 
	EndIf 
	EndProcedure 
	 
	Procedure Decode(void) 
	 
	chunksize = 4096 
	 
	encfilename$ = OpenFileRequester("Please choose a file to decrypt:","","",0) 
	rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0) 
	 
	If OpenFile(0, encfilename$) 
	FileSeek(0, Lof(0)-4) 
	lastchunksize = ReadLong(0) 
	FileSeek(0, 0) 
	If CreateFile(1, rawfilename$) 
	DisableGadget(0,1) 
	DisableGadget(1,1) 
	 
	length.q = Lof(0) 
	numparts = length/chunksize 
	 
	*raw     = AllocateMemory(chunksize)  
	*secure  = AllocateMemory(chunksize)  
	 
	StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Decode) 
	 
	For i=1 To numparts 
	ReadData(0, *secure, chunksize) 
	AddCipherBuffer(0, *secure, *raw, chunksize) 
	If i=numparts 
	WriteData(1, *raw, lastchunksize) 
	Else 
	WriteData(1, *raw, chunksize) 
	EndIf 
	prog.d = i/numparts*100 
	StatusBarProgress(0,0, Int(prog)) 
	Delay(1) 
	Next 
	 
	FinishCipher(0)  
	CloseFile(0) 
	CloseFile(1) 
	 
	FreeMemory(*raw) 
	FreeMemory(*secure) 
	 
	MessageRequester("Finished", "Decrypted file "+rawfilename$+" saved",#MB_ICONINFORMATION) 
	StatusBarProgress(0,0,0) 
	 
	DisableGadget(0,0) 
	DisableGadget(1,0) 
	EndIf 
	EndIf 
	EndProcedure 
	 
	 
	DataSection 
	key: 
	Data.b $8C,$15,$51,$2C,$0C,$8A,$0A,$D8,$07,$E4,$21,$A2,$8E,$83,$A3,$88,$8A,$CA,$FB,$E1 
	Data.b $7B,$A3,$6B,$D6,$BC,$F7,$E6,$CD,$FE,$B5,$D7,$B3 
	iVector: 
	Data.b $08,$0C,$96,$48,$33,$51,$35,$80,$0C,$A9,$42,$1E,$11,$E0,$83,$C7,$C4,$C6,$E1,$E4 
	Data.b $2E,$40,$81,$0A,$24,$70,$00,$10,$08,$B3,$64,$21 
	EndDataSection

0

5

ВиниПур
Большое спасибо. Пример супер(готовая шифровалка), но с моими познаниями я буду разбираться в нём пол года.Если бы были коментарии было бы легче.
Если я правильно понимаю, то пусть у меня есть пароль ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ, то я могу взять из него допустим первые N знаков и использовать их как *InitializationVector, а оставшуюся часть как *Key? Если так, то сколько знаков от этого пароля мне брать под *InitializationVector?
И еще, по замыслу в программе юзверь может задавать пароль любой длинны и хоть латиницей, хоть кириллецей. Как правильней сгенерировать из пароля юзверя пароль нужной длинны (надеюсь не сильно запутанно спросил)

0

6

lakomet написал(а):

Если так, то сколько знаков от этого пароля мне брать под *InitializationVector?

В справке написано, что размер *InitializationVector зависит от Bits - если шифрование 128 bit , то *InitializationVector равен 16 байтам. В примере 265 bit шифрование, и по этому используется *InitializationVector длиной 32 байта, посчитай сам. И ключ там тоже 32 байта. Как ты его будешь генерировать - это твоё дело, главное размеры должны соблюдаться!

У тебя что, русской справки нет?

Описание

Инициализация запуска шифрования AES используя указанный ключ '*Key'. 'Bits' определяет размер используемого ключа для шифрования. Допустимые значения: 128, 192 и 256. The 'InitializationVector' этослучайные байты в области данных, зависит от Bits:l6 bytes для 128 bit encryption, 24 bytes для 196 bit и 32 bytes для 256 bit., используемых для инициализации шифрования, чтобы избежать нарушения в расшифровке (нужен только при использовании режима #PB_Cipher_CBC). После завершения шифрования, должна быть названа функция FinishCipher().

Необязательный параметр 'Mode' может быть комбинацией из следующих действий:
  #PB_Cipher_Decode: поток используется, чтобы декодировать данные.
  #PB_Cipher_Encode: поток используется, чтобы закодировать данные.

with

  #PB_Cipher_CBC: Стандартный режим кодировки (Cipher Block Chaining). Нуждается в '*InitializationVector'.
                  Рекомендуемый как более безопасный чем режим ECB.
  #PB_Cipher_ECB: Альтернативный режим (Electronic CodeBook). Не использует случайные значения
                  (каждый блок зашифрован независимо друг от друга) что делает его менее сильным, чем CBC.

Новый буфер для кодирования и декодирования может быть добавлен с помощью функции AddCipherBuffer().

Более подробную информацию о AES и примеры исходного кода, см. AESEncoder().

0

7

haav, если в строке попадается "0" - ваш код не работает ))

0

8

haav, спасибо за XorAsm, радует простота.
Но возникает вопрос надежности. На сколько легко будет выудить пароль из исполняемого файла программы, если он будет в программе не изменяем?

0

9

Paranoia написал(а):

haav, спасибо за XorAsm, радует простота.
Но возникает вопрос надежности. На сколько легко будет выудить пароль из исполняемого файла программы, если он будет в программе не изменяем?

Любой начинающий крякер сделает это в минуты. Если нужно защищать, то уж лучше встроенные функции AES.

P.S. Это был просто пробный момент использования ASM вставок. Для серьезного использования не годится.

0

10

haav написал(а):

Любой начинающий крякер сделает это в минуты

Исключающее или - самое простое при файле ключе шифрует быстро и недоступно для исследования зашифрованных данных. А файл-ключ может быть случаным типом файла вообще с наполненным содержимым. Тут не поможет анализ. Разве что у файла есть заголовочная запись, но тогда расшифровка будет неполная. А текстовые файлы так вообще не расшифруешь без ключевого файла.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Шифрование строк