Proprietary software by ® Rudoysecurity™

Модуль BytesUtils

Описание

Утилита для работы с битами, динамическими массивами байтов и потоками байтов Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

<author> © Рудой Андрей Игоревич</author>

Используемые модули

Обзор

Процедуры и функции

procedure AllGUIDToByteArrays(const AGUID: TGUID; out D1Bytes, D2Bytes, D3Bytes, D4Bytes: TBytes);
procedure AllGUIDToByteArraysBE(const AGUID: TGUID; out D1Bytes, D2Bytes, D3Bytes, D4Bytes: TBytes);
function ApplySBox( Data, SBox: TBytes): TBytes;
function BitsToBytes(const Bits: TBits): TBytes;
function BitsToBytesAligned(const Bits: TBits; TotalBytes: Integer = -1; FillValue: Boolean = False): TBytes;
function BitsToBytesEx(const Bits: TBits; BitOrder: TBitOrder = boLSBFirst): TBytes;
function BitsToBytesFast(const Bits: TBits): TBytes;
function BitsToString(const Bits: TBits): string;
function BytesToBinaryString(const Data: TBytes): string;
function BytesToBits(const Data: TBytes): TBits;
function BytesToBitsAdvanced(const Data: TBytes; StartBit: Integer = 0; BitCount: Integer = -1): TBits;
function BytesToBitsEx(const Data: TBytes; BitOrder: TBitOrder = boLSBFirst): TBits;
function BytesToBitsFast(const Data: TBytes): TBits;
function BytesToDateTime(const ABytes: TBytes): TDateTime;
function BytesToHex(Source: TBytes): string;
function BytesToSystemTime(AValue: TBytes): TSystemTime;
function CompareBytes(const Arr1, Arr2: TBytes): Boolean;
function CompareStreams(Stream1, Stream2: TStream): Boolean;
function ConcatBytesFast(const A, B: TBytes): TBytes;
function CreateInvSBox(const Key, Seed: TBytes): TBytes;
function CreateSBox(Key, Seed: TBytes): TBytes;
function DateTimeToBytes(const ADateTime: TDateTime): TBytes;
function GenerateKeystream(const AKey, ASeed: TBytes; AOutputLength: Integer): TBytes;
function GenerateRandomBytes(Size: Int64): TBytes;
function GUIDToBytes(const AGUID: TGUID): TBytes;
function HexToBytes(Source: string): TBytes;
procedure InitializeMatrix(out ByteMatrix: Array of TBytes; Key, Nonce: TBytes);
function InverseBytesA(ASource: TBytes): TBytes;
function InverseBytesR(ASource: TBytes): TBytes;
function NonlinearDistortion(ASource: TBytes): TBytes;
function Number64ToBytes(const Number: Int64; IsBigEndian: Boolean = True): TBytes;
function NumberToBytes(const Number: int64): TBytes;
function PKCS7Padding(const Data: TBytes; BlockSize: Integer): TBytes;
function PKCS7Unpadding(const Data: TBytes): TBytes;
function ProcessData(Source: TBytes; ByteMatrix: Array of TBytes; Encrypt: Boolean): TBytes;
function ReadBytesFromRegistry(const RootKey: HKEY; const KeyPath, ValueName: string): TBytes;
function ROLByte(Value: Byte; Shift: Integer): Byte;
function ROLbytes(ASource: TBytes; Shift: integer): TBytes;
function ROLlongword(Value: LongWord; Shift: integer): LongWord;
function RORByte(Value: Byte; Shift: Integer): Byte;
function RORbytes(ASource: TBytes; Shift: integer): TBytes;
function RORlongword(Value: LongWord; Shift: integer): LongWord;
procedure SecureErase(var Data: TBytes);
procedure SplitBytesFast(const Source: TBytes; out Left, Right: TBytes);
procedure SplitStream(Stream: TBytesStream; out b1, b2: TBytes);
function SystemTimeToBytes(AValue: TSystemTime): TBytes;
function ValidateSBoxPair(const SBox, InvSBox: TBytes): Boolean;
procedure WriteBytesToRegistry(const RootKey: HKEY; const KeyPath, ValueName: string; const Data: TBytes);
function XORgamma(ASource, AKey: TBytes; out HMAC: TBytes): TBytes;

Типы

TBitOrder = (...);

Константы

ABOX: TBytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255];
InvSBoxAES: TBytes = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];
MatrixBox: Array of TBytes = [[99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 73, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22], [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0]];
RBOX: TBytes = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
SBoxAES: TBytes = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 73, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];

Переменные

InvSBox: TBytes;
SBox: TBytes;

Описание

Процедуры и функции

procedure AllGUIDToByteArrays(const AGUID: TGUID; out D1Bytes, D2Bytes, D3Bytes, D4Bytes: TBytes);

Разбивает GUID на 4 отдельных массива байтов (Little-Endian). © Рудой Андрей Игоревич, 2005 - 2025 г.

Порядок байтов сохраняется как в исходном GUID <author> © Рудой Андрей Игоревич</author>

Параметры
AGUID
Исходный GUID для преобразования
D1Bytes
Выходной массив для D1 (4 байта)
D2Bytes
Выходной массив для D2 (2 байта)
D3Bytes
Выходной массив для D3 (2 байта)
D4Bytes
Выходной массив для D4 (8 байт)
procedure AllGUIDToByteArraysBE(const AGUID: TGUID; out D1Bytes, D2Bytes, D3Bytes, D4Bytes: TBytes);

Разбивает GUID на 4 отдельных массива байтов (Big-Endian). © Рудой Андрей Игоревич, 2005 - 2025 г.

Преобразует компоненты D1-D3 в Big-Endian порядок <author> © Рудой Андрей Игоревич</author>

Параметры
AGUID
Исходный GUID для преобразования
D1Bytes
Выходной массив для D1 (4 байта, BE)
D2Bytes
Выходной массив для D2 (2 байта, BE)
D3Bytes
Выходной массив для D3 (2 байта, BE)
D4Bytes
Выходной массив для D4 (8 байт, без изменений)
function ApplySBox( Data, SBox: TBytes): TBytes;

Выполняет подстановку байтов в данных с использованием S-Box

<author> © Рудой Андрей Игоревич</author>

Параметры
Data
Исходные данные для преобразования
SBox
Таблица подстановок S-Box
Возвращаемые значения

Данные после применения подстановки

function BitsToBytes(const Bits: TBits): TBytes;

Преобразует битовое представление TBits в массив байтов TBytes. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Биты упаковываются в байты в порядке от младшего к старшему (LSB first) Если количество битов не кратно 8, последний байт дополняется нулями в старших битах Для пустого или неинициализированного TBits возвращается пустой массив

<example>

var
  Bits: TBits;
  Bytes: TBytes;
begin
  Bits := TBits.Create;
  try
    Bits.Size := 12;
    Bits[0] := True;  Bits[1] := False; Bits[2] := True;  // 101...
    Bits[3] := False; Bits[4] := True;  Bits[5] := False; // 010...
    // ... и так далее
    Bytes := BitsToBytes(Bits);
    // Bytes теперь содержит упакованные байты
  finally
    Bits.Free;
  end;
end;

</example>

Параметры
Bits
Объект TBits для преобразования в байтовый массив
Возвращаемые значения

Динамический массив байтов TBytes, содержащий упакованное битовое представление

function BitsToBytesAligned(const Bits: TBits; TotalBytes: Integer = -1; FillValue: Boolean = False): TBytes;

Преобразует битовое представление TBits в массив байтов TBytes с выравниванием и заполнением. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Полезно для создания данных фиксированного размера с определенным заполнением Если TotalBytes больше необходимого, дополнительные биты заполняются указанным значением Если TotalBytes меньше необходимого, данные обрезаются

Параметры
Bits
Объект TBits для преобразования в байтовый массив
TotalBytes
Общее количество байтов в результирующем массиве (-1 для автоматического расчета)
FillValue
Значение для заполнения дополнительных битов (True = 1, False = 0)
Возвращаемые значения

Динамический массив байтов TBytes заданного размера с упакованным битовым представлением

function BitsToBytesEx(const Bits: TBits; BitOrder: TBitOrder = boLSBFirst): TBytes;

Преобразует битовое представление TBits в массив байтов TBytes с указанием порядка битов. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

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

Параметры
Bits
Объект TBits для преобразования в байтовый массив
BitOrder
Порядок упаковки битов: boLSBFirst (младший бит первый) или boMSBFirst (старший бит первый)
Возвращаемые значения

Динамический массив байтов TBytes, содержащий упакованное битовое представление

function BitsToBytesFast(const Bits: TBits): TBytes;

Быстрое преобразование битового представления TBits в массив байтов TBytes. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Использует прямой доступ к памяти через указатели для повышения производительности Рекомендуется для работы с большими битовыми массивами

Параметры
Bits
Объект TBits для преобразования в байтовый массив
Возвращаемые значения

Динамический массив байтов TBytes, содержащий упакованное битовое представление

function BitsToString(const Bits: TBits): string;

Преобразует битовый массив TBits в строковое представление из '0' и '1'. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Каждый бит представляется символом '1' (True) или '0' (False) Полезно для отладки и визуализации битовых данных

Параметры
Bits
Объект TBits для преобразования в строку
Возвращаемые значения

Строка, содержащая символьное представление битового массива

function BytesToBinaryString(const Data: TBytes): string;

Преобразует массив байтов TBytes в строку бинарного представления. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Каждый байт представляется как 8 символов '0' и '1' в порядке LSB first Байты разделяются пробелами для удобства чтения

Параметры
Data
Массив байтов для преобразования в бинарную строку
Возвращаемые значения

Строка, содержащая бинарное представление каждого байта, разделенное пробелами

function BytesToBits(const Data: TBytes): TBits;

Преобразует массив байтов TBytes в битовое представление TBits. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Каждый байт преобразуется в 8 битов, биты располагаются в порядке от младшего (LSB) к старшему (MSB) Размер результирующего TBits будет равен Length(Data) * 8

<example>

var
  Bytes: TBytes;
  Bits: TBits;
begin
  SetLength(Bytes, 2);
  Bytes[0] := 170; // 10101010
  Bytes[1] := 85;  // 01010101
  Bits := BytesToBits(Bytes);
  // Bits теперь содержит 16 битов: 0101010110101010
end;

</example>

Параметры
Data
Входной массив байтов для преобразования
Возвращаемые значения

Объект TBits, содержащий битовое представление входных данных

function BytesToBitsAdvanced(const Data: TBytes; StartBit: Integer = 0; BitCount: Integer = -1): TBits;

Расширенное преобразование массива байтов в битовое представление с возможностью частичного извлечения. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Полезно для извлечения определенных битовых полей из больших массивов данных без необходимости преобразования всего массива

Параметры
Data
Входной массив байтов для преобразования
StartBit
Начальная позиция в битах, с которой начинать извлечение (по умолчанию 0)
BitCount
Количество извлекаемых битов (-1 для извлечения всех битов от StartBit до конца)
Возвращаемые значения

Объект TBits, содержащий указанное количество битов начиная с указанной позиции

function BytesToBitsEx(const Data: TBytes; BitOrder: TBitOrder = boLSBFirst): TBits;

Преобразует массив байтов TBytes в битовое представление TBits с указанием порядка битов. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Позволяет контролировать порядок битов при преобразовании, что важно для некоторых алгоритмов и форматов данных

Параметры
Data
Входной массив байтов для преобразования
BitOrder
Порядок следования битов: boLSBFirst (младший бит первый) или boMSBFirst (старший бит первый)
Возвращаемые значения

Объект TBits, содержащий битовое представление входных данных в указанном порядке

function BytesToBitsFast(const Data: TBytes): TBits;

Быстрое преобразование массива байтов в битовое представление с оптимизацией для больших массивов. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Использует прямой доступ к памяти через указатели для повышения производительности Рекомендуется для работы с большими массивами данных

Параметры
Data
Входной массив байтов для преобразования
Возвращаемые значения

Объект TBits, содержащий битовое представление входных данных

function BytesToDateTime(const ABytes: TBytes): TDateTime;

Преобразует массив байтов обратно в значение TDateTime © Рудой Андрей Игоревич, 2005 - 2025 г.

<author> © Рудой Андрей Игоревич</author>

Параметры
ABytes
Массив байтов для преобразования
Возвращаемые значения

Значение TDateTime, восстановленное из массива байтов

Вызывает исключения
EConvertError
Выбрасывается при неверном размере массива (≠8 байт)
function BytesToHex(Source: TBytes): string;

Преобразует массив байт в шестнадцатеричное строковое представление. © Рудой Андрей Игоревич, 2005 - 2025 г.

Каждый байт входного массива преобразуется в два шестнадцатеричных символа. Например: байт $FF преобразуется в строку "FF", байт $0A преобразуется в "0A".

Функция обрабатывает пустые массивы корректно, возвращая пустую строку.

<example>

var
  Data: TBytes;
  HexStr: string;
begin
  Data := [$48, $65, $6C, $6C, $6F]; // Байты для слова "Hello"
  HexStr := BytesToHex(Data); // Результат: "48656C6C6F"
end;

</example>

Параметры
Source
Входной массив байт для преобразования
Возвращаемые значения

Строка, содержащая шестнадцатеричное представление байт в верхнем регистре

function BytesToSystemTime(AValue: TBytes): TSystemTime;

Преобразует динамический массив байт (TBytes) обратно в структуру TSystemTime. Ожидает, что массив байт был создан функцией SystemTimeToBytes.

Функция ожидает массив точно размером SizeOf(TSystemTime) (16 байт). Порядок байт предполагается little-endian (архитектура x86). Для кроссплатформенной совместимости может потребоваться дополнительное преобразование порядка байт при работе с данными из big-endian систем.

Параметры
AValue
Входной массив байт для преобразования.
Возвращаемые значения

Структура TSystemTime, восстановленная из двоичного представления.

Вызывает исключения
EConvertError
Вызывается, если размер массива не соответствует размеру структуры TSystemTime.
function CompareBytes(const Arr1, Arr2: TBytes): Boolean;

Сравнивает два массива байтов на идентичность. © Рудой Андрей Игоревич, 2005 - 2025 г.

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

Для сравнения содержимого используется оптимизированная функция CompareMem, которая сравнивает блоки памяти напрямую.

Особенности: <list type="bullet"> <item>Пустые массивы считаются равными только если оба пусты</item> <item>Сложность выполнения: O(n), где n - длина массивов</item> <item>Использует побитовое сравнение для максимальной производительности</item> </list>

<example> Пример использования:

var
  Arr1, Arr2: TBytes;
  IsEqual: Boolean;
begin
  Arr1 := [1, 2, 3, 4];
  Arr2 := [1, 2, 3, 4];
  IsEqual := CompareBytes(Arr1, Arr2); // Возвращает True

  Arr2 := [1, 2, 3];
  IsEqual := CompareBytes(Arr1, Arr2); // Возвращает False (разная длина)
end;

</example>

Параметры
Arr1
Первый массив байтов для сравнения. Может быть пустым.
Arr2
Второй массив байтов для сравнения. Может быть пустым.
Возвращаемые значения

Возвращает True если: <list type="bullet"> <item>Оба массива имеют одинаковую длину</item> <item>Все соответствующие байты в массивах идентичны</item> </list> Возвращает False в противном случае.

function CompareStreams(Stream1, Stream2: TStream): Boolean;

Сравнивает содержимое двух потоков на идентичность. © Рудой Андрей Игоревич, 2005 - 2025 г.

Алгоритм сравнения: <list type="number"> <item>Сначала сравниваются размеры потоков</item> <item>Позиции потоков сбрасываются в начало</item> <item>Содержимое сравнивается блоками по 8 КБ</item> <item>Сравнение прекращается при первом несовпадении</item> </list>

Особенности: <list type="bullet"> <item>Не изменяет исходное содержимое потоков</item> <item>Сбрасывает позиции потоков в начало перед сравнением</item> <item>После сравнения позиции потоков остаются в конце</item> <item>Оптимизирован по памяти (использует буферы фиксированного размера)</item> <item>Подходит для сравнения больших файлов и потоков</item> </list>

Ограничения: <list type="bullet"> <item>Потоки должны поддерживать изменение позиции</item> <item>Не подходит для бесконечных или не seekable потоков</item> </list>

<example> Пример использования:

var
  FileStream1, FileStream2: TFileStream;
  IsEqual: Boolean;
begin
  FileStream1 := TFileStream.Create('file1.txt', fmOpenRead);
  FileStream2 := TFileStream.Create('file2.txt', fmOpenRead);
  try
    IsEqual := CompareStreams(FileStream1, FileStream2);
  finally
    FileStream1.Free;
    FileStream2.Free;
  end;
end;

</example>

Параметры
Stream1
Первый поток для сравнения. Должен поддерживать чтение и изменение позиции.
Stream2
Второй поток для сравнения. Должен поддерживать чтение и изменение позиции.
Возвращаемые значения

Возвращает True если: <list type="bullet"> <item>Оба потока имеют одинаковый размер</item> <item>Все байты в потоках идентичны и в одинаковом порядке</item> </list> Возвращает False в противном случае.

Вызывает исключения
UNKNOWN
вызывать исключения потоков при операциях чтения или изменения позиции.
function ConcatBytesFast(const A, B: TBytes): TBytes;

Быстро объединяет два массива байт в один результирующий массив. Оптимизированная реализация с обработкой случаев пустых массивов. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

  • Использует быстрое копирование памяти через Move вместо поэлементного копирования

  • Оптимизирована для работы с большими массивами байт

  • Корректно обрабатывает случаи, когда один или оба массива пусты

  • Не изменяет исходные массивы A и B

  • Время выполнения: O(n) где n - общий размер массивов

  • Минимальные накладные расходы благодаря использованию низкоуровневого копирования

  • Для пустых массивов возвращается новый пустой массив, а не nil <example> Примеры использования:

    var
      Arr1, Arr2, Result: TBytes;
    begin
      // Оба массива не пусты
      Arr1 := [1, 2, 3];
      Arr2 := [4, 5, 6];
      Result := ConcatBytesFast(Arr1, Arr2);
      // Result = [1, 2, 3, 4, 5, 6]
      // Первый массив пуст
      Result := ConcatBytesFast(nil, Arr2);
      // Result = [4, 5, 6] (копия Arr2)
      // Второй массив пуст
      Result := ConcatBytesFast(Arr1, nil);
      // Result = [1, 2, 3] (копия Arr1)
      // Оба массива пусты
      Result := ConcatBytesFast(nil, nil);
      // Result = [] (пустой массив)
    end;

    </example>

<note> Функция использует проверки длины массивов для оптимизации работы и избежания ненужных операций копирования при работе с пустыми массивами. </note> <author> © Рудой Андрей Игоревич</author>

Параметры
A
Первый массив байт типа TBytes для объединения. Если массив пуст, функция вернет копию второго массива B.
B
Второй массив байт типа TBytes для объединения. Если массив пуст, функция вернет копию первого массива A.
Возвращаемые значения

Массив байт типа TBytes, содержащий:

  • Все элементы массива A, за которыми следуют все элементы массива B (если оба не пусты)

  • Копию массива B (если массив A пуст)

  • Копию массива A (если массив B пуст)

  • Пустой массив (если оба массива пусты)

function CreateInvSBox(const Key, Seed: TBytes): TBytes;

Создает обратную таблицу подстановок (Inverse S-Box) для S-Box, сгенерированного функцией CreateSBox с использованием тех же параметров Key и Seed. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Функция создает S-Box с использованием тех же параметров Key и Seed, что и при шифровании, а затем строит обратную таблицу, где для каждого значения S-Box[i] = j устанавливается InvS-Box[j] = i. Это обеспечивает возможность обратного преобразования данных.

Особенности реализации: <list type="bullet"> <item>Требует тех же Key и Seed, что использовались при создании исходного S-Box</item> <item>Гарантирует, что InvS-Box(S-Box(x)) = x для любого байта x</item> <item>Выполняет безопасное удаление промежуточных данных из памяти</item> </list>

Для корректной работы дешифрования необходимо использовать точно такие же Key и Seed, которые применялись при шифровании данных.

<example> Пример использования для шифрования и дешифрования:

var
  Key, Seed, SBox, InvSBox, Data, Encrypted, Decrypted: TBytes;
begin
  // Генерация ключа и сида
  Key := GenerateRandomBytes(32);
  Seed := GenerateRandomBytes(16);
  // Создание S-Box для шифрования
  SBox := CreateSBox(Key, Seed);
  // Шифрование данных
  Encrypted := EncryptWithSBox(Data, SBox);
  // Создание обратного S-Box для дешифрования
  InvSBox := CreateInvSBox(Key, Seed);
  // Дешифрование данных
  Decrypted := DecryptWithSBox(Encrypted, InvSBox);
  // Проверка результата
  if CompareBytes(Data, Decrypted) then
    ShowMessage('Дешифрование успешно');
end;

</example>

<author> © Рудой Андрей Игоревич</author>

Параметры
Key
Ключевой материал, идентичный использованному при создании исходного S-Box
Seed
Дополнительное случайное значение (зерно), идентичное использованному при создании исходного S-Box
Возвращаемые значения

Обратная таблица подстановок InvS-Box в виде массива байт (TBytes) размером 256 элементов, позволяющая выполнить обратное преобразование данных, зашифрованных с использованием S-Box

Вызывает исключения
Exception
Может вызывать исключения, связанные с созданием S-Box (наследуются от CreateSBox)
Материалы по теме
Ссылка на функцию создания прямой таблицы подстановок
Создает криптографически стойкую таблицу подстановок (S-Box) размером 256 байт на основе детерминированного псевдослучайного ключевого потока. © Рудой Андрей Игоревич, 2005 - 2025 г.
function CreateSBox(Key, Seed: TBytes): TBytes;

Создает криптографически стойкую таблицу подстановок (S-Box) размером 256 байт на основе детерминированного псевдослучайного ключевого потока. © Рудой Андрей Игоревич, 2005 - 2025 г.

<example> Пример использования:

var
  Key, Seed, SBox: TBytes;
begin
  // Генерация ключа и сида
  Key := GenerateRandomBytes(32);   // 256-битный ключ
  Seed := GenerateRandomBytes(16);  // 128-битный сид
  // Создание S-Box
  SBox := CreateSBox(Key, Seed);
  try
    // Проверка валидности
    if not ValidateSBox(SBox) then
      raise Exception.Create('Недопустимый S-Box');
    // Использование S-Box в алгоритме шифрования
    // ...
  finally
    // Безопасное удаление критических данных
    SecureErase(Key);
    SecureErase(Seed);
    SecureErase(SBox);
  end;
end;

</example>

Функция использует алгоритм Фишера-Йейтса для криптографически безопасного перемешивания значений S-Box на основе ключевого потока, сгенерированного функцией GenerateKeyStream из модуля BytesUtils.

Особенности реализации: <list type="bullet"> <item>Гарантирует уникальность всех значений в S-Box (перестановка 0-255). </item> <item>Обеспечивает детерминированность: одинаковые Key/Seed → одинаковый S-Box. </item> <item>Использует дополнительный запас ключевого потока для обработки коллизий. </item> <item>Выполняет безопасное удаление чувствительных данных из памяти. </item> </list>

Для проверки валидности созданного S-Box рекомендуется использовать функцию ValidateSBox, проверяющую уникальность всех значений.

<author> © Рудой Андрей Игоревич</author>

Параметры
Key
Ключевой материал для генерации S-Box. Рекомендуемый размер - 32 байта (256 бит)
Seed
Дополнительное случайное значение (зерно) для диверсификации генерации. Рекомендуемый размер - 16 байт (128 бит)
Возвращаемые значения

Таблица подстановок S-Box в виде массива байт (TBytes) размером 256 элементов, содержащая уникальные значения от 0 до 255 в псевдослучайном порядке

Вызывает исключения
Exception
Вызывается с сообщением "Недостаточно данных в ключевом потоке для создания SBox" в случае, если сгенерированного ключевого потока недостаточно для полного перемешивания S-Box
Материалы по теме
Ссылка на функцию GenerateKeyStream, используемую для генерации ключевого потока
Генерирует псевдослучайную ключевую последовательность с помощью алгоритма HMAC-SHA512. Использует итерационную схему на основе счетчика для расширения выходных данных. © Рудой Андрей Игоревич, 2005 - 2025 г.
ValidateSBox
Ссылка на процедуру безопасного удаления данных из памяти
Безопасно стирает содержимое массива байтов. © Рудой Андрей Игоревич, 2005 - 2025 г.
function DateTimeToBytes(const ADateTime: TDateTime): TBytes;

Преобразует значение TDateTime в массив байтов. © Рудой Андрей Игоревич, 2005 - 2025 г.

Использует внутреннее представление TDateTime как Double (8 байт) <author> © Рудой Андрей Игоревич</author>

Параметры
ADateTime
Значение даты/времени для преобразования
Возвращаемые значения

Динамический массив байтов, представляющий TDateTime

function GenerateKeystream(const AKey, ASeed: TBytes; AOutputLength: Integer): TBytes;

Генерирует псевдослучайную ключевую последовательность с помощью алгоритма HMAC-SHA512. Использует итерационную схему на основе счетчика для расширения выходных данных. © Рудой Андрей Игоревич, 2005 - 2025 г.

Алгоритм работы: 1. Проверка валидности входных параметров. 2. Ограничение вывода до MAX_ARRAY_SIZE (1 ГБ).

  1. Итеративное генерирование блоков через HMAC-SHA512. 4. Объединение блоков в выходной поток.

Особенности: Использует big-endian представление счетчика (Number64ToBytes с True). Каждая итерация добавляет 64 байта (длина вывода SHA512). Автоматически обрезает вывод до требуемой длины.

Ограничения: Максимальный размер вывода: 1 ГБ (MAX_ARRAY_SIZE). Производительность может degrade при больших AOutputLength.

<example> Пример использования:

var
  Key, Seed, Keystream: TBytes;
begin
  Key := TEncoding.UTF8.GetBytes('secret');
  Seed := TEncoding.UTF8.GetBytes('salty');
  Keystream := GenerateKeystream(Key, Seed, 128);
end;

</example>

<author> © Рудой Андрей Игоревич</author>

Параметры
AKey
Ключ в виде байтового массива. Не должен быть пустым. Используется как ключ для HMAC-преобразования.
ASeed
Начальное значение (seed) в виде байтового массива. Не должен быть пустым. Комбинируется со счетчиком для формирования входных данных HMAC.
AOutputLength
Требуемая длина выходных данных в байтах. Должна быть неотрицательной. Фактический вывод может быть ограничен 1 ГБ из-за внутренних ограничений.
Возвращаемые значения

Байтовый массив длиной AOutputLength или меньше, если превышен лимит MAX_ARRAY_SIZE. Возвращает пустой массив при неверных входных данных.

function GenerateRandomBytes(Size: Int64): TBytes;

This item has no description.

function GUIDToBytes(const AGUID: TGUID): TBytes;

Преобразует GUID в единый массив байтов © Рудой Андрей Игоревич, 2005 - 2025 г.

Сохраняет оригинальный порядок байтов GUID <author> © Рудой Андрей Игоревич</author>

Параметры
AGUID
Исходный GUID для преобразования
Возвращаемые значения

Массив из 16 байтов, представляющий GUID

function HexToBytes(Source: string): TBytes;

Преобразует шестнадцатеричную строку в массив байт. © Рудой Андрей Игоревич, 2005 - 2025 г.

Строка должна содержать только допустимые шестнадцатеричные символы (0-9, A-F, a-f). Пробелы и другие разделители не допускаются.

Параметры
Source
Входная строка с шестнадцатеричными данными (допускается нижний/верхний регистр)
Возвращаемые значения

Массив байт, восстановленный из шестнадцатеричного представления

Вызывает исключения
EArgumentException
Вызывается при нечётной длине строки или невалидных символах
procedure InitializeMatrix(out ByteMatrix: Array of TBytes; Key, Nonce: TBytes);

This item has no description.

function InverseBytesA(ASource: TBytes): TBytes;

This item has no description.

function InverseBytesR(ASource: TBytes): TBytes;

This item has no description.

function NonlinearDistortion(ASource: TBytes): TBytes;

Выполняет нелинейные искажения динамического массива байтов по формуле: X xor (ROLbytes(X, 7)) xor (ROLbytes(X, 22)) © Рудой Андрей Игоревич, 2005 - 2025 г.

Алгоритм нелинейных искажений основан на комбинации циклических сдвигов и операции XOR, что обеспечивает: <list type="bullet"> <item> Высокую нелинейность преобразования </item> <item> Равномерное распределение выходных данных </item> <item> Сохранение длины исходных данных </item> <item> Обратимость при многократном применении (в некоторых случаях) </item> </list>

Математическая формула преобразования: Result = X ⊕ ROL(X, 7) ⊕ ROL(X, 22) где: <list type="bullet"> <item> X - исходный массив байтов </item> <item> ROL - операция циклического сдвига влево </item> <item> ⊕ - операция побитового исключающего ИЛИ (XOR) </item> </list>

Особенности реализации: <list type="bullet"> <item> Использует оптимизированные функции ROLbytes из модуля BytesUtils </item> <item> Автоматически обрабатывает пустые массивы и граничные случаи </item> <item> Сохраняет исходные данные неизменными </item> <item> Возвращает новый массив, не модифицируя исходный </item> </list>

Области применения: <list type="bullet"> <item> Криптографические преобразования данных </item> <item> Расширение ключевых последовательностей </item> <item> Устранение статистических закономерностей в данных </item> <item> Предобработка данных перед хешированием </item> </list>

<example> Пример использования для нелинейного преобразования данных:

var
  OriginalData, DistortedData: TBytes;
begin
  // Исходные данные
  OriginalData := TBytes.Create($01, $02, $03, $04, $05);
  // Применение нелинейных искажений
  DistortedData := NonlinearDistortion(OriginalData);
  // DistortedData теперь содержит преобразованные данные
  // Можно применить повторно для усиления эффекта:
  DistortedData := NonlinearDistortion(DistortedData);
end;

Пример использования в криптографическом контексте:

var
  Key, ExpandedKey: TBytes;
begin
  // Генерация исходного ключа
  Key := GenerateRandomBytes(32);
  // Расширение ключа через нелинейные преобразования
  ExpandedKey := Key + NonlinearDistortion(Key) +
                 NonlinearDistortion(NonlinearDistortion(Key));
end;

</example>

<author>© Рудой Андрей Игоревич</author>

Параметры
ASource
Исходный динамический массив байтов для применения нелинейных искажений. Не должен быть nil. Пустой массив возвращается без изменений.
Возвращаемые значения

Новый динамический массив байтов той же длины, что и ASource, полученный в результате применения нелинейных искажений. Возвращает пустой массив, если ASource пуст или nil.

Вызывает исключения
UNKNOWN
генерирует исключения. Безопасна для любых входных параметров. В случае передачи nil или пустого массива возвращает пустой массив.
Материалы по теме
Ссылка на функцию циклического сдвига влево
Выполняет циклический сдвиг влево (ROL) массива байтов. Поддерживает как побайтовый, так и побитовый сдвиг. © Рудой Андрей Игоревич, 2005 - 2025 г.
Ссылка на функцию циклического сдвига вправо
Выполняет циклический сдвиг вправо (ROR) массива байтов. Поддерживает как побайтовый, так и побитовый сдвиг. © Рудой Андрей Игоревич, 2005 - 2025 г.
function Number64ToBytes(const Number: Int64; IsBigEndian: Boolean = True): TBytes;

Преобразует целое число в массив байтов. © Рудой Андрей Игоревич, 2005 - 2025 г.

Использует внутреннее представление Int64 (8 байт) <author> © Рудой Андрей Игоревич</author>

Параметры
Number
Целое число для преобразования
Возвращаемые значения

Массив байтов размером SizeOf(Int64)

function NumberToBytes(const Number: int64): TBytes;

This item has no description.

function PKCS7Padding(const Data: TBytes; BlockSize: Integer): TBytes;

This item has no description.

function PKCS7Unpadding(const Data: TBytes): TBytes;

This item has no description.

function ProcessData(Source: TBytes; ByteMatrix: Array of TBytes; Encrypt: Boolean): TBytes;

This item has no description.

function ReadBytesFromRegistry(const RootKey: HKEY; const KeyPath, ValueName: string): TBytes;

This item has no description.

function ROLByte(Value: Byte; Shift: Integer): Byte;

This item has no description.

function ROLbytes(ASource: TBytes; Shift: integer): TBytes;

Выполняет циклический сдвиг влево (ROL) массива байтов. Поддерживает как побайтовый, так и побитовый сдвиг. © Рудой Андрей Игоревич, 2005 - 2025 г.

Алгоритм работает в два этапа: <list type="number"> <item>Побайтовый сдвиг (byteShift = Shift div 8)</item> <item>Побитовый сдвиг (bitShift = Shift mod 8)</item> </list>

Особенности реализации: <list type="bullet"> <item>Использует модульную арифметику для больших значений Shift</item> <item>Обрабатывает перенос битов между байтами</item> <item>Сохраняет длину исходного массива</item> </list>

<example>

var
  Source, Rotated: TBytes;
begin
  Source := TBytes.Create($01, $02, $03);
  Rotated := ROLbytes(Source, 4);
  // Результат: сдвинутый массив байтов
end;

</example>

Параметры
ASource
Исходный массив байтов для сдвига. Пустой массив возвращается без изменений.
Shift
Общее количество бит для сдвига. Отрицательные значения преобразуются в положительные через модульную арифметику. Нулевой сдвиг возвращает копию исходного массива.
Возвращаемые значения

Новый массив байтов той же длины, что и ASource, после циклического сдвига. Пустой массив возвращается если ASource пуст или Shift = 0.

Вызывает исключения
UNKNOWN
генерирует исключения. Безопасна для любых входных параметров.
function ROLlongword(Value: LongWord; Shift: integer): LongWord;

Выполняет циклический сдвиг влево (ROL) 32-битного беззнакового целого числа. © Рудой Андрей Игоревич, 2005 - 2025 г.

Реализация использует оптимизированную формулу: (Value shl Shift) or (Value shr (32 - Shift)) которая автоматически обрабатывает сдвиги больше 32 бит.

<example>

var
  Original, Rotated: LongWord;
begin
  Original := $12345678;
  Rotated := ROLlongword(Original, 4); // Результат: $23456781
end;

</example>

Параметры
Value
Исходное значение типа LongWord для выполнения сдвига.
Shift
Количество бит для сдвига. Отрицательные значения не поддерживаются. Значения больше 32 обрабатываются через модульную арифметику (mod 32).
Возвращаемые значения

Результат циклического сдвига Value влево на Shift бит.

function RORByte(Value: Byte; Shift: Integer): Byte;

This item has no description.

function RORbytes(ASource: TBytes; Shift: integer): TBytes;

Выполняет циклический сдвиг вправо (ROR) массива байтов. Поддерживает как побайтовый, так и побитовый сдвиг. © Рудой Андрей Игоревич, 2005 - 2025 г.

Алгоритм работает в два этапа: <list type="number"> <item>Побайтовый сдвиг (byteShift = Shift div 8)</item> <item>Побитовый сдвиг (bitShift = Shift mod 8)</item> </list>

Особенности реализации: <list type="bullet"> <item>Использует модульную арифметику для больших значений Shift</item> <item>Обрабатывает перенос битов между байтами</item> <item>Сохраняет длину исходного массива</item> <item>Обрабатывает сдвиг в обратном направлении относительно ROLbytes</item> </list>

<example>

var
  Source, Rotated: TBytes;
begin
  Source := TBytes.Create($01, $02, $03);
  Rotated := RORbytes(Source, 4);
  // Результат: сдвинутый массив байтов
end;

</example>

Параметры
ASource
Исходный массив байтов для сдвига. Пустой массив возвращается без изменений.
Shift
Общее количество бит для сдвига. Отрицательные значения преобразуются в положительные через модульную арифметику. Нулевой сдвиг возвращает копию исходного массива.
Возвращаемые значения

Новый массив байтов той же длины, что и ASource, после циклического сдвига. Пустой массив возвращается если ASource пуст или Shift = 0.

Вызывает исключения
UNKNOWN
генерирует исключения. Безопасна для любых входных параметров.
function RORlongword(Value: LongWord; Shift: integer): LongWord;

Выполняет циклический сдвиг вправо (ROR) 32-битного беззнакового целого числа. © Рудой Андрей Игоревич, 2005 - 2025 г.

Реализация использует оптимизированную формулу: (Value shr Shift) or (Value shl (32 - Shift)) которая автоматически обрабатывает сдвиги больше 32 бит.

<example>

var
  Original, Rotated: LongWord;
begin
  Original := $12345678;
  Rotated := RORlongword(Original, 4); // Результат: $81234567
end;

</example>

Параметры
Value
Исходное значение типа LongWord для выполнения сдвига.
Shift
Количество бит для сдвига. Отрицательные значения не поддерживаются. Значения больше 32 обрабатываются через модульную арифметику (mod 32).
Возвращаемые значения

Результат циклического сдвига Value вправо на Shift бит.

procedure SecureErase(var Data: TBytes);

Безопасно стирает содержимое массива байтов. © Рудой Андрей Игоревич, 2005 - 2025 г.

Заполняет массив нулями и затем освобождает память <author> © Рудой Андрей Игоревич</author>

Параметры
Data
Ссылка на массив байтов для очистки
procedure SplitBytesFast(const Source: TBytes; out Left, Right: TBytes);

Разделяет массив байт на две части примерно равного размера. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

  • Для массивов нечетной длины правая часть будет содержать на один элемент больше

  • Использует быстрое копирование Move вместо поэлементного присваивания

  • Не проверяет нулевые указатели (предполагается валидность параметров)

  • Время выполнения: O(1) по памяти, O(n) по времени (из-за копирования данных) <example> Пример использования:

    var
      Source, LeftPart, RightPart: TBytes;
    begin
      Source := [1, 2, 3, 4, 5];
      SplitBytesFast(Source, LeftPart, RightPart);
      // LeftPart = [1, 2]
      // RightPart = [3, 4, 5]
    end;

    </example>

<author> © Рудой Андрей Игоревич</author>

Параметры
Source
Исходный массив байт типа TBytes, который требуется разделить. Если массив пуст, процедура не выполняет действий.
Left
Выходной параметр типа TBytes. Содержит левую половину исходного массива (элементы от начала до середины). Если элементов нет, возвращает пустой массив.
Right
Выходной параметр типа TBytes. Содержит правую половину исходного массива (элементы от середины до конца). Если элементов нет, возвращает пустой массив.
procedure SplitStream(Stream: TBytesStream; out b1, b2: TBytes);

Разделяет содержимое TBytesStream на два массива байт примерно равного размера. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

  • Для потоков с нечетным размером первая половина (b1) будет больше на 1 байт

  • Использует быстрое копирование памяти через Move вместо поэлементного копирования

  • Работает непосредственно с внутренним буфером потока (Bytes property)

  • Не изменяет позицию чтения/записи исходного потока

  • Не выполняет проверку на нулевой указатель потока (вызывающая сторона должна обеспечить валидность)

  • Время выполнения: O(1) по памяти, O(n) по времени (из-за копирования данных) <example> Пример использования:

    var
      Stream: TBytesStream;
      FirstHalf, SecondHalf: TBytes;
    begin
      Stream := TBytesStream.Create([1, 2, 3, 4, 5]);
      try
        SplitStream(Stream, FirstHalf, SecondHalf);
        // FirstHalf = [1, 2, 3]
        // SecondHalf = [4, 5]
      finally
        Stream.Free;
      end;
    end;

    </example>

<author> © Рудой Андрей Игоревич</author>

Параметры
Stream
Входной поток типа TBytesStream, содержимое которого требуется разделить. Если поток пуст или размер равен 0, процедура не выполняет действий.
b1
Выходной параметр типа TBytes. Содержит первую половину данных из потока (от начала до середины). Для нечетных размеров будет содержать на один байт больше. Если данных нет, возвращает пустой массив.
b2
Выходной параметр типа TBytes. Содержит вторую половину данных из потока (от середины до конца). Для нечетных размеров будет содержать на один байт меньше. Если данных нет, возвращает пустой массив.
function SystemTimeToBytes(AValue: TSystemTime): TBytes;

Преобразует структуру TSystemTime в динамический массив байт (TBytes). Каждое поле структуры сохраняется в порядке little-endian.

Размер возвращаемого массива всегда равен SizeOf(TSystemTime) (16 байт). Порядок байт соответствует архитектуре x86 (little-endian). Для кроссплатформенной совместимости может потребоваться дополнительное преобразование порядка байт при работе с данными на big-endian системах.

Параметры
AValue
Входная структура TSystemTime для преобразования.
Возвращаемые значения

Динамический массив байт, содержащий двоичное представление структуры TSystemTime.

function ValidateSBoxPair(const SBox, InvSBox: TBytes): Boolean;

Проверяет корректность пары S-Box/InvS-Box. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

<author> © Рудой Андрей Игоревич</author>

Параметры
SBox
Прямая таблица подстановок
InvSBox
Обратная таблица подстановок
Возвращаемые значения

True если таблицы являются взаимно обратными, False в противном случае

procedure WriteBytesToRegistry(const RootKey: HKEY; const KeyPath, ValueName: string; const Data: TBytes);

This item has no description.

function XORgamma(ASource, AKey: TBytes; out HMAC: TBytes): TBytes;

Функция выполняет шифрование данных с использованием алгоритма XOR и генерирует HMAC-подпись для проверки целостности. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Функция реализует следующий алгоритм:

  1. Проверка входных параметров на непустоту

  2. Копирование исходных данных и ключа во внутренние буферы

  3. Применение операции XOR к каждому байту данных

  4. Генерация HMAC с использованием алгоритма SHA512

  5. Безопасное удаление чувствительных данных из памяти <example> Пример использования функции:

    var
      SourceData: TBytes;
      Key: TBytes;
      EncryptedData: TBytes;
      HMAC: TBytes;
    begin
      SourceData := ...; // исходные данные
      Key := ...;       // ключ шифрования
      EncryptedData := XORgamma(SourceData, Key, HMAC);
    end;

    </example>

<author> © Рудой Андрей Игоревич</author>

Параметры
ASource
Исходные данные для шифрования в виде массива байтов
AKey
Ключ шифрования в виде массива байтов
HMAC
Выходной параметр для хранения HMAC-подписи
Возвращаемые значения

Зашифрованные данные в виде массива байтов

Вызывает исключения
Exception
Исключение может быть вызвано в случае:

  • Пустых входных параметров

  • Ошибки при генерации HMAC

Материалы по теме
Метод безопасного удаления данных из памяти
Безопасно стирает содержимое массива байтов. © Рудой Андрей Игоревич, 2005 - 2025 г.
Класс для работы с алгоритмами хеширования SHA2
Record to generate SHA2 Hash values from data

Типы

TBitOrder = (...);

Перечисление для определения порядка следования битов при преобразованиях. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

Используется в функциях преобразования для контроля порядка упаковки/распаковки битов

Значение
  • boLSBFirst
  • boMSBFirst

Константы

ABOX: TBytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255];

This item has no description.

InvSBoxAES: TBytes = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];

This item has no description.

MatrixBox: Array of TBytes = [[99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 73, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22], [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0]];

This item has no description.

RBOX: TBytes = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];

Динамический массив байтов, содержащий значения [255, 254, 253, 252, ... , 4, 3 , 2, 1, 0]. Автор: © Рудой Андрей Игоревич, 2005 - 2025 г.

<example> Пример использования:

var
  B: TBytes;
  I: Integer;
begin
  for I := 0 to Length(b) - 1 do b[i] := BytesUtils.RBOX[b[i]];
    // Использование сгенерированных байтов
end;

</example>

<author> © Рудой Андрей Игоревич</author>

SBoxAES: TBytes = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 73, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];

This item has no description.

Переменные

InvSBox: TBytes;

This item has no description.

SBox: TBytes;

This item has no description.

© Andrey Igorevich Rudoy, 2005-2025 jear
Сгенерировал PasDoc 0.16.0-snapshot.