Найти в Дзене
merkulss

Перебор параметров BCH ECC.

В мире цифровых технологий и передачи данных, ошибки при хранении или передаче информации неизбежны. Для борьбы с этими ошибками используются различные методы коррекции, одним из которых является код Боуза-Чоудхури-Хоквенгема (BCH). Этот код позволяет исправлять ошибки в данных, но для его эффективного использования необходимо знать параметры, которые были использованы при его генерации. В этой статье мы рассмотрим, как с помощью Python-скрипта можно перебрать параметры BCH ECC для восстановления данных. BCH (Bose-Chaudhuri-Hocquenghem) — это код коррекции ошибок, который широко используется в системах хранения данных, таких как флэш-память, а также в системах связи. Основная задача BCH — обнаруживать и исправлять ошибки в данных, которые могут возникнуть из-за помех, повреждений носителя или других факторов. Код BCH характеризуется несколькими основными параметрами: Предположим, у нас есть данные и соответствующая им последовательность ECC, но мы не знаем параметры, которые были испол
Оглавление
Пример работы
Пример работы

Введение

В мире цифровых технологий и передачи данных, ошибки при хранении или передаче информации неизбежны. Для борьбы с этими ошибками используются различные методы коррекции, одним из которых является код Боуза-Чоудхури-Хоквенгема (BCH). Этот код позволяет исправлять ошибки в данных, но для его эффективного использования необходимо знать параметры, которые были использованы при его генерации. В этой статье мы рассмотрим, как с помощью Python-скрипта можно перебрать параметры BCH ECC для восстановления данных.

Что такое BCH ECC?

BCH (Bose-Chaudhuri-Hocquenghem) — это код коррекции ошибок, который широко используется в системах хранения данных, таких как флэш-память, а также в системах связи. Основная задача BCH — обнаруживать и исправлять ошибки в данных, которые могут возникнуть из-за помех, повреждений носителя или других факторов.

Код BCH характеризуется несколькими основными параметрами:

  • t — количество ошибок, которые код может исправить.
  • m — степень примитивного полинома, используемого для построения кода.
  • prim_poly — примитивный полином, который определяет структуру кода.
  • swap_bits — опция, определяющая, нужно ли менять порядок битов в данных.

Задача перебора параметров

Предположим, у нас есть данные и соответствующая им последовательность ECC, но мы не знаем параметры, которые были использованы для генерации этой последовательности. Наша задача — перебрать возможные параметры и найти те, которые приведут к совпадению с заданной последовательностью ECC.

Реализация скрипта на Python

Для решения этой задачи был разработан Python-скрипт, который использует библиотеки bchlib и galois (медленно, но больше возможностей, не удалял, оставил как пример) для генерации и проверки ECC-кодов. Скрипт перебирает различные параметры, такие как степень полинома, количество корректируемых ошибок, а также опции обработки данных (реверс битов, XOR-маски и т.д.).

Основные функции скрипта:

  1. process_bytes: Обрабатывает входные байты в зависимости от указанных опций реверса и XOR.
  2. openfilename: Предоставляет интерфейс для выбора файла с использованием библиотеки curses.
  3. hexdump: Отображает hex-дамп данных с возможностью выделения определенных позиций.
  4. bch_ecc_code_generate: Генерирует ECC-коды BCH с использованием библиотеки bchlib.
  5. bch_galois_gen_prim_poly_table: Генерирует таблицу примитивных полиномов для кодов BCH.
  6. bch_galois_init: Инициализирует код BCH с использованием библиотеки galois.
  7. bch_galois_encode: Кодирует данные с использованием библиотеки galois.
  8. bch_brute_param: Перебирает параметры BCH для поиска совпадения с заданной последовательностью ECC.

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

ecc_bytes1 = bytes([0x81, 0x85, 0x1C, 0x11, 0xFA, 0x94, 0x3F, 0xA5, 0xC2, 0xD4, 0x4B, 0x5E, 0x19, 0x1D, 0x02, 0xAF,

0xC3, 0x17, 0x68, 0x46, 0x8C, 0x96, 0x03, 0x17, 0xC7, 0x17, 0xC4, 0x99, 0x6A, 0x4E, 0x2C, 0x0E])

t = 8

q = 2

types_reverse = [None, 'reverseBytes16', 'reverseBytes32', 'reverseBytes64', 'reverseBits8', 'reverseBits16', 'reverseBits32', 'reverseBits64', None]

filter_extensions = ['']

filename = openfilename(filter_extensions)

if filename:

print(f"Выбранный файл: {filename}")

else:

print("Файл не выбран.")

with open(filename, 'rb') as f:

data_page1 = bytes(f.read())

brute_dict_narmal = {

'xor_masks_data_list': [0x00, 0xFF],

'xor_masks_ecc_list': [0x00, 0xFF],

'types_reverse_data_list': [True, False],

'm_list': [13, 14, 12, 11, 15, 16],

'polynoms_table': [],

't_list': [8, 4, 2, 16, 18, 10, 11],

'data_len_decrease': 0x20,

'data_len_increase_step': 2,

'type_reverse_ecc1': types_reverse[0:1],

'type_reverse_ecc2': types_reverse[0:1]

}

xor_list = bch_brute_param(data = data_page1, brute_dict = brute_dict_narmal, test_ecc=ecc_bytes1, xor_ecc_list=[])

Заключение

Скрипт для перебора параметров BCH ECC в связке со скриптом "bch_nand_dump_check"является мощным инструментом для коррекции дампов и восстановления данных, когда параметры кода ECC неизвестны. Он позволяет автоматизировать процесс поиска правильных параметров, что значительно экономит время и ресурсы. В статье были рассмотрены основные функции скрипта и пример его использования. Этот инструмент может быть полезен как для ремонтников, исследователей, так и для инженеров, работающих с системами хранения и передачи данных.

brute_bch

Основные параметры находятся быстро. Однако не все параметры можно быстро и легко перебрать, а некоторые алгоритмы используют дополнительные xor или другие сложности и не рассматриваются. Скрипты не могут быть лучше и быстрее профессиональных и коммерческих решений.

В скрипте для перебора нужно подсовывать данные без ошибок, поскольку ECC сравнивается с эталонным. Делать перебор с коррекцией было бы сильно медленнее.

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

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