Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пн ноя 27, 2017 14:51:10
Более подобно DES.
Дело в том что каждый 0 LSB бит является темпорари битом. То-есть выполняет определенную системную алгоритмическую роль для внутренних нужд алгоритма.
И полезная нагрузочная способность шифрования у DES на самом деле не 64 бита, а 56 бит на один ключ. Более подробно о des https://ru.wikipedia.org/wiki/Triple_DES
NXP рекомендует сбрасывать данный бит в 0, дабы усложнить задачу взломщику.
Функция на C:
void ArrForDes(byte *arr,int cnt){
for(int i=0;i<cnt;i++){
arr&=~(1<<0);
}
}
Пример работы (до, после):
До
<- 01 02 03 04 45 5D 26 B7 05 06 07 08 5D 33 F5 68 01 02 03 04 45 5D 26 B7
После
<- 00 02 02 04 44 5C 26 B6 04 06 06 08 5C 32 F4 68 00 02 02 04 44 5C 26 B6
01 - [00000001]
00 - [00000000]
LSB бит на позиции 0 - всегда меняется на 0. Таким нехитрым образом шифр становится менее уязвимым к атакам.
Продолжаю с авторизацией. 45 - версия ключа.
С системной информацией
-> 03 45 61 21
<- 03 00 0B 01 EC 86
Без системной информации
-> 45
<- 0B 01
0x0B как я уже описывал это Premission ключа.

0x01 разберем подробнее.
MSB - LSB (справа налево).
[00000001] первые 4 бита кодируют количество ключей (всего их 14) и в данном случае версия ключа 0001 - 1 ключ.
Два последних бита описывают алгоритм, который необходимо использовать при работе с данным ключом.
00 - DES/3DES/2K3DES
01 - 3K3DES
10 - AES
Раньше я считал, что оставшиеся 5-6 биты описывают режим коммуникации и это было бы логично, но оказалось что режим коммуникации настраивается на уровне файла.
Вообще конечно если я понял все правильно, и все так, как я описываю, то мне не нравится схема определения типа ключа по первым 2 бит. Можно было бы сделать 4 типа, и тогда ситуация с алгоритмом шифрования была бы более понятна.
00 - Des/3des
01 - 2k3DES
10 - 3k3DES
11 - AES
В сухом остатке вам не будет ясно, является ли ключ на карте des/3des или это 2k3des. При этом, в случае с des/3des можно закрыть глаза на производительность используя 3DES работая с DES, но вот авторизоваться на карте 2k3des по ключу des/3des не получится, и придется производить операцию повторно.
И конечно версию ключа можно закодировать на уровне названия приложения, но root key находится всегда в приложении 00 00 00.
С другой стороны операция кодирования ключа производится раз в некий период использования карты, и в последующем ваша программа должна знать, какой тип ключа использовать.
Дело в том что каждый 0 LSB бит является темпорари битом. То-есть выполняет определенную системную алгоритмическую роль для внутренних нужд алгоритма.
И полезная нагрузочная способность шифрования у DES на самом деле не 64 бита, а 56 бит на один ключ. Более подробно о des https://ru.wikipedia.org/wiki/Triple_DES
NXP рекомендует сбрасывать данный бит в 0, дабы усложнить задачу взломщику.
Функция на C:
void ArrForDes(byte *arr,int cnt){
for(int i=0;i<cnt;i++){
arr&=~(1<<0);
}
}
Пример работы (до, после):
До
<- 01 02 03 04 45 5D 26 B7 05 06 07 08 5D 33 F5 68 01 02 03 04 45 5D 26 B7
После
<- 00 02 02 04 44 5C 26 B6 04 06 06 08 5C 32 F4 68 00 02 02 04 44 5C 26 B6
01 - [00000001]
00 - [00000000]
LSB бит на позиции 0 - всегда меняется на 0. Таким нехитрым образом шифр становится менее уязвимым к атакам.
Продолжаю с авторизацией. 45 - версия ключа.
С системной информацией
-> 03 45 61 21
<- 03 00 0B 01 EC 86
Без системной информации
-> 45
<- 0B 01
0x0B как я уже описывал это Premission ключа.

0x01 разберем подробнее.
MSB - LSB (справа налево).
[00000001] первые 4 бита кодируют количество ключей (всего их 14) и в данном случае версия ключа 0001 - 1 ключ.
Два последних бита описывают алгоритм, который необходимо использовать при работе с данным ключом.
00 - DES/3DES/2K3DES
01 - 3K3DES
10 - AES
Раньше я считал, что оставшиеся 5-6 биты описывают режим коммуникации и это было бы логично, но оказалось что режим коммуникации настраивается на уровне файла.
Вообще конечно если я понял все правильно, и все так, как я описываю, то мне не нравится схема определения типа ключа по первым 2 бит. Можно было бы сделать 4 типа, и тогда ситуация с алгоритмом шифрования была бы более понятна.
00 - Des/3des
01 - 2k3DES
10 - 3k3DES
11 - AES
В сухом остатке вам не будет ясно, является ли ключ на карте des/3des или это 2k3des. При этом, в случае с des/3des можно закрыть глаза на производительность используя 3DES работая с DES, но вот авторизоваться на карте 2k3des по ключу des/3des не получится, и придется производить операцию повторно.
И конечно версию ключа можно закодировать на уровне названия приложения, но root key находится всегда в приложении 00 00 00.
С другой стороны операция кодирования ключа производится раз в некий период использования карты, и в последующем ваша программа должна знать, какой тип ключа использовать.
