аутентификационный маркер шифруется, но не подписывается - слабость?

Вот еще один подход py2, я не уверен, что он самый быстрый, самый элегантный и самый безопасный ...

from collections import Iterable
from itertools import imap, repeat, chain


def flat(seqs, ignore=(int, long, float, basestring)):
    return repeat(seqs, 1) if any(imap(isinstance, repeat(seqs), ignore)) or not isinstance(seqs, Iterable) else chain.from_iterable(imap(flat, seqs))

Он может игнорировать любой конкретный (или производный) тип, который вам нужен, он возвращает итератор, поэтому вы можете преобразовать его в любой конкретный контейнер, такой как list, tuple, dict или просто использовать его для уменьшения памяти след, к лучшему или худшему, он может обрабатывать исходные не повторяемые объекты, такие как int ...

Заметьте, что большая часть тяжелой работы выполняется в C, поскольку, насколько я знаю, именно так реализованы itertools, поэтому, несмотря на то, что он рекурсивный, AFAIK не ограничен глубиной рекурсии python, поскольку вызовы функций происходят в C хотя это не означает, что вы ограничены памятью, особенно в OS X, где размер стека имеет жесткое ограничение на сегодняшний день (OS X Mavericks) ...

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

def flat(seqs, ignore={int, long, float, str, unicode}):
    return repeat(seqs, 1) if type(seqs) in ignore or not isinstance(seqs, Iterable) else chain.from_iterable(imap(flat, seqs))

здесь мы используем наборы для проверки типа, поэтому требуется O (1) против O (количество типов), чтобы проверить, следует ли игнорировать элемент, хотя, конечно, любое значение с производным типом указанные игнорируемые типы потерпят неудачу, поэтому его используют str, unicode, поэтому используйте его с осторожностью ...

тесты:

import random

def test_flat(test_size=2000):
    def increase_depth(value, depth=1):
        for func in xrange(depth):
            value = repeat(value, 1)
        return value

    def random_sub_chaining(nested_values):
        for values in nested_values:
            yield chain((values,), chain.from_iterable(imap(next, repeat(nested_values, random.randint(1, 10)))))

    expected_values = zip(xrange(test_size), imap(str, xrange(test_size)))
    nested_values = random_sub_chaining((increase_depth(value, depth) for depth, value in enumerate(expected_values)))
    assert not any(imap(cmp, chain.from_iterable(expected_values), flat(chain(((),), nested_values, ((),)))))

>>> test_flat()
>>> list(flat([[[1, 2, 3], [4, 5]], 6]))
[1, 2, 3, 4, 5, 6]
>>>  

$ uname -a
Darwin Samys-MacBook-Pro.local 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun  3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64
$ python --version
Python 2.7.5
6
задан Michael Lucas 6 July 2009 в 17:13
поделиться

3 ответа

Отчасти это зависит от режима шифрования. Если вы используете ECB ( позор! ), я мог бы поменять местами блоки, изменяя сообщение. Именно эта ошибка поразила Stackoverflow .

Менее опасно - без какой-либо проверки целостности я мог бы выполнить атаку «человек посередине» и поменять местами все виды битов, и вы бы получили его и попытались расшифровать. Вы, конечно, потерпите неудачу, но попытка может оказаться показательной. Атаки по побочным каналам осуществляются «Бернштейном (использующим комбинацию кеш-памяти и микроархитектурными характеристиками), а Освиком, Шамиром и Тромером (использующими коллизии кэша), основанными на получении статистических данных на основе большого количества случайных тестов». у кого нет доступа к вашему MAC ключ не может никогда не подавать злой вход в блок кода, однако вы резко снизить вероятность того, что он сможет использовать любые ошибки

6
ответ дан 17 December 2019 в 18:19
поделиться

Подход симметричного шифрования так же безопасен, как и ключ. Если обе системы могут получить ключ и надежно удерживать его, это нормально. Криптография с открытым ключом, безусловно, более естественна.

-5
ответ дан 17 December 2019 в 18:19
поделиться

Ага. Само по себе шифрование не обеспечивает аутентификации. Если вам нужна аутентификация, вам следует использовать код аутентификации сообщения, такой как HMAC или цифровые подписи (в зависимости от ваших требований).

Существует довольно большое количество атак, которые возможны, если сообщения просто зашифрованы, но не аутентифицированы. Вот очень простой пример. Предположим, что сообщения зашифрованы с использованием CBC . В этом режиме используется IV для рандомизации зашифрованного текста, чтобы двойное шифрование одного и того же сообщения не приводило к одному и тому же зашифрованному тексту. Теперь посмотрим, что происходит во время дешифрования, если злоумышленник просто изменяет IV, но оставляет остальную часть зашифрованного текста как есть. Изменится только первый блок расшифрованного сообщения. Более того, именно эти биты изменились при изменении IV в сообщении. Следовательно, злоумышленник точно знает, что изменится, когда получатель расшифрует сообщение. Если этот первый блок был, например, меткой времени, и злоумышленник знает, когда было отправлено исходное сообщение, тогда он может легко исправить метку времени на любое другое время, просто перевернув правильные биты.

Другие блоки сообщения также могут быть изменены, хотя это немного сложнее. Отметим также, что это не просто слабость CBC. Другие режимы, такие как OFB, CFB, имеют похожие недостатки. Так что ожидать, что только шифрование обеспечивает аутентификацию, - очень опасное предположение

2
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: