AES Счетчик режима C # эквивалент - PullRequest
2 голосов
/ 24 марта 2011

Я использую следующий javascript для шифрования некоторых данных: http://www.movable -type.co.uk / scripts / aes.html

Я должен расшифровать его с помощью C #.Кто-нибудь знает, как расшифровать это с помощью менеджера Rijndael?

Я хочу избежать портирования кода; -)

Заранее спасибо

Ответы [ 3 ]

10 голосов
/ 25 марта 2011

Увы, Режим CTR не реализован как «режим» во встроенном классе AES в пространстве имен System.Security.Cryptography.

Но, есть решение. Режим CTR не так уж сложно реализовать, используя встроенный класс AES, работающий в режиме ECB, IV всех нулей, без заполнения и несколько настроек. По существу, для каждого блока режим CTR шифрует счетчик, а затем XOR результат этого шифрования с открытым текстом, чтобы получить зашифрованный текст. Это для шифрования. Вы бы сделали обратное для расшифровки. Поскольку операция преобразования является XOR, она рефлексивна, поэтому дешифрование в действительности совпадает с шифрованием.

Начните с нуля для первого 16-байтового блока (размер блока для AES); увеличить счетчик для каждого последующего блока.

Честно говоря, самая сложная часть всей этой истории - это сегментирование данных, которые должны быть зашифрованы, на блоки по 16 байт. Если приложение просит зашифровать 10 байтов, вы не можете зашифровать. Вам нужно подождать, пока вы не получите полные 16 байтов, прежде чем выполнять преобразование. Так что вам нужно управлять буфером.

У меня нет демонстрации рабочего кода для вас, но, учитывая это описание, не составит труда создать подходящий для вас режим CTR. Вы можете увидеть пример шифрования в режиме CTR на основе встроенного класса AES в модуле WinZipAes.cs , являющемся частью библиотеки DotNetZip с открытым исходным кодом. Этот код работает , но не готов к использованию вне DotNetZip. Вам нужно будет упаковать его, чтобы сделать его чистым.


С другой стороны, если вы просто хотите, чтобы Javascript и C # взаимодействовали с AES, и вы не особенно привязаны к режиму CTR, то вы могли бы очень легко использовать режим ECB. Этот вопрос показывает, как заставить SlowAES и класс Aes .NET работать вместе, и включает ссылки на рабочий код (Javascript, C # и VB). Но будьте осторожны с режимом ECB .

Это библиотека Javascript, отличная от выбранной вами; Я предпочитаю slowAES, потому что это имело для меня больше смысла. также в этом ответе я предоставляю вспомогательные классы, такие как получение ключа на основе пароля RFC2898.

Удачи.

2 голосов
/ 03 февраля 2016

У меня недостаточно очков, чтобы ответить на ответ Cheeso, но я не верю, что это точно: «Если приложение запрашивает шифрование 10 байтов, вы не можете зашифровать».

Поскольку CTRРежим шифрует одноразовый номер, а затем XOR-результат с помощью clearText, вы можете зашифровать блоки любого размера.Это на самом деле одно из основных преимуществ режима CTR, наряду с параллельным шифрованием.

0 голосов
/ 02 апреля 2012

Вы также можете убедиться, что ваш вход в блок AES ECB представляет собой комбинацию случайного IV и байтового смещения. Например, верхние 92 бита - это случайный IV (различный для каждого файла), а нижние 32 бита - это смещение вашего байта.

Использование IV из 0 для каждого шифрования файла опасно. (см. «Написание безопасного кода», стр. 285, 2-е издание). Изменяйте ключ и IV для каждой операции шифрования.

...