Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
ВнизКопирование с шифрованием Найти похожие ветки
← →
RustB (2008-10-02 00:08) [0]Нужна по возможности быстрая функция которая копировала и попутно зашифровывала бы файл, требования к алгоритму шифрования самые минимальные. Если кто сталкивался с подобным подскажите пожалуйсто.
← →
Германн © (2008-10-02 01:42) [1]
> Нужна по возможности быстрая функция которая копировала
> и попутно зашифровывала бы файл, требования к алгоритму
> шифрования самые минимальные.
А какие требования к файлу?
По-моему это уже третий за год подобный вопрос.
← →
Anatoly Podgoretsky © (2008-10-02 07:48) [2]> RustB (02.10.2008 0:08:00) [0]
Если минимальные, то XOR, если максимальные, то тоже XOR, но с ключом L>M
← →
Jeer © (2008-10-02 09:36) [3]
> попутно зашифровывала
Таблица подстановок ( побайтная ) - как вариант.
← →
@!!ex © (2008-10-02 09:55) [4]xor, что тут думать... самая быстрая операция.
делаешь башой ключ. шифруеш его RSA и все.
← →
RustB (2008-10-02 10:10) [5]шифруются файлы до 1 Mb.
Как вариант
function FileCrypt(InFile, OutFile: String; Key: TWordTriple; Encrypt: Boolean): boolean;
var
MIn, MOut: TMemoryStream;
begin
MIn := TMemoryStream.Create;
MOut := TMemoryStream.Create;
Try
MIn.LoadFromFile(InFile);
MOut.SetSize(MIn.Size);
if Encrypt then
Result := MemoryEncrypt(MIn.Memory, MIn.Size, MOut.Memory, MOut.Size, Key)
else
Result := MemoryDecrypt(MIn.Memory, MIn.Size, MOut.Memory, MOut.Size, Key);
MOut.SaveToFile(OutFile);
finally
MOut.Free;
MIn.Free;
end;
end;
толко нужна еще сюда функция для шифрования памяти MemoryEncrypt ну и MemoryDecrypt разумеется
← →
@!!ex © (2008-10-02 10:28) [6]> [5] RustB (02.10.08 10:10)
ну и в чем проблема?
← →
blackman © (2008-10-02 17:39) [7]function MemoryEncrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i : Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := Byte(pIn^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end else
Result := False;
end;
function MemoryDecrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i : Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := byte(pOut^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end else
Result := False;
end;
function TextCrypt(const s: string; Key: TWordTriple; Encrypt: Boolean): string;
var
bOK: Boolean;
begin
SetLength(Result, Length(s));
if Encrypt then
bOK := MemoryEncrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key)
else
bOK := MemoryDecrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key);
if not bOK then Result := "";
end;
← →
RustB (2008-10-02 18:45) [8]TWordTriple что за тип? Или нужно еще чтото дописать в раздел uses?
← →
Поросенок Винни-Пух © (2008-10-02 18:55) [9]Key[2] := ....
так что такое TWordTripple?
← →
@!!ex © (2008-10-02 20:00) [10]Насколько я могу судить по коду - это тупо массив байтов...
← →
ПЗ (2008-10-02 21:15) [11]program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
two32=4294967296; //2^32
C1=$1010104;
C2=$1010101;
S=7476199048732314356; //Синхропосылка
helpStr="Usage:<sourcefile> <dstfile> [-E|-D] [-S|-G|-F] [-I]"#13#10+
"-E -encrypt srcfile to dstfile"#13#10+
"-D -decrypt srcfile to dstfile"#13#10+
"-S -simple mode (8 bit aligned data)"#13#10+
"-G -gamma mode"#13#10+
"-F -gamma with feedback mode"#13#10+
"-I -data safety mode (imito injection)";
var K:array [0..7] of LongWord=(0,1,2,3,4,5,6,7); //Ключ
H:array[0..7,0..15] of Byte=
((4,10,9,2,13,8,0,14,6,11,1,12,7,15,5,3),
(14,11,4,12,6,13,15,10,2,3,8,1,0,7,5,9),
(5,8,1,13,10,3,4,2,14,15,12,7,6,0,9,11),
(7,13,10,1,0,8,9,15,14,4,6,12,11,2,5,3),
(6,12,7,1,5,15,13,8,4,10,9,14,0,3,11,2),
(4,11,10,0,7,2,1,13,3,6,8,5,9,12,15,14),
(13,11,4,1,3,15,5,9,0,10,14,7,6,8,2,12),
(1,15,13,0,5,7,10,4,9,2,3,14,6,11,8,12)); //Таблица замен
src,dst:String;
task:Byte=0;
mode:Byte=0;
imito:Boolean=false;
f1,f2:File;
j:Byte;
I:Int64;
function DecToBin(K:Int64;Bits:Byte):String;
var i:Integer;
begin
Result:="";
for i:=1 to 64 do
begin
if i>Bits then Break;
if (K mod 2)=0 then Result:="0"+Result else Result:="1"+Result;
K:=K div 2;
end;
end;
//Циклический сдвиг влево
function ROL(val: LongWord; shift: Byte): LongWord;
asm
mov cl, dl;
rol eax, cl;
end;
//Основной шаг криптопреобразования
procedure CryptoStep(var N:Int64; X:LongWord);
var S,Sh,N1,N2:LongWord;
i,Si:Byte;
begin
N1:=N; //Младшая часть блок данных
N2:=N shr 32; //Старшая часть блок данных
Sh:=0;
S:=(N1+X)mod two32;
for i:=0 to 7 do
begin
Si:=((S shr (i*4)) and 15); //Выделяем тетрады S для замены
Sh:=Sh or H[i,Si] shl (i*4);//Замена тетрады и образование нового S
end;
S:=Rol(Sh,11); //Сдвиг
S:=S xor N2;
N:=N1;
N:=(N shl 32) or S; //Обмен местами частей блока
end;
//Базовый шаг шифрования
procedure EncryptBase(var N:Int64);
var i,j:Byte;
N1:LongWord;
begin
for i:=0 to 31 do //32 шага криптопреобразования
begin //01234567012345670123456776543210
if i<24 then j:=i mod 8 else j:=31-i;
CryptoStep(N,K[j]);
end;
N1:=N shr 32; //Обмен частей блока данных
N:=(N shl 32) or N1;
end;
//Базовый шаг расшифрования
procedure DecryptBase(var N:Int64);
var i,j:Byte;
N1:LongWord;
begin
for i:=0 to 31 do //32 шага криптопреобразования
begin //01234567765432107654321076543210
if i<8 then j:=i else j:=(31-i) mod 8;
CryptoStep(N,K[j]);
end;
N1:=N shr 32; //Обмен частей блока данных
N:=(N shl 32) or N1;
end;
//Базовый шаг выработки имитовставки
procedure ImitoBase(var N:Int64);
var i:Byte;
begin
for i:=0 to 15 do //16 шагов криптопреобразования
CryptoStep(N,K[i mod 8]);
end;
← →
ПЗ (2008-10-02 21:15) [12]//Шифрование файла в режиме простой замены (р-р д.б. кратен 64 бит)
procedure SimpleEncrypt(var f1,f2:file);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
Block:=0;
BlockRead(f1,Block,Sizeof(Block),c);//Получение блока данных
EncryptBase(Block); //Шифрование
BlockWrite(f2,Block,8); //Запись (строго 64бит!)
end;
end;
//Расфрование файла в режиме простой замены (р-р д.б. кратен 64 бит)
procedure SimpleDecrypt(var f1,f2:file);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
Block:=0;
BlockRead(f1,Block,Sizeof(Block),c);//Получение блока данных
DecryptBase(Block); //Расшифрование
BlockWrite(f2,Block,8); //Запись (строго 64бит!)
end;
end;
//Шифрование файла в режиме гаммирования
procedure GammingEncrypt(var f1,f2:file; S:Int64);
var Block:Int64;
S0,S1:LongWord;
c:Integer;
begin
EncryptBase(S); //Зашифровка синхропосылки
S0:=S; //Младшая часть синхропосылки
S1:=S shr 32; //Старшая часть синхропосылки
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
S0:=(S0+C1)mod two32;
S1:=((S1+C2-1)mod (two32-1))+1;
S:=S1;
S:=(S shl 32)or S0;
EncryptBase(S); //Зашифрование
Block:=Block xor S;
BlockWrite(f2,Block,c); //Запись блока данных
end;
end;
//Расшифрование файла в режиме гаммирования (аналогично)
procedure GammingDecrypt(var f1,f2:file; S:Int64);
begin
GammingEncrypt(f1,f2,S);
end;
//Шифрование файла в режиме гаммирования с обратной связью
procedure FeedbackGammingEncrypt(var f1,f2:file; S:Int64);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
EncryptBase(S); //Зашифровка синхропосылки
Block:=Block xor S;
S:=Block;
BlockWrite(f2,Block,c); //Запись блока данных
end;
end;
//Расшифрование файла в режиме гаммирования с обратной связью
procedure FeedbackGammingDecrypt(var f1,f2:file; S:Int64);
var Block,NewBlock:Int64;
c:Integer;
begin
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
EnCryptBase(S); //Зашифровка синхропосылки
NewBlock:=Block xor S;
S:=Block; //Синхропосылка формируется из ЗАШИФРОВАННЫХ данных
BlockWrite(f2,NewBlock,c); //Запись блока данных
end;
end;
//Вычисление имитовставки файла
function ImitoInjection(var f:File):int64;
var Pos:Longint;
S,Block:Int64;
c:Integer;
begin
Pos:=FilePos(f); //Вычисление текущей позиции
Seek(F,0);
S:=0;
while not eof(f) do
begin
BlockRead(f,Block,Sizeof(Block),c);
S:=Block xor S;
ImitoBase(S); //Базовый цикл выработки имитовставки
end;
Seek(F,Pos); //Возврат позиции в файле
Result:=S;
end;
procedure Err(msg:String);
begin
WriteLn(msg);
WriteLn(helpStr);
try
CloseFile(f1);
CloseFile(f2);
except
end;
Halt;
end;
begin
if (ParamCount<2) then Err("");
src:=ParamStr(1); if not FileExists(src) then src:="";
dst:=ParamStr(2);
if UpperCase(ParamStr(3))="-E" then task:=1 else
if UpperCase(ParamStr(3))="-D" then task:=2;
if UpperCase(ParamStr(4))="-S" then mode:=1 else
if UpperCase(ParamStr(4))="-G" then mode:=2 else
if UpperCase(ParamStr(4))="-F" then mode:=3;
if UpperCase(ParamStr(5))="-I" then imito:=True;
if (src="")or(dst="") then Err("source or destination file expected");
WriteLn("NTF.EXE v.1.1");
WriteLn("Source file:",src);
WriteLn("Destination file:",dst);
WriteLn("Enter key (8 numbers):");
try //Ввод ключа
for j:=0 to 7 do
begin
Write("#",j+1," :");
ReadLn(K[j]);
end;
except //Введено неверное число (или буква)
Err("Invalid number");
end;
AssignFile(f1,src);
Reset(f1,1);
AssignFile(f2,dst);
Rewrite(f2,1);
if (task<1)or(task>2) then Err("Incorrect task (crypt\decrypt)") else
if task=1 then //Шифрование файла
begin
if (mode<1)or(mode>3) then Err("Incorrect crypting mode");
WriteLn("Encoding....");
if imito then //Запись имитовставки
begin
I:=ImitoInjection(f1); //Вычисление имитовставки незашифрованного файла
BlockWrite(f2,I,8);
WriteLn("Imito injection written:",I);
end;
if mode=1 then SimpleEncrypt(f1,f2) else
if mode=2 then GammingEncrypt(f1,f2,S) else
if mode=3 then FeedBackGammingEncrypt(f1,f2,S);
end else
if task=2 then
begin
if (mode<1)or(mode>3) then Err("Incorrect crypting mode");
WriteLn("Decoding....");
if imito then BlockRead(f1,I,8);//Чтение имитовставки
if mode=1 then SimpleDecrypt(f1,f2) else
if mode=2 then GammingDecrypt(f1,f2,S) else
if mode=3 then FeedBackGammingDecrypt(f1,f2,S);
if imito then //Сравнение имитовставки
begin
//Вычисление имитовставки расшифрованного файла
if I=ImitoInjection(f2) then WriteLn("Imito check OK ",I) else WriteLn("Imito check FAILED ",I);
end;
end;
WriteLn(FileSize(f2)," bytes processed");
CloseFile(f1);
CloseFile(f2);
end.
← →
ПЗ (2008-10-02 21:17) [13]Не знаю, что понимается под копированием, но выше готовая консольная утилита для шифрования\расшифрования файла. На фходе - шифрованный, на выходе - расшифрованный, и наоборот. Поддерживает несколько режимов. Года три назад писал...
← →
TStas © (2008-10-02 21:47) [14]Вот чем я пользуюсь. Дёшево и сердито:
{Ïðîöåäóðà êñîðíîãî øèôðîâàíèÿ/äåøèôðîâàíèÿ ïîòîêà. Src - èñõîäíûé ïîòîê,
Dest - ðåçóëüòèðóþùè&# 233;, Key - ïîòîê-êëþ÷}
Procedure XorCodeStream(Src, Dest, Key: TStream);
var
b1, b2, b3: Byte;
I, SrcLn, KeyLn, n, m: Integer;
Begin
m := src.Seek(0, soFromCurrent); //Çàïîìíèë ïîëîæåíèå óêàçàòåëÿ ïîòîêà
SrcLn := src.Seek(0, soFromEnd); //Ïîëó÷èë äëèííó ïîòîêà
src.Seek(m, soFromBeginning); //Âåðíóë óêàçàòåëü â çàä
KeyLn := Key.Seek(0, soFromEnd); //Ïîëó÷èë äëèííó ïîòîêà
Key.Seek(0, soFromBeginning); //Âåðíóë óêàçàòåëü â çàä
For i := 1 to SrcLn do //Öèêë ïî âñåìó èñõîäíîìó ïîòîêó
Begin
N := Src.Read(b1, 1); //Ïðî÷¸ë îäèí áàéò èç èñõîäíîãî
n := n mod KeyLn; //Ïîëó÷èë, êàêîé áàéò ÷èòàòü èç êëþ÷à
Key.Seek(n, soFromBeginning); //Íàø¸ë ýòîò áàéò
Key.Read(b2, 1); //Ïðî÷¸ë áàéò
b3 := b1 xor b2; //Îòêñîðèë èñõîäíûé áàéò
Dest.Write(b3, 1); //È çàïèñàë â ãîòîâûé ïîòîê
End;
End;
← →
@!!ex © (2008-10-02 22:23) [15]
procedure THEXEditor.CryptXOR(const Key: TXORKey);
var
KeyIT, DataIT:integer;
begin
KeyIT:=0;
for DataIT := 0 to Length(FData) - 1 do begin
FData[DataIT]:=FData[DataIT] xor Key[KeyIT];
inc(KeyIT);
if (KeyIT>=Length(Key)) then
KeyIT:=0;
end;
end;
← →
Германн © (2008-10-03 00:59) [16]Какое огромное количество готовых решений для "незрелого" вопроса!
:)
Тогда и я добавлю решение. Создавать WinRAR-архив с паролем и с опцией "Шифровать имена файлов". Против этого лома очень трудно будет найти "другой лом"! :)
← →
Германн © (2008-10-03 01:56) [17]
> ПЗ (02.10.08 21:17) [13]
>
> Не знаю, что понимается под копированием, но выше готовая
> консольная утилита для шифрования\расшифрования файла.
Т.е. в [13] это "отрыжка"? :)
Не знаю что спрашивали, но отвечаю то, что знаю :)
← →
Поросенок Винни-Пух © (2008-10-03 09:26) [18]эх, велосипедисты, велосипедисты .....
а про криптоапи никто и не вспомнил
← →
Ega23 © (2008-10-03 10:12) [19]
> @!!ex © (02.10.08 09:55) [4]
>
> xor, что тут думать... самая быстрая операция.
> делаешь башой ключ. шифруеш его RSA и все.
>
RSA долго. AES быстрее будет. Но это - симметричное, одним ключом и кодировать и декодировать можно, в отличие от RSA.
← →
Ega23 © (2008-10-03 10:14) [20]
> а про криптоапи никто и не вспомнил
С ним тонкости использования есть. Юридические.
← →
Поросенок Винни-Пух © (2008-10-03 10:51) [21]какие еще тонкости?
← →
@!!ex © (2008-10-03 11:13) [22]> [19] Ega23 © (03.10.08 10:12)
долгое. :)
Поэтому генерим рандомом xor ключ, шифруем с его помощью файлик. ключ шифруем RSA, AES или любым другим, ключ отдаем. зашифрованный xor ключ кладем рядом с файлом.
Если ты знаешь ключ, то расшифровываешь xor. что долго, но один раз. после чего с помощью xor ключа расшифровываешь данные.
в случае RSA вообще можно ключи по открытому каналу передавать.
← →
Поросенок Винни-Пух © (2008-10-03 11:27) [23]Поэтому генерим рандомом xor ключ, шифруем с его помощью файлик. ключ шифруем RSA, AES или любым другим, ключ отдаем.
получаем свой велосипедный PKI (асиметричное крипто на открытых ключах)
← →
@!!ex © (2008-10-03 12:06) [24]> [23] Поросенок Винни-Пух © (03.10.08 11:27)
естественно. я нигде и не утверждал, что это мое изобретение. классический подход к шифрованию.
← →
Anatoly Podgoretsky © (2008-10-03 12:22) [25]> @!!ex (03.10.2008 11:13:22) [22]
Если RSA то нафиг еще и XOR?
← →
Vlad Oshin © (2008-10-03 12:32) [26]
> Если RSA то нафиг еще и XOR?
xor быстрее и к данным, RSA только к ключу
← →
Поросенок Винни-Пух © (2008-10-03 13:01) [27]я нигде и не утверждал, что это мое изобретение
я не про это. я про то, что похоже многие ставят винду только для того, чтобы появилась "полянка телепузиков" (дефолтные обои xp)ю После чего ишут замену проводнику, ie, блокноту, шедулеру и т.д.
а здесь вот предлагают свое крипто которое уже реализовано там.
← →
Eraser © (2008-10-03 15:14) [28]шифрование средствами крипто API
function EncryptData(ASessionKey: THandle; AData: TStream): Boolean;
var
dwLength, bufLen: DWORD;
bReturn: Boolean;
begin
Result := False;
if ASessionKey = 0 then
Exit;
EnterCriticalSection(csCrypto);
try
// Зашифруем поток AData
dwLength := AData.Size;
bufLen := AData.Size;
// Определяем размер буффера для зашифрованых данных.
// Для блочных шифров необходимо добавить примерно 10 байт.
bReturn := CryptEncrypt(ASessionKey, 0, True, 0, nil, @dwLength,
AData.Size);
if not bReturn then
Exit;
AData.Size := dwLength + 20;
// Скопируем незашифрованные данные в выделеный буффер.
AData.Position := 0;
dwLength := AData.Size;
// Шифруем.
bReturn := CryptEncrypt(ASessionKey, 0, True, 0, TMemoryStream(AData).Memory,
@bufLen, AData.Size);
if not bReturn then
Exit;
AData.Size := bufLen;
AData.Position := 0;
Result := True;
finally
LeaveCriticalSection(csCrypto);
end;
end;
function DecryptData(ASessionKey: THandle; AData: TStream): Boolean;
var
dwLength: DWORD;
bReturn: Boolean;
begin
Result := False;
if ASessionKey = 0 then
Exit;
EnterCriticalSection(csCrypto);
try
dwLength := AData.Size;
AData.Position := 0;
// Расшифруем данные.
bReturn := CryptDecrypt(ASessionKey, 0, True, 0, TMemoryStream(AData).Memory, @dwLength);
if not bReturn then
Exit;
AData.Size := dwLength;
AData.Position := 0;
Result := True;
finally
LeaveCriticalSection(csCrypto);
end;
end;
создание симметричного ключа
bReturn := CryptGenKey(hProvParty2, dwAlgID,
(dwSessionKeySize shl 16) or CRYPT_EXPORTABLE,
@hSessionKey2);
if not bReturn then
Exit;
← →
Jeer © (2008-10-03 17:12) [29]И, Боже мой - как много букв произнесено,
И много-ль смысла в них привнесено ?
Помог-ли страждущему водой
Преподнесенный, и кипящий чайник, мной ?
(C) Jeer
← →
blackman © (2008-10-05 19:32) [30]Ерунда все это. Проще надо. Использовать например ARJ и с его помощью и шифровать и писать
http://articles.org.ru/docum/arj.php
← →
RustB (2008-10-06 17:25) [31]ВСЕМ ОГРОМНОЕ СПАСИБО!!!
← →
имя (2009-03-27 08:51) [32]Удалено модератором
← →
имя (2009-03-27 08:52) [33]Удалено модератором
← →
имя (2009-03-27 09:12) [34]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.007 c