Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2009, 00:31   #1
Anzhela
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 2
По умолчанию Шифрование файлов любого формата. RSA

Добрый день!
помогите пожалуйста, как зашифровать файл любого формата(delphi)? мне посоветовали сделать через filestream, но что-то я не понимаю.
Код:
var
  FS,FD: TFileStream;
  Buf: string;
  Len: Integer;
  DestStr: String;
  w:TStringList;
begin
w:=TStringList.Create;
if OpenDialog1.Execute then
  begin
    if SaveDialog1.Execute then
     begin
      FS := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
  try
    FD := TFileStream.Create(SaveDialog1.FileName,fmCreate);
    try
      Len := FS.Size;
      SetLength(Buf,Len);
      FS.Read(Buf[1],Len);
      //Здесь шифруем строку
      DestStr := cryptstr(buf);
      FD.Write(DestStr[1],Length(DestStr));
    finally
      FD.Free;
    end;
  finally
    FS.Free;
  end;
     end;
  end;
но в данном случае doc и jpeg файлы к примеру не загружаются в буфер.
можно использовать массив байт тогда будет выглядеть так:
var
  FS,FD: TFileStream;
  Buf: array of byte;
  Len: Integer;
  DestStr: String;
  w:TStringList;
begin
w:=TStringList.Create;
if OpenDialog1.Execute then
  begin
    if SaveDialog1.Execute then
     begin
      FS := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
  try
    FD := TFileStream.Create(SaveDialog1.FileName,fmCreate);
    try
      Len := FS.Size;
      SetLength(Buf,Len);
      FS.Read(Buf[1],Len);
      //Здесь шифруем строку
      DestStr := cryptstr(buf);
      FD.Write(DestStr[1],Length(DestStr));
    finally
      FD.Free;
    end;
  finally
    FS.Free;
  end;
     end;
  end;

Вопрос состоит в следущем: как правильно организовать функцию? function cryptstr(s1:array of byte):string - мне не нравится string как конечный результат...или нельзя представлять в виде массива байт?
вот вам cryptstr (для массива байт):
function cryptstr(s1:array of byte):string;
var i:integer;
    p:integer;
    convert_p:integer;
    s2:char;
    r:string;
begin
e:=7;
multiply:=13231;
 for i := 1 to length(s1)  do
 begin
    convert_p:=MyPwMod(s1[i],e,multiply);
    //r:=r+(char(convert_p));
 end;
//Result:=r;
end;
P.S.
MyPwMod(a,b,c) = (a в степени b) mod c

Последний раз редактировалось Stilet; 09.11.2009 в 09:59.
Anzhela вне форума Ответить с цитированием
Старый 09.11.2009, 10:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы попробовал что-то типа:
Код:
uses     Classes,
  SysUtils;
 var f:TFileStream;s:TStringStream;i:integer;  b:Byte;
begin
 f:=TFileStream.Create('C:\temp\q.txt',fmOpenReadWrite);
  s:=TStringStream.Create;
  s.CopyFrom(f,f.Size);

  for i:=0 to s.Size do begin
   // Тут типа шифруем побайтно
    s.Bytes[i]:=s.Bytes[i] xor 2;
  end;

 f.Position:=0;;
 f.Write(s.Bytes,s.Size);
 f.Free;   s.Free;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.11.2009, 14:41   #3
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

stilet, а как обратно расшифровать потом?

Anzhela, может сгенерировать открытые и закрытые ключи перед шифрованием? а затем читать по одному байту, а не массиву байт и шифровать его(байт этот). и Вообще у вас RSA алгоритм НЕВЕРНЫЙ
lennon вне форума Ответить с цитированием
Старый 09.11.2009, 14:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
stilet, а как обратно расшифровать потом?
Дык этой же операцией )
Посмотри внимательно на метод который я поставил.
Цитата:
и Вообще у вас RSA алгоритм НЕВЕРНЫЙ
Это уже другое дело, я пример на FileStream показывал а не на RSA.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.11.2009, 15:01   #5
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

перепутал с mod . Но тогда очень слабый алгоритм проще не шифровать вовсе, т.к. это бесполезно. и не про ваш, stilet, алгоритм я говорил, а про алгоритм автора
lennon вне форума Ответить с цитированием
Старый 09.11.2009, 15:35   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и не про ваш, stilet, алгоритм я говорил, а про алгоритм автора
Я понял. Автору неплохо бы на Delphi World заглянуть
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2009, 01:01   #7
Anzhela
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 2
По умолчанию

алгоритм RSA работает, но пока только для текстовых данных.
я неправильно делаю для файла любого формата, но если делать шифрование побайтно, то мой алгоритм не катит? Но ведь алгоритм RSA оперирует непосредственно с числовыми данными
Алгоритм RSA состоит из следующих пунктов:

1. Выбрать простые числа p и q
2. Вычислить n = p * q
3. Вычислить m = (p - 1) * (q - 1)
4. Выбрать число d взаимно простое с m
5. Выбрать число e так, чтобы e * d = 1 (mod m)

Числа e и d являются ключами. Шифруемые данные необходимо разбить на блоки - числа от 0 до n - 1. Шифрование и дешифровка данных производятся следующим образом:

* Шифрование: b = a в степени e (mod n)
* Дешифровка: a = b в степени d (mod n)

Как в этом случае мне поступить?
Anzhela вне форума Ответить с цитированием
Старый 10.11.2009, 01:12   #8
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

у вас в функции cryptstr только
Цитата:
* Шифрование: b = a в степени e (mod n)
соблюдаеться.

Вы же знает какие числа взаимнопростые?

Цитата:
алгоритм RSA работает
естественно меняеться символ после MyPwMod, но вопрос в том, как вы восстановите прежний символ? Вы поняли что такое открытый и закртый ключ? Говорю что у вас не RSA а калиберда какае-то.

Цитата:
Но ведь алгоритм RSA оперирует непосредственно с числовыми данными
Да, а ведь все символы прдеставлены в кодах чисел. поэтому называеться "Цифровая фотография" , "цифровые технологии" каждый символ имеет число. для наглядности смотрите codes.txt
И RSA оперирует не просто с числоыми данными, А БОЛЬШИМИ числовыми данными. Вы же наверняка слышали словосочетания "кодирование по 256 бит", "... по 1024 бита". здесь 256 и 1024 это не что иное, как размер числа. таких огромных типов данных нету, для этого нужно написать класс или ряд функций.

Последний раз редактировалось lennon; 10.11.2009 в 01:15.
lennon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифрование методом RSA на Delphi Тёма(C@$pEr) Помощь студентам 13 17.12.2012 17:42
Шифрование по алгоритму RSA Эльмирчик (ms) Помощь студентам 1 05.06.2009 20:51
Работа с большими числами (делфи, шифрование RSA) WinApi Помощь студентам 1 05.06.2009 20:43
Проблема с декодированием файлов формата mp3 Котовский Мультимедиа в Delphi 6 13.02.2009 17:32
RSA шифрование. Требуется пример. Hakman Помощь студентам 5 22.02.2008 16:05