создание системы шифрования файлов с распаковкой в память
немного теории
в общем большинство любительских систем делает распаковку в tmp файлы потому что программа которая использует такую систему не может грузить ресурсы из памяти к примеру блиц3д, для того чтобы заставить его грузить картинки из памяти, Maxus'у пришлось извратится и переопределять функции чтения файла такой метод не очень удобен при кроссплатформеных приложениях но ето уже выходит за рамки етой статьи :) и так немного теории : в блицмаксе ето можно было сделать несколькими путями 1)переопределить фукнции чтения из файла но ето слишком сложно для нас, и много кропотливой работы 2)написать свой модуль-загрузчик (типа pngloader.mod) не универсально, можно шифровать только файлы которые грузит загрузчик 3)использовать возможность загрузки ресурсов из потоков вот ето мы и будем использовать блицмакс позволяет в функцию чтения файла вместо имени файла подовать поток ... и вообще там подоется url:Object а Objectом может быть что угодно, хоть имя файла, хоть веб-сайт и соответственно наш поток тоже можно туда подать в общем алгоритм такой : 1) мы пишем функции кодировки\декодировки TStream 2) мы пишем простенькую функцию - враппер :) 3) потом делаем простенький пример как ето использовать больше практики я не буду описывать сами алгоритмы шифрования, потому что их много и ето совершенно другая тема :) остановимся на банальном шифровка байта ето byte_code = byte + 10 разшифровка ето byte = byte_code - 10 метод "шифрования" банален, но потом вы можете сделать и свои методы Шифрование Потока так начнем с функции шифрования потока напишем костяк функции : Код:
Function CodeStream:TStream(in:TStream) и так же спокойно читать из него но как же его создать если поток всегда к чему то прикреплен в блицмаксе есть такая полезная штука как TBank ето можно сказать масив с неопределенным размером :) и работает он по принципу стека .. но ето нам не важно нам важно что : 1) принимает любой размер 2) к нему можно приципить поток создадим наш поток вывода :) Код:
Local bank:TBank = New TBank так идем дальше, для начала запишем какуето фразу пусть ета фраза будет заголовком для нашого Pak Файла Код:
out_stream.WriteString("Start_Pak") дальше запишем размер данных для шифрования ето удобно и позволяет вычислить программерские ошибки если что Код:
out_stream.WriteInt(in.Size()) Код:
While Not Eof(in) теперь запишем конец файла (чтобы потом при чтении сверятся) Код:
out_stream.WriteString("End_Pak") Код:
out_stream.Seek(0) и вернем поток из функции Код:
Return out_stream Декодирование потока если вы прочитали прошлый раздел, то все для вас довольно просто теперь минимум обьяснений и больше кода костяк функции : :) Код:
Function DecodeStream:TStream(in:TStream) Код:
Local Header$ = in.ReadString(9) то пользуйтесь функциями ReadLine \ WriteLine для записи и чтения заголовка теперь дешифруем сами данные файла Код:
For Local dat% = 1 To DataSize далее сверяем фразу в конце файла чтобы проверить что мы не ошибились Код:
Local EndHeader$ = in.ReadString(7) подведем итог : вот наши фукнции шифрования и дешифрования потока Код:
Function CodeStream:TStream(in:TStream) Функции Работы с потоками все довольно просто, и особой необходимости в таких функций нету они нужны чтобы было меньше писанины :) чтобы было понятнее, не сводил в одну строчку как обычно, а расписал по больше :) Код:
Function ReadPakFile:TStream(filename$) Код:
Function WritePakFile(filename_in$,filename_out$) пример использования очень банально :) Код:
WritePakFile("test.png","test.pak") алгоритм шифрования можно усложнить до безконечности но целью статьи было просто показать как ето использовать в бмаксе :) так что юзайте :) ps. с вами был jimon :-) |
Часовой пояс GMT +4, время: 09:53. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot