Типичные ошибки реализации XOR-шифрования (гаммирования) и одноразового блокнота в Delphi: фундаментальная путаница между текстовыми и бинарными данными
Введение
В криптографических реализациях на Delphi, особенно при работе с XOR-шифрованием и одноразовым блокнотом, программисты часто допускают систематические ошибки, коренящиеся в непонимании фундаментального различия между текстовыми (String) и бинарными (TBytes) данными и их представлениями в бинарных строк (Binary string). Это исследование анализирует типичные ошибки, их причины, последствия и предоставляет практические рекомендации для корректной реализации .
1. Криптографические основы: XOR-шифрование и одноразовый блокнот
1.1 XOR-шифрование
XOR-шифрование — это аддитивный шифр, использующий операцию исключающего ИЛИ (XOR) между открытым текстом и ключом. Алгоритм основан на свойствах операции XOR: A⊕0=A, A⊕A=0, A⊕B=B⊕A, (A⊕B)⊕C=A⊕(B⊕C). При использовании повторяющегося ключа этот метод уязвим для частотного анализа, но с полностью случайным ключом, равным по длине сообщению и использованным однократно, он превращается в теоретически невзламываемый одноразовый блокнот .
1.2 Одноразовый блокнот (OTP)
Одноразовый блокнот — это криптографический метод, обеспечивающий абсолютную секретность при соблюдении четырёх условий:
-
Ключ должен быть не короче открытого текста
-
Ключ должен быть действительно случайным (truly random)
-
Ключ никогда не должен повторно использоваться (даже частично)
-
Ключ должен оставаться полностью секретным для всех, кроме законных участников обмена
Нарушение любого из этих условий делает систему уязвимой. Математически доказано, что при соблюдении всех условий OTP обеспечивает совершенную секретность .
2. Типы данных в Delphi: фундаментальное различие
2.1 String (UnicodeString в современных версиях)
В Delphi 2009 и выше тип String представляет собой UnicodeString с кодировкой UTF-16. Каждый символ занимает 2 байта (16 бит), что обеспечивает поддержку всех языков мира, включая кириллицу. Однако это текстовый тип, предназначенный для хранения символов, а не произвольных бинарных данных. Путаницу дополнительно вносят руководящие документы, спецификации, стандарты по алгоритмам шифрования - в криптографии под понятием "строка" понимается Binary string (символьное представление массива байтов в виде 1 и 0), а в языках программирования String - буквально "строка" - текстовая строка символов.