это мой третий вопрос по этой теме здесь, в stackoverflow. Чтобы быть полным, это другие вопросы AES с crypt-js и PyCryptoи Соответствие де/шифрованию AES в python и javascript. К сожалению, моя последняя попытка получила два отрицательных ответа на исходный вопрос. Проблема была в том, что даже я не знал, в чем заключался мой настоящий вопрос. Я просто копался, чтобы найти реальный вопрос, который я искал. Получив отзывы в комментариях и прочитав дополнительную информацию, я обновил свой вопрос. Я раскапываю правильный вопрос, я думаю. Но моя проблема больше не набирала просмотров после моих обновлений. Так что я очень надеюсь, что этот вопрос теперь стал более ясным и понятным - даже я теперь знаю, в чем моя проблема :D
Спасибо всем за то, что сделали stackoverflow этому крутому сообществу — я часто находил здесь решения своих проблем. Пожалуйста, продолжайте оставлять отзывы на плохие вопросы, чтобы их можно было улучшить и обновить, что увеличивает эту огромную базу знаний и решений.
И не стесняйтесь исправлять мою английскую грамматику и орфографию.
У меня есть зашифрованная строка, которую я могу расшифровать с помощью этой Javascript-реализации режима AES 256 CTR
password = "myPassphrase"
ciphertext = "bQJdJ1F2Y0+uILADqEv+/SCDV1jAb7jwUBWk"
origtext = Aes.Ctr.decrypt(ciphertext, password, 256);
alert(origtext)
Это расшифровывает мою строку и окно предупреждения с помощью Это тест. Появится текст
.
Теперь я хочу расшифровать эту строку с помощью python и PyCrypto
password = 'myPassphrase'
ciphertext = "bQJdJ1F2Y0+uILADqEv+/SCDV1jAb7jwUBWk"
ctr = Counter.new(nbits=128)
encryptor = AES.new(key, AES.MODE_CTR, counter=ctr)
origtext = encryptor.decrypt(base64.b64decode(ciphertext))
print origtext
Этот код не запускается. Я получаю ValueError: ключ AES должен иметь длину 16, 24 или 32 байта
. Когда я понял, что мне нужно сделать в PyCrypto больше, чем просто вызвать метод расшифровки, я начал исследовать и пытаться выяснить, что я должен делать.
Сначала я понял следующее:
Для парольной фразы делают так:
for (var i=0; i
Затем я сделал это на питоне
l = 32
key = key + (chr(0)*(l-len(key)%l))
Но это не помогло. Я все еще получаю странную строку ?
A???B??d9= ,?h????'
со следующим кодом
l = 32
key = 'myPassphrase'
key = key + (chr(0)*(l-len(key)%l))
ciphertext = "bQJdJ1F2Y0+uILADqEv+/SCDV1jAb7jwUBWk"
ctr = Counter.new(nbits=128)
encryptor = AES.new(key, AES.MODE_CTR, counter=ctr)
origtext = encryptor.decrypt(base64.b64decode(ciphertext))
print origtext
Затем я прочитал больше о реализации Javascript, и он говорит
[...] В этой реализации начальный блок содержит одноразовый номер в первых 8 байтах и количество блоков во вторых 8 байтах. [...]
Думаю, это может быть ключом к разгадке. Поэтому я проверил, что происходит, когда я шифрую пустую строку в Javascript:
origtext = ""
var ciphertext =Aes.Ctr.encrypt(origtext, password, 256);
alert(ciphertext)
В окне предупреждения отображается /gEKb+N3Y08=
(12 символов). Но почему 12? Разве это не должно быть 8+8 = 16 байт? В любом случае, я попробовал метод грубой силыдля расшифровки Python, проверив расшифровку с помощью для i в xrange(0,20):
и ciphertext[i:]
или base64.b64decode(ciphertext)[i:]
. Я знаю, что это очень неловкая попытка, но я становился все более и более отчаянным. И это тоже не сработало.
Будущие перспективы также заключаются в том, чтобы реализовать шифрование таким же образом.
Зашифрованная строка изначально не была зашифрована этой реализацией Javascript, она взята из другого источника. Я только что понял, что код Javascript работает правильно. Итак, я утверждаю, что такая реализация является чем-то вроде "стандарта".
Что я могу сделать, чтобы шифрование и дешифрование строки с PyCrypto было таким же, как в реализации Javascript, чтобы я мог обмениваться данными между Javascript и Python? Я бы также переключился на другую криптобиблиотеку на питоне, если вы можете предложить другую. Кроме того, я рад любым советам и отзывам.
И я думаю, что все сводится к Как я могу включить одноразовый номер и количество блоков в зашифрованную строку? и Как я могу извлечь эту информацию для расшифровки?