id: Гость   вход   регистрация
текущее время 02:31 29/03/2024
Автор темы: Гость, тема открыта 01/05/2014 11:31 Печать
Категории: криптография, симметричное шифрование
создать
просмотр
ссылки

PKCS7


По PKCS7 сообщение m длины b дополняется до длины N следующим образом:
1) m = "hello", b = 5, N = 7 => получим M* = "hello\x02\x02"
2) m = "hello", b = 5, N = 8 => M* = "hello\x03\x03\x03".
То есть в каждый байт, который был дополнен записывается общее число добавленных байтов. Как проверить является ли корректным дополнение до требуемой длины и получить исходное сообщение? Например, есть сообщение:
m = "Hello\x01". Как определяется \x01 относится к m или же это результат дополнения?



 
Комментарии
— sentaus (01/05/2014 11:46)   профиль/связь   <#>
комментариев: 1060   документов: 16   редакций: 32
Ну собственно берёте последний байт, смотрите его значение (пусть будет n). Затем проверяете n последних байт, и если они все равны n, то дополнение корректное, и эти n байт надо убрать. А если какой-то из байтов не равен n, то дополнение некорректное, т.е. пакет данных повреждён.
— Гость (01/05/2014 11:51)   <#>
Кроме корректности требуется восстанавливать сообщение. Давайте рассмотрим пример. Если m = "hello", length = 5, N = 6, то требуется дополнить 1 байт. В итоге получим: "hello\x01". Если m = "hello\x01", length = 6, N = 6. В этом случае дополнение не требуется. Так вот теперь вопрос. Как по "hello\x01" определить исходное сообщение было "hello" или "hello\0x01"
— sentaus (01/05/2014 11:57, исправлен 01/05/2014 11:59)   профиль/связь   <#>
комментариев: 1060   документов: 16   редакций: 32
В этом случае дополнение не требуется.

Нет, в этом случае требуется сделать дополнение на размер блока используемого симметричного алгоритма, т.е. 8 или 16 байт на практике.

— Гость (01/05/2014 12:01)   <#>
Что разве бывают симметричные алгоритмы только с 8 или 16 байтовыми блоками? Хорошо, вот другой пример. Пусть m = "hello", length = 5, N = 8. Тогда после дополнения получим "hello\0x03\0x03\0x03". Теперь рассмотри случай, когда m = "hello\0x03\0x03\0x03". Так как length = N = 8, то дополнение не требуется. Как теперь по "hello\0x03\0x03\0x03" определить оригинал "hello\0x03\0x03\0x03" или "hello"?
— sentaus (01/05/2014 12:07)   профиль/связь   <#>
комментариев: 1060   документов: 16   редакций: 32
Теперь рассмотри случай, когда m = "hello\0x03\0x03\0x03". Так как length = N = 8, то дополнение не требуется.

Дополнение требуется всегда. Именно для предотвращения таких случаев неоднозначности.


Как теперь по "hello\0x03\0x03\0x03" определить оригинал "hello\0x03\0x03\0x03" или "hello"?

"hello\0x03\0x03\0x03" -> "hello"
"hello\0x03\0x03\0x03\0x08\0x08\0x08\0x08\0x08\0x08\0x08\0x08" -> "hello\0x03\0x03\0x03"
— Гость (01/05/2014 12:18)   <#>
Спасибо, теперь все понятно.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3