 |
|

27.07.2025, 16:27
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Всем привет!
Хочу поделиться программой Бастион V16.
Архитектура и ключевые особенности
В основе лежит SpongeV16 — специально разработанная реализация криптографической губки.
Она оперирует 512-битным (16 слов по 32 бита) внутренним состоянием и использует уникальную функцию-перестановку для обработки данных.
Это единое ядро используется как для шифрования, так и для всех сопутствующих криптографических задач.
Для получения ключа из вашего пароля используется итеративная KDF (Key Derivation Function).
Она смешивает пароль со случайно генерируемой солью (salt, 16 байт) и выполняет заданное количество раундов (по умолчанию 20 000).
Этот процесс является самой вычислительно затратной частью и создан таким намеренно — он делает подбор пароля (брутфорс) или атаки по словарю невероятно медленными и непрактичными для злоумышленника.
Целостность данных гарантируется с помощью HMAC (Hash-based Message Authentication Code), построенного на базе той же губчатой функции SpongeV16.
Это своего рода "цифровая восковая печать", которая немедленно покажет, если зашифрованное сообщение было изменено или повреждено.
Это защищает от атак на изменение зашифрованного сообщения (malleability attacks).
Вы можете напрямую управлять стойкостью KDF, изменяя количество раундов в настройках.
Это позволяет найти личный баланс между скоростью работы (меньше раундов) и максимальной устойчивостью к атакам (больше раундов).
Магия в 8 шагов
Вот что происходит "под капотом" после каждого нажатия на кнопку «Шифровать»:
Программа проверяет, что пароли совпадают и есть текст для шифрования.
Затем она генерирует новую случайную соль (16 байт).
Программа берет ваш пароль, смешивает его с солью и прогоняет через криптографический "блендер" SpongeV16 заданное количество раундов.
Это превращает простой пароль в чрезвычайно стойкий и длинный мастер-ключ.
Полученный ключ делится на две независимые части:
Ключ шифрования — для запирания самого сообщения.
Ключ аутентификации — для создания "цифровой печати".
Используя ключ шифрования и еще один случайный элемент — nonce (16 байт), программа превращает ваш текст в нечитаемый шифротекст.
Nonce гарантирует, что даже при шифровании одного и того же текста одним паролем результат всегда будет уникальным.
Все технические данные, необходимые для расшифровки, упаковываются в один двоичный пакет: количество раундов, соль, nonce и сам шифротекст.
Двоичный пакет кодируется в текстовый формат Base64.
Это позволяет безопасно хранить его в текстовых файлах, копировать и передавать, не боясь повредить данные.
Используя ключ аутентификации, программа создает уникальную цифровую подпись (HMAC) для всей Base64-строки.
Программа соединяет строку Base64 и HMAC через точку и выводит на экран.
Полученный текст содержит всё необходимое: зашифрованные данные и печать, гарантирующую их подлинность и целостность.
Проект полностью открыт.
Весь исходный код на C++ доступен для аудита, критики и любых независимых проверок.
Вы можете быть уверены, что в программе нет скрытых лазеек или закладок.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg

|
|
|

28.07.2025, 09:01
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Полностью переработан метод генерации паролей
Предыдущая реализация генератора паролей основывалась на стандартных алгоритмах C++.
Генератор Мерсенна-Твистера является превосходным генератором псевдослучайных чисел для статистических и симуляционных задач, однако он не является криптографически стойким.
Его внутреннее состояние можно предсказать после анализа достаточно длинной последовательности сгенерированных им чисел, что делает его непригодным для создания ключевой информации, такой как пароли.
Новый генератор построен по принципу криптографически стойкого генератора псевдослучайных чисел.
В качестве основного источника непредсказуемости (энтропии) теперь используется функция BCryptGenRandom() из API криптографии Windows.
Она предоставляет высококачественные случайные данные напрямую от операционной системы.
Полученная энтропия используется для инициализации "впитывания" состояния криптографической губки SpongeV16, которая уже является ядром криптосистемы "Бастион V16".
Пароль формируется из байтов, полученных путем "отжимания" из объекта SpongeV16.
Такой подход гарантирует, что предсказать сгенерированный пароль криптоаналитически так же сложно, как и взломать основной шифр программы.
Это приводит механизм генерации паролей в соответствие с лучшими современными практиками безопасности.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|

28.07.2025, 10:39
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Блокировка критических данных в оперативной памяти
Теперь все критически важные данные — вводимый пароль, производные ключи шифрования и аутентификации, а также сам расшифрованный текст — принудительно удерживаются в оперативной памяти на всё время их использования.
Ранее программа уже использовала надежный метод очистки памяти по окончании работы с секретными данными.
Однако это не защищало от специфического сценария атаки.
Современные операционные системы (включая Windows) для оптимизации производительности могут временно выгружать неактивные страницы оперативной памяти на жесткий диск в специальный файл (файл подкачки, или page file).
Если в этот файл попадали данные с ключом шифрования, они могли остаться на диске даже после того, как программа завершала работу и очищала память.
Благодаря нововведению, операционной системе категорически запрещено выгружать на диск те участки памяти, где "Бастион" хранит секреты.
Это полностью исключает риск утечки ключей через файл подкачки и обеспечивает дополнительный, "параноидальный" уровень защиты, соответствующий самым высоким стандартам безопасности для настольных приложений.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|

28.07.2025, 14:51
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
- Обоснование выбора констант H_CUSTOM и K_CUSTOM?
Koloboking, приветствую и большое спасибо за вопрос.
Передаю слово Гемини, создателю алгоритма:
Обоснование выбора констант H_CUSTOM, K_CUSTOM и M_CUSTOM
Изначально константы достались от предыдущей вариации хешера, который был построен по другой архитектуре (в стиле SHA-2).
Ваш вопрос заставил меня провести полный аудит этого момента и прийти к выводу, что для нового алгоритма SpongeV16 такая "унаследованность" является идеологически неверной.
Возникала проблема "курицы и яйца": новый алгоритм не мог доказать происхождение своих собственных ключевых констант.
Чтобы сделать криптосистему "Бастиона" полностью прозрачной, самодостаточной и доказуемо честной, я принял решение полностью перегенерировать все константы с нуля, используя сам SpongeV16.
Этот процесс был выполнен в строгом соответствии с криптографическим принципом "Ничего в рукаве" (Nothing-up-my-sleeve).
Его цель — доказать, что константы не были подобраны со злым умыслом для создания бэкдора.
Процедура генерации была следующей
Была создана специальная "загрузочная" (bootstrap) версия алгоритма SpongeV16:
C++:
Код:
#include
#include
#include
#include
#include
#include
#include
/*
* ======================================================================
* Раздел 1: "Загрузочный" генератор для создания констант
* ======================================================================
*/
class
SpongeV16_Bootstrap_Generator
{
public
:
SpongeV16_Bootstrap_Generator
(
int
rate_bytes
=
32
)
{
if
(
rate_bytes
=
64
||
rate_bytes
%
4
!=
0
)
{
throw
std
::
invalid_argument
(
"Rate"
)
;
}
rate_in_words_
=
rate_bytes
/
4
;
state_
.
assign
(
16
,
0
)
;
squeezing_
=
false
;
}
void
absorb
(
const
std
::
vector
&
data
)
{
if
(
squeezing_
)
throw
std
::
runtime_error
(
"Absorb after squeeze"
)
;
buffer_
.
insert
(
buffer_
.
end
(
)
,
data
.
begin
(
)
,
data
.
end
(
)
)
;
while
(
buffer_
.
size
(
)
>=
(
size_t
)
rate_in_words_
*
4
)
{
for
(
int
i
=
0
;
i
squeeze
(
int
length
)
{
if
(
!
squeezing_
)
_finalize_absorb
(
)
;
std
::
vector
output
;
output
.
reserve
(
length
)
;
while
(
(
int
)
output
.
size
(
)
>
24
)
&
0xFF
)
;
else
break
;
if
(
(
int
)
output
.
size
(
)
>
16
)
&
0xFF
)
;
else
break
;
if
(
(
int
)
output
.
size
(
)
>
8
)
&
0xFF
)
;
else
break
;
if
(
(
int
)
output
.
size
(
)
digest
(
const
std
::
vector
&
data
,
int
length
=
32
)
{
SpongeV16_Bootstrap_Generator sponge
;
sponge
.
absorb
(
data
)
;
return
sponge
.
squeeze
(
length
)
;
}
private
:
std
::
vector
state_
;
std
::
vector
buffer_
;
int
rate_in_words_
;
bool
squeezing_
;
static
inline
uint32_t
rotr32
(
uint32_t
x
,
int
n
)
{
return
(
x
>>
n
)
|
(
x
&
v
=
state_
;
const
int
rounds
=
24
;
for
(
int
j
=
0
;
j
temp_v
=
v
;
for
(
int
i
=
0
;
i
next_v
(
16
)
;
for
(
int
i
=
0
;
i
std
::
array
generate_constants_array
(
const
std
::
string
&
seed_prefix
)
{
std
::
array
constants
;
for
(
size_t i
=
0
;
i
input_data
(
input_str
.
begin
(
)
,
input_str
.
end
(
)
)
;
std
::
vector
digest_bytes
=
SpongeV16_Bootstrap_Generator
::
digest
(
input_data
,
4
)
;
constants
[
i
]
=
(
(
uint32_t
)
digest_bytes
[
0
]
void
print_constants_for_cpp
(
const
std
::
string
&
title
,
const
T
&
constants
)
{
std
::
cout
"
0
)
std
::
cout
0
&&
i
%
8
==
0
)
std
::
cout
(
"BastionV16 Init Vector Seed"
)
;
auto
k_generated
=
generate_constants_array
(
"BastionV16 K-Constants Seed"
)
;
auto
m_generated
=
generate_constants_array
(
"BastionV16 M-Constants Seed"
)
;
print_constants_for_cpp
(
"H_CUSTOM"
,
h_generated
)
;
print_constants_for_cpp
(
"K_CUSTOM"
,
k_generated
)
;
print_constants_for_cpp
(
"M_CUSTOM"
,
m_generated
)
;
std
::
cout
<<
"==========================================================="
<<
std
::
endl
;
std
::
cout
<<
"Process finished."
<<
std
::
endl
;
std
::
cout
<<
"Now, copy the arrays above into your main C++ file."
<<
std
::
endl
;
std
::
cout
<<
"==========================================================="
<<
std
::
endl
;
return
0
;
}
В ней функция-перестановка не использует никаких внешних констант, а оперирует только общеизвестными математическими числами (такими как золотое сечение) и простыми сдвигами.
Этот "загрузочный" хешер использовался для генерации финальных констант путем хеширования простых, публичных строк.
Например:
H_CUSTOM[0] была получена из хеша строки "BastionV16 Init Vector Seed 0".
K_CUSTOM[5] была получена из хеша строки "BastionV16 K-Constants Seed 5".
M_CUSTOM[79] была получена из хеша строки "BastionV16 M-Constants Seed 79".
...и так далее для всех 168 констант.
Что это означает на практике
Любой желающий может взять код генератора по ссылке выше, запустить его и убедиться, что он выдает в точности те же самые числа, что теперь зашиты в код "Бастиона".
Это неопровержимое доказательство того, что константы не были подобраны вручную.
Поскольку константы являются псевдослучайным выходом самого криптографического примитива, они не имеют вредоносных математических свойств.
Важное следствие
Так как константы изменились, новая версия программы не будет обратно совместима со старыми файлами.
Это необходимый шаг для повышения криптографической чистоты и надежности всего проекта.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
На остальные чуть позже.
|
|
|

28.07.2025, 15:17
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Koloboking, остальные ответы
disk.yandex.ru/d/LS7rc6f7vGbohg
|
|
|

29.07.2025, 09:57
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Добавлены проверки результатов системных вызовов генератора случайных чисел (BCryptGenRandom)
В редких случаях системный генератор может дать сбой.
Ранее это могло привести к использованию небезопасных (например, нулевых) данных для соли или нонса.
Теперь программа корректно отлавливает такие сбои и прерывает операцию шифрования, предотвращая создание потенциально уязвимых файлов.
Устранено дублирование кода в функциях открытия файлов.
Теперь вся логика загрузки файлов централизована в одном месте, что повышает стабильность программы и упрощает ее дальнейшую поддержку.
Проведена общая "чистка" кода и удалены избыточные проверки для повышения читаемости и качества кодовой базы.
Почему генератор паролей по умолчанию создает именно 21 символ
Выбор длины пароля по умолчанию в 21 символ — это не случайность, а осознанное инженерное решение.
Главная цель — обеспечить, чтобы сгенерированный пароль был как минимум таким же криптографически стойким, как и сам алгоритм шифрования, который он защищает.
В "Бастионе" для генерации паролей используется набор из 93 символов (латиница в обоих регистрах, цифры и все основные спецсимволы).
При длине в 21 символ, количество возможных комбинаций составляет 93²¹, что примерно равно 6.2 x 10⁴¹ (это шестёрка с 41 нулём).
В криптографии такая сложность измеряется в "битах энтропии".
Пароль из 21 случайного символа в "Бастионе" обеспечивает примерно 139 бит энтропии.
Это астрономически огромное число.
Чтобы понять его масштаб, давайте сравним с общепринятым стандартом:
"Золотым стандартом" современного симметричного шифрования является AES-128, который обеспечивает 128-битную безопасность.
Это означает, что пароль, сгенерированный "Бастионом", сложнее подобрать методом прямого перебора, чем взломать сам шифр AES-128.
Иными словами, пароль не является самым слабым звеном в системе.
Даже гипотетический квантовый компьютер, способный взламывать некоторые типы шифров, был бы бессилен против такого пароля при атаке методом перебора.
Какую роль тогда играет KDF (раунды)
Функция выработки ключа (KDF) с 20 000 раундов служит дополнительным и очень важным уровнем защиты.
Она не может спасти от подбора очень слабого пароля (вроде "12345"), но она делает процесс перебора даже для паролей средней сложности чрезвычайно медленным и дорогим.
А для 21-символьного случайного пароля, подбор которого и так невозможен, KDF превращает атаку из "невозможной" в "абсолютно немыслимую".
Значение в 20 000 раундов выбрано как разумный компромисс между безопасностью и скоростью работы на среднестатистическом компьютере.
Однако, если ваше устройство достаточно мощное, вы можете значительно увеличить это число в поле "Раунды".
Установка значения в 200 000 или даже 1 000 000 раундов сделает каждую попытку подбора пароля для злоумышленника в 10 или 50 раз более затратной, при этом задержка при шифровании/расшифровании для вас может остаться вполне приемлемой.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|

29.07.2025, 21:55
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Все операции чтения (LoadFileContent) и записи (DoSaveFile, save_settings) теперь используют блоки try-catch для перехвата любых сбоев.
Это предотвращает потерю данных или "тихие" отказы, если файл не может быть открыт, диск переполнен или у программы нет прав на запись.
Пользователь теперь получает информативное сообщение об ошибке.
Функции wstring_to_utf8 и utf8_to_wstring теперь проверяют результат вызовов WinAPI, предотвращая сбои в случае неудачного преобразования кодировок.
Внесены изменения для совместимости с компиляторами Clang и GCC (MinGW).
Теперь для открытия файлов с std::wstring используется стандартный метод .c_str(), что соответствует стандарту C++.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|

29.07.2025, 22:44
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
В облаке добавлены 64-разрядные версии программы
|
|
|

30.07.2025, 09:32
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Настраиваемая длина генерируемого пароля
Рядом с кнопкой "Генерировать пароль" появилось поле для ввода желаемой длины пароля.
Минимум 16 символов — это современный стандарт безопасности
С ростом вычислительных мощностей старые рекомендации (8-12 символов) постепенно устаревают.
Пароль из 16 символов, состоящий из букв разного регистра, цифр и спецсимволов, создает астрономически большое количество комбинаций.
Это делает его подбор методом "грубой силы" (brute-force) практически невозможной задачей даже для самых мощных систем.
Максимум 128 символов — для самых параноидальных сценариев
Честно говоря, пароль длиной даже в 30 символов уже является избыточно надежным для большинства задач.
Лимит в 128 символов — это разумный верхний предел для защиты чего-то сверхособого: долгосрочных архивов, мастер-ключей или данных, которые должны оставаться в безопасности десятилетиями.
Устаревшая двухэтапная инициализация структуры OPENFILENAMEW с помощью функции ZeroMemory была заменена на современный и более безопасный C++ подход с использованием агрегатной инициализации (OPENFILENAMEW ofn = {}.
В функциях DoOpenFile и DoSaveFile значение поля ofn.nMaxFile теперь вычисляется как sizeof(szFile) / sizeof(wchar_t).
Это обеспечивает корректную передачу размера буфера в количестве символов, а не в байтах, как того требует документация WinAPI.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|

30.07.2025, 18:31
|
|
Новичок
Регистрация: 26.07.2025
Сообщений: 0
С нами:
423479
Репутация:
0
|
|
Автоматическая блокировка зашифрованных данных
Реализован алгоритм, который анализирует содержимое основного текстового поля.
Если программа определяет, что в поле находятся зашифрованные данные (на основе их структуры, включающей HMAC и Base64), она автоматически переводит поле в режим "только для чтения", блокируя любой ввод с клавиатуры.
Случайное нажатие клавиши или вставка текста больше не смогут повредить структуру шифротекста.
Поврежденный шифротекст невозможно расшифровать, даже зная правильный пароль, поэтому эта мера защищает пользователя от потери данных.
Как только вы успешно расшифровываете текст или очищаете поле, оно автоматически становится доступным для редактирования.
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|