 Введение

Документация составлена для Password Commander версии 2.0

Плагины шифрования позволяют подключить к Password Commander любой симметричный алгоритм шифрования, что позволяет повысить безопасность данных аккаунта. Плагины представляют из себя dll-библиотеки, разработанные по определенной спецификации. Для установки плагина шифрования достаточно скопировать его в папку {Папка с программой}\Plugins\Encryption (обычно C:\Program Files\Password Commander\Plugins\Encryption), после чего плагин готов к использованию.

Язык, используемый для разработки плагина в этом пособии, - Object Pacsal, среда - Delphi, однако Вы можете использовать абсолютно любой язык программирования, при условии поддержки им 32-х битных динамических библиотек.

Что необходимо знать для написания плагина:

  • Владение каким-либо языком программирования, опыт работы с 32-разрядными динамическими библиотеками Windows;
  • Алгоритм шифрования - расшифровки строки по ключу.

ВНИМАНИЕ! Длина имени файла dll-библиотеки плагина должна быть не более двадцати символов.

Далее >>

Copyright © 2004-2005 Exprite Software Team


 Экспортируемые функции

Плагин шифрования содержит три экспортируемые функции: GetPluginInfo, EncryptString и DecryptString. Рассмотрим каждую из них подробнее.

GetPluginInfo

Описание:
function GetPluginInfo: PChar;

Возвращаемое значение:
Функция возвращает информацию о плагине. Строка разделена на 6 частей. Разделитель #7#7. Признак конца строки - #0. Перечислим поля:
1. Название плагина (не более 20 символов).
2. Алгоритм шифрования.
3. Описание плагина.
4. Версия плагина.
5. Версия Password Commander, для которой разработан плагин.
6. Информация о разработчике, его авторские права.

Функция обязательно должна возвращать 6 полей, иначе плагин считается неверным.

EncryptString

Описание:
function EncryptString(const S, Password: PChar; var StrLength: LongWord): PChar; cdecl;

Передаваемые параметры:
S - указатель на строку, которую необходимо зашифровать;
Password - указатель на строку, содержащую ключ шифрования;
StrLength - длина шифруемой строки. Может быть изменена, если это необходимо

ВНИМАНИЕ! Если длина шифруемой строки и зашифрованной не совпадают, необходимо в SrtLength записать длину зашифрованной строки!

Примечание: не используйте символ #0 как признак конца строки! Программа очень часть передает строки, содержащие #0, так что получить длину строки необходимо только через параметр StrLength.

Возвращаемые параметры:
Возвращается указатель на зашифрованную строку.

ВНИМАНИЕ! Под результирующую строку необходимо выделить память функцией VirtualAlloc!
Result := VirtualAlloc (nil, StrLength, MEM_COMMIT, PAGE_READWRITE);

DecryptString

Описание:
function DecryptString(const S, Password: PChar; var StrLength: LongWord): PChar; cdecl;

Передаваемые параметры:
S - указатель на строку, которую необходимо расшифровать;
Password - указатель на строку, содержащую ключ для расшифровки;
StrLength - длина расшифровываемой строки. Может быть изменена, если это необходимо.

ВНИМАНИЕ! Если длина расшифровываемой строки и расшифрованной строки не совпадают, необходимо в SrtLength записать длину расшифрованной строки.

Возвращаемые параметры:
Возвращается указатель на расшифрованную строку.

ВНИМАНИЕ! Под результат необходимо выделить память функцией VirtualAlloc!
Result := VirtualAlloc (nil, StrLength, MEM_COMMIT, PAGE_READWRITE);

Далее >>

Copyright © 2004-2005 Exprite Software Team


 Пример

Ниже представлен пример плагина, написанного на Delphi (используется простейший алгоритм преобразования строки):

library test;

uses
Math,
SysUtils,
System,
Windows;

function GetPluginInfo: PChar;
begin
Result := 'Test' + #7#7 + 'Test' + #7#7 + 'Test plug-in' + #7#7 + '1.0' + #7#7 + '2.0' + #7#7 + 'Testers';
end;

function EncryptString(const S, Password: PChar; var StrLength: LongWord): PChar; cdecl;
var
SS : string;
I : integer;
Key : integer;
Tmp :Integer;
begin

SetString (SS, S, StrLength);

key := length (Password);

if key > 255 then
raise Exception.Create('Key is too length!');

for i := 1 to Length (SS) do
begin
tmp := ord (SS[i]) + key;
if tmp > 255 then
tmp := tmp - 255;
SS[i] := chr (tmp);
end;

StrLength := Length(SS);

Result := VirtualAlloc(nil, StrLength, MEM_COMMIT, PAGE_READWRITE);

move(SS[1], Result^, StrLength);
end;

function DecryptString(const S, Password: PChar; var StrLength: LongWord): PChar; cdecl;
var
SS : string;
I : integer;
Key : integer;
Tmp :Integer;
begin

SetString (SS, S, StrLength);

key := length (Password);

if key > 255 then
raise Exception.Create('Key is too length');

for i := 1 to Length (SS) do
begin
tmp := ord (SS[i]) - key;
if tmp < 0 then
tmp := tmp + 255;
SS[i] := chr (tmp);
end;

StrLength := Length(SS);

Result := VirtualAlloc(nil, StrLength, MEM_COMMIT, PAGE_READWRITE);

move(SS[1], Result^, StrLength);
end;

exports
GetPluginInfo,
EncryptString,
DecryptString;

begin
end.

Далее >>

Copyright © 2004-2005 Exprite Software Team


 Рекомендации для блочных алгоритмов шифрования

Для блочных алгоритмов рекомендуется применять методы обработки строк, изложенные ниже:

Для шифрования:

В плагине шифрования в начало исходной строки сначала дописываются 8 байт любого содержания, затем строка с уже включенными 8 байтами дополняется символами #0 то тех пор, пока ее длина не станет кратной размеру блока алгоритма шифрования. После чего в первые 8 байт строки записывается число типа Longword, содержащее количество дополнительных символов #0.

Таким образом, строка, поступающая на вход алгоритма шифрования, выглядит выглядит так:

[Число типа Longword=8 байт][Нужное количество #0][Исх. строка]

|_____________________Кратно размеру блока____________________|

Для расшифровки:

Если это блочный шифр, то после расшифровки необходимо считать первые 8 байт в переменную типа Longword, и затем исключить из начала строки количество символов, равное значению этой переменной и первые 8 байт, которые занимает число типа Longword.

Можно использовать любые другие алгоритмы приведения длины строки так, чтобы она была кратной размеру блока. Есть только одно условие: все это должно производиться плагином, а не главным приложением.

Copyright © 2004-2005 Exprite Software Team