2015-08-27 5 views
0

Я пытаюсь реализовать сквозную поддержку шифрования для эфемерных сообщений pushbullet в python3.Сообщение об ошибке дешифрования InvalidTag с помощью python-криптографии

Я использую python-cryptography, но я получаю InvalidTag-Исключение при расшифровке. Я дважды проверил ключ, iv и тег, но я не могу понять, где это происходит.

Ключ получается так:

salt = user_ident.encode() 
    pw = password.encode() 

    kdf = PBKDF2HMAC(
      algorithm=hashes.SHA256(), 
      length=32, 
      salt=salt, 
      iterations=30000, 
      backend=backend) 

    dkey = kdf.derive(pw) 

Затем он хранится в связках, как в кодировке Base64, но я проверил, если я получаю правильную строку байт при шифровании (также, делая это вручную REPL).

Расшифровать:

ciphertxt = a2b_base64(msg['ciphertext']) 
version = ciphertxt[0:1] 
tag = ciphertxt[1:17] 
iv = ciphertxt[17:29] 
enc_msg = ciphertxt[29:] 

# Construct an AES-GCM Cipher object 
decryptor = Cipher(
    algorithms.AES(self.dkey_), 
    modes.GCM(iv, tag), 
    backend=backend 
).decryptor() 

cleartxt = decryptor.update(enc_msg) + decryptor.finalize() 

Все вары являются байтовые строки, здесь relevant docs питона-криптография.

Чтобы уточнить: Я пробовал свои собственные методы для шифрования и успешного расшифровки некоторого текста. Но когда я активирую шифрование Pushbullet e2e на моем телефоне и моем клиенте, и я получаю уведомление, я получаю ошибку выше.

Метод шифрования компонует зашифрованное сообщение, как это:

b'1' + encryptor.tag + iv + ciphertxt 

И я могу расшифровать. Не работает с тегом из полученного сообщения.

Любые идеи? :/

ответ

0

Недавно я добавил некоторые интерактивную Javascript материала на странице Документов https://docs.pushbullet.com/#example-encrypt-a-message

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

В вашем случае, я думаю, вы должны создать ключ, IV и сообщение, которое не изменится, и убедитесь, что ваша библиотека создает тот же encrypted_message, что и код javascript в этом примере. Вот как это может выглядеть:

// convert key from base64 to binary 
var key = atob("1sW28zp7CWv5TtGjlQpDHHG4Cbr9v36fG5o4f74LsKg="); 
var initialization_vector = atob("O2QAL8AYQB+qbre8"); // 96-bit 
var message = "meow!"; 

var cipher = forge.cipher.createCipher('AES-GCM', key); 
cipher.start({"iv": initialization_vector}); 
cipher.update(forge.util.createBuffer(forge.util.encodeUtf8(message))); 
cipher.finish(); 

var tag = cipher.mode.tag.getBytes(); 
console.log("tag", btoa(tag)); 
var encrypted_message = cipher.output.getBytes(); 
console.log("encrypted_message", btoa(encrypted_message)); 

Выход для этого является:

tag OBA7UU/Rd9j0Zn+9korAyQ== 
encrypted_message 7YS1aTE= 

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

var key = atob("1sW28zp7CWv5TtGjlQpDHHG4Cbr9v36fG5o4f74LsKg=") 
var tag = atob("OBA7UU/Rd9j0Zn+9korAyQ==") 
var initialization_vector = atob("O2QAL8AYQB+qbre8"); // 96 bits 
var encrypted_message = atob("7YS1aTE="); 

var decipher = forge.cipher.createDecipher('AES-GCM', key); 
decipher.start({ 
    'iv': initialization_vector, 
    'tag': tag 
}); 
decipher.update(forge.util.createBuffer(encrypted_message)); 
decipher.finish(); 

var message = decipher.output.toString('utf8'); 
console.log("message:", message); 

Который должен напечатать:

message: meow! 

У меня нет никакого опыта работы с этой конкретной библиотекой питона, но если вы используете этот метод отладки вы должны быть в состоянии сузить, где проблема.

+0

Ty. Я видел вашу (большую) документацию, и я пробовал это (несколько раз думаю). Я могу привести ваш полный пример. Если я использую свой реальный ключ, iv и тег из полученного сообщения, я тоже могу зашифровать и расшифровать. Но я не могу расшифровать исходное сообщение с тегом из сообщения. Думал, что это может быть проблема с кодировкой, но поскольку я могу использовать тег для шифрования ... –

+0

При ближайшем рассмотрении библиотеки python, о которой вы упомянули, вы получаете недопустимую ошибку тега по крайней мере по следующим причинам: недопустимый ключ, недопустимый тег, недопустимый iv, неверное зашифрованное сообщение. Кажется вероятным, что один из них неверен. Можете ли вы дважды проверить байты каждого, убедиться, что они выглядят действительными и имеют правильную длину бита, и что вы получаете тот же ключ, когда используете интерактивные документы, как тот, который вы используете для расшифровки? –

+0

Мне было интересно о «интерактивной» части. Я не вижу кнопку запуска (http://imgur.com/YeiNyF4), и я получаю сообщение об ошибке на консоли js: «TypeError: code undefined - docs.pushbullet.com:2022:10». Мой JS плох, но нет некоторых ';' или ',' отсутствует? –