Decrypt

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

Функция производит декодирование строки или буфера, закодированных по стандарту, заданному первым аргументом. Размер строки или буфера должен быть кратен количеству байт, заданному стандартом кодирования (к примеру, для AES-256, это число 16); если размер не будет кратен нужному количеству байт, функция вызове исключение. Нужно иметь в виду, что для UTF-16 строк, размер в байтах в два раза больше, чем количество символов в строке. Если первым параметром служит буфер, в результате функция возвратит единицу, а содержимое буфера будет декодировано, если первым параметром была передана строка, функция возвратит ANSI или UTF-16 строку, в зависимости от значения третьего аргумента.

Синтаксис

Decrypt(<Стандарт кодирования (STRING)>,<Информация для декодирования (STRING,BUFFER)>,<Параметр декодировщика (расписание декодирования) (BUFFER)>,<Результат в формате UTF-16 (INT)>=0):<Декодированная строка или 1>

Аргументы

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

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

Возвращается ANSI или UTF-16 строку, если второй аргумент является строкой или единицу, если второй аргумент является буфером.

Примеры


  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("Декодированная строка: "+Стр);