Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Симметричное шифрование строк в Delphi XE2 без сторонних библиотек

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

Оригинальный заголовок

Simple code to encrypt an .INI file string using a password

Подробное описание проблемы

Пользователь ищет простой способ симметричного шифрования строки с использованием пароля, который не требует сторонних библиотек, предпочтительно без использования единиц. Задача состоит в том, чтобы зашифровать строку таким образом, чтобы её можно было сохранить в файле .INI, и при этом она не должна быть читаема без ключа. В качестве примера использования приводится список элементов списка, который пользователь хочет сохранять в .INI-файле при закрытии программы и загружать при запуске.

Контекст для написания статьи

Пользователь упоминает, что не хочет использовать хеш-функции и не интересуется асимметричным шифрованием. Он также указывает, что предпочёл бы не использовать даже единицы, а желает просто функцию, которую можно было бы "вставить и забыть". В качестве примера простого шифра, который не требует сложных библиотек, приводится метод XOR-цифрования. Однако, в качестве альтернативного ответа, пользователь получает ссылку на библиотеку, которая предоставляет функционал для шифрования и дешифрования, используя алгоритм 3DES и Base64 для преобразования в строку.

Подтвержденный ответ

Для решения задачи шифрования строк в .INI-файле без использования сторонних библиотек можно использовать простой алгоритм шифрования с использованием XOR-цифрования. В качестве ключа для шифрования используется пароль, предоставленный пользователем. Для удобства, можно создать класс, который будет включать методы шифрования и дешифрования строк.

unit XORCrypt;

interface

type
  TXORCrypt = class
  private
    FPassword: string;
    function XorByte(Byte1, Byte2: Byte): Byte;
  public
    constructor Create(const APassword: string);
    function Encrypt(const Value: string): string;
    function Decrypt(const Value: string): string;
    property Password: string read FPassword write FPassword;

end;

implementation

uses
  System.SysUtils;

type
  TByteArray = array of byte;

constructor TXORCrypt.Create(const APassword: string);
begin
  FPassword := APassword;
end;

function TXORCrypt.XorByte(Byte1, Byte2: Byte): Byte;
begin
  Result := Byte1 xor Byte2;
end;

function TXORCrypt.Encrypt(const Value: string): string;
var
  I: Integer;
  ValueBytes: TByteArray;
  EncryptedBytes: TByteArray;
  EncryptedStr: string;
begin
  SetLength(ValueBytes, Length(Value));
  FillChar(ValueBytes[0], Length(Value), #0);
  MoveAnsiCopy(Value[1], ValueBytes[0], Length(Value));
  SetLength(EncryptedBytes, Length(Value));
  for I := 0 to Length(Value) - 1 do
    EncryptedBytes[I] := XorByte(EncryptedBytes[I], Ord(FPassword[I mod Length(FPassword) + 1]));
  EncryptedStr := '';
  for I := 0 to Length(EncryptedBytes) - 1 do
    EncryptedStr := EncryptedStr + IntToHex(EncryptedBytes[I], 2);
  Result := EncryptedStr;
end;

function TXORCrypt.Decrypt(const Value: string): string;
var
  I: Integer;
  ValueBytes: TByteArray;
  DecryptedBytes: TByteArray;
  DecryptedStr: string;
begin
  SetLength(ValueBytes, Length(Value) div 2);
  FillChar(ValueBytes[0], Length(ValueBytes) * SizeOf(Byte), #0);
  MoveAnsiCopy(Value[1], ValueBytes[0], Length(ValueBytes));
  for I := 0 to (Length(ValueBytes) - 1) div 2 do
    ValueBytes[I] := StrToByteDefIntDef(Value[I * 2 + 1 + 1], 3, Value[I * 2 + 1], 16);
  SetLength(DecryptedBytes, Length(ValueBytes));
  for I := 0 to Length(ValueBytes) - 1 do
    DecryptedBytes[I] := XorByte(DecryptedBytes[I], Ord(FPassword[I mod Length(FPassword) + 1]));
  SetLength(DecryptedStr, Length(DecryptedBytes));
  MoveAnsiCopy(PCharDec(DecryptedBytes[0]), DecryptedStr[1], Length(DecryptedBytes));
  Result := DecryptedStr;
end;

{ TXORCrypt }

Данные примеры функций шифрования и дешифрования можно использовать для зашифрованного сохранения данных в .INI-файле. Важно отметить, что для большей безопасности и защиты от простых атак метод XOR не является достаточным, и для критичных систем следует использовать более сложные алгоритмы.

Альтернативный ответ

Также, в качестве альтернативного ответа, можно использовать предоставленный пользователем пример с использованием алгоритма 3DES и Base64 для преобразования в строку, если необходимо более высокий уровень безопасности и более сложная интеграция в проект.

Создано по материалам из источника по ссылке.

Пользователь ищет простой способ симметричного шифрования строки для хранения в .INI файле с использованием пароля и без сторонних библиотек.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шифрование ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 11:00:04/0.0053489208221436/1