CreateKeySchedule

From SunFlurry wiki
Jump to: navigation, search
  CreateKeySchedule (Функции криптографии)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, неверный аргумент
Визуальность:Нет

Функция позволяет создать из текстового ключа объект, необходимый для кодирования или декодирования информации с помощью этого ключа. Объект обычно называется расписанием кодирования или декодирования. В дальнейшем этот объект может использоваться для вызова функций кодирования Encrypt или декодирования Decrypt.

Синтаксис

CreateKeySchedule(<Стандарт кодирования (STRING)>,<Ключ (пароль) (STRING,BUFFER)>,<Для декодирования (INT)>=0):<Параметр кодировщика (BUFFER)>

Аргументы

  • <Стандарт кодирования (STRING)> - Строка, задающая стандарт кодирования. На данный момент доступны следующие стандарты:
    • AES256 -- AES-256. Данные будут кодироваться (и декодироваться) блоками по 16 байт. Ключ должен иметь длину 32 символа.
  • <Ключ (пароль) (STRING,BUFFER)> - Ключ должен представлять собой ANSI строку или буфер, его длина зависит от метода кодирования. В строке могут присутствовать любые символы, в т.ч. символ с кодом 0. Обычно эта строка формируется из введенного пользователем пароля с помощью некоторого преобразования (самое простое преобразование -- добавление каких-либо символов с конца строки-пароля, чтобы размер ключа совпадал с требуемым, но также можно вычислить хеш строки пароля и использовать ее в виде ключа).
  • <Для декодирования (INT)> - (необязательный аргумент) По умолчанию (0) расписание будет создано для кодирования информации, если этот аргумент равен 1, будет создано расписание для декодирования информации.

Возвращаемое значение

Возвращается объект буфера, представляющий собой расписание кодирования или декодирования. Этот объект передается в функции Encrypt или Decrypt соответственно.

Примеры


  Function ЗакодироватьUTF16(Текст,бРасписание)
    //Добавляем 4 байта длины текста в начале UTF-16 строки, чтобы знать его длину после раскодирования,
    //  так как кодирование и раскодирование осуществляются блоками длиной 16 байт
    Текст:=Chr(Length(Текст) And $FFFF,2)+Chr((Length(Текст) Shr 16) And $FFFF,2)+Текст;
    //Найдем остаток, чтобы добавить заполнитель
    i:=16-Length(Текст)*2 mod 16;
    If i>0 Then
      //Заполним символом 0, но вообще можно заполнить случайными символами
      Текст:=Текст+RepeatStr(Chr(0,2),i div 2);
    EndIf;
    //Закодируем текст
    Result:=Encrypt("AES256",Текст,бРасписание,1);
  EndFunction

Стр:="Проверка";
Message("Исходная строка: "+Стр);
//Создадим секретный ключ, он должен быть строкой с 32 символами.  
Ключ:="ABC secret"+Chr(1)+Chr(2)+Chr(3);
Ключ:=Ansi(Ключ+RepeatStr(Chr(0),32-length(Ключ)));

//Создадим расписание кодирования
бРасписание:=CreateKeySchedule("AES256",Ключ);
СтрКод:=ЗакодироватьUTF16(Стр,бРасписание);
//Выведен закодированную строку в шестнадцатеричном виде
Стр2:="";
For i:=1 To Length(СтрКод) Do
  Стр2:=Стр2+" "+DecToHex(Asc(СтрКод[i]),2);
EndDo;
Message("Кодированная строка:"+Стр2);

//Декодируем строку тем же самым ключом, создадим расписание декодирования
бРасписание:=CreateKeySchedule("AES256",Ключ,1);
Стр:=Decrypt("AES256",СтрКод,бРасписание,1);

//Необходимо получить длину строки и отрезать ее остаток
аДлина:=Asc(Стр[1])+Asc(Стр[2]) shl 16;

//Отрезаем первые 2 символа (4 байта) и любые символы с конца строки
Стр:=Mid(Стр,3,аДлина);
Message("Декодированная строка: "+Стр);