{$I-,R-}Unit Crypter;
interfaceUses Objects;
procedure EnCrypt(var Pntr: Arrayof Char; ArrLen: Word; password: string);
{ - Закpиптовать блок }procedure DeCrypt(var Pntr: Arrayof Char; ArrLen: Word; password: string);
{ - Раскиптовать блок }procedure EnCryptStream(var st: tStream; Password: String);
{ - Закpиптовать поток }procedure DeCryptStream(var st: tStream; Password: String);
{ - Раскиптовать поток }implementationprocedure EnCrypt(var Pntr: Arrayof Char; ArrLen:Word; password: string);
var
len,pcounter: byte;
x:Word;
begin
len := length(password) div 2;
pcounter := 1;
for x:=0 to ArrLen-1 dobegin
Pntr[x] := chr(ord(password[pcounter]) + ord(Pntr[x]) + len);
inc(pcounter);
if pcounter > length(password) then pcounter := 1;
end;
end;
procedure DeCrypt(var Pntr: Arrayof Char; ArrLen:Word; password: string);
var
len,pcounter: byte;
x:Word;
begin
len := length(password) div 2;
pcounter := 1;
for x:=0 to ArrLen-1 dobegin
Pntr[x] := chr(ord(Pntr[x]) - ord(password[pcounter]) - len);
inc(pcounter);
if pcounter > length(password) then pcounter := 1;
end;
end;
type
pBuffer = ^tBuffer;
tBuffer = Array[1..$FFFF] of Char;
procedure EnCryptStream(var st: tStream; Password: String);
var
buf: pBuffer;
StSize, StPos, p: Longint;
beginif (@st=nil) or (Password='') then exit;
New(buf);
StPos:=st.GetPos;
StSize:=st.GetSize;
st.Reset;
st.Seek(0);
repeat
p:=st.GetPos;
if SizeOf(Buf^)> St.GetSize-St.GetPosthen st.Read(buf^,St.GetSize-St.GetPos)
else st.Read(buf^,SizeOf(Buf^));
EnCrypt(buf^,SizeOf(buf^),password);
st.Reset;
st.Seek(p);
st.Write(buf^,SizeOf(Buf^));
until (St.GetSize=St.GetPos);
st.Seek(StSize);
st.Truncate;
st.Seek(StPos);
Dispose(buf);
end;
procedure DeCryptStream(var st: tStream; Password: String);
var
buf: pBuffer;
StSize, StPos, p: Longint;
beginif (@st=nil) or (Password='') then exit;
New(buf);
StPos:=st.GetPos;
StSize:=st.GetSize;
st.Reset;
st.Seek(0);
repeat
p:=st.GetPos;
if SizeOf(Buf^)> St.GetSize-St.GetPosthen st.Read(buf^,St.GetSize-St.GetPos)
else st.Read(buf^,SizeOf(Buf^));
DeCrypt(buf^,SizeOf(buf^),password);
st.Reset;
st.Seek(p);
st.Write(buf^,SizeOf(Buf^));
until (St.GetSize=St.GetPos);
st.Seek(StSize);
st.Truncate;
st.Seek(StPos);
Dispose(buf);
end;
end.
Перевод контента на русский язык:
Программа Delphi, которая реализует алгоритм шифрования и дешифрования с использованием пароля. Основные процедуры:
EnCrypt: Шифрует массив символов (Pntr) с помощью пароля.
DeCrypt: Дешифровывает массив символов (Pntr) с помощью пароля.
EnCryptStream: Шифрует поток (st) с помощью пароля.
DeCryptStream: Дешифровывает поток (st) с помощью пароля.
Алгоритмы шифрования и дешифрования используют простой цифровой шифр, где каждый символ входного текста шифруется/дешифровывается путем добавления/вычитания ASCII-значения соответствующего символа в пароле. Длина пароля используется как ключ для определения смещения операции добавления/вычитания.
Некоторые предложения по улучшению кода:
Обработка ошибок: Добавьте механизмы обработки ошибок, чтобы обрабатывать случаи, когда входной поток или массив является недопустимым, или когда пароль пуст.
Обработка потока: Рассмотрите использование более эффективного способа чтения и записи в поток, например, с помощью буферов или chunking данных.
Хранение пароля: Если планируете хранить зашифрованный текст или пароль, убедитесь, что используете безопасный метод для хранения чувствительных данных,such as hashing and salting.
Безопасность алгоритма: Этот простой цифровой шифр не является безопасным и может быть легко взломан атакующим. Рассмотрите использование более безопасного алгоритма, such as AES (Advanced Encryption Standard), для производственного уровня шифрования.
Альтернативное решение:
Вместо реализации собственного алгоритма шифрования можно использовать компонент Delphi TMemoryStream для шифрования и дешифрования потока. Также можно использовать компонент TSHA1Hash для хеширования пароля и безопасного хранения.
В этом коде используется компонент TSHA1Hash для хеширования пароля и затем шифруется/дешифровывается поток с помощью зашифрованного пароля. Обратите внимание, что это упрощенный пример и может не быть подходящим для производственного уровня шифрования из-за его простоты.
Помните всегда следовать лучшим практикам при реализации алгоритмов шифрования и дешифрования, таких как безопасное хранение чувствительных данных, валидация входных данных и тестирование на ошибки.
Шифрование текста: реализация алгоритмов шифрования и расшифрования текстовых данных в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.