Вопрос по pycrypto, python, aes – Почему я не могу расшифровать свое зашифрованное сообщение AES на ком-то еще, кто расшифровал AES?

0
from Crypto.Cipher import AES
import os

key = 'mysecretpassword'
iv = os.urandom(16)
plaintext1 = 'Secret Message A'
encobj = AES.new(key, AES.MODE_CBC, iv)
ciphertext1 = encobj.encrypt(plaintext1) 
encryptedText = ciphertext1.encode('base64')
print encryptedText
decobj = AES.new(key, AES.MODE_CBC, iv)
print decobj.decrypt(ciphertext1)

Я скопировал напечатанное значениеencryptedText иkey из моего кода и вставлен на веб-сайтах ниже.

http://www.everpassword.com/aes-encryptor

http://www.nakov.com/blog/2011/12/26/online-aes-encryptor-decryptor-javascript/

Я ожидал, что он сможет расшифровать мой шифр, но это не так. Таким образом, я должен использовать pycrypto неправильно. Как это исправить? Два сайта могут как шифровать, так и дешифровать между собой, но мины не могут. Оба сайта действительно используют режим CBC.

На самом деле мое предположение верно, что веб-сайт принимает зашифрованный текст как base64. Это даже прямо сказано во второй веб-ссылке. Нет никакого способа, которым это может быть в ascii или что-то еще. Поэтому я все еще не понимаю, что я делаю неправильно в коде. Как получить расшифровку на сайтах. user299648
Вы должны дать дешифратору IV. Этот веб-сайт не принимает IV. Так что, вероятно, он использует ЕЦБ, а не CBC. Keith Randall
Кроме того, как вы узнаете, что веб-сайт принимает зашифрованный текст как base64? Keith Randall
Да, я ошибочно предположил, что веб-сайт использует зашифрованный текст как base64. user299648
Вы пробовали разные режимы? Я не вижу, использует ли сайт XTS, CBC или, возможно, только ECB. Попробуйте разные режимы. Обратите внимание, что вы используете IV, но сайт не запрашивает его. javex

Ваш Ответ

1   ответ
3

вы увидите, что он используеттарабарщину-АЕС библиотека JavaScript Чтобы увидеть, что вам нужно сделать, чтобы это сработало, вы должны изучить, что это делает.

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

randArr = function(num) {
    var result = [], i;
    for (i = 0; i < num; i++) {
        result = result.concat(Math.floor(Math.random() * 256));
    }
    return result;
},

а также

enc = function(string, pass, binary) {
        // string, password in plaintext
        var salt = randArr(8),
        pbe = openSSLKey(s2a(pass, binary), salt),
        key = pbe.key,
        iv = pbe.iv,
        cipherBlocks,
        saltBlock = [[83, 97, 108, 116, 101, 100, 95, 95].concat(salt)];
        string = s2a(string, binary);
        cipherBlocks = rawEncrypt(string, key, iv);
        // Spells out 'Salted__'
        cipherBlocks = saltBlock.concat(cipherBlocks);
        return Base64.encode(cipherBlocks);
    },

Для дешифрования он выбирает случайную часть соли из начала шифротекста после декодирования base64 (первыйslice оператор):

dec = function(string, pass, binary) {
    // string, password in plaintext
    var cryptArr = Base64.decode(string),
    salt = cryptArr.slice(8, 16),
    pbe = openSSLKey(s2a(pass, binary), salt),
    key = pbe.key,
    iv = pbe.iv;
    cryptArr = cryptArr.slice(16, cryptArr.length);
    // Take off the Salted__ffeeddcc
    string = rawDecrypt(cryptArr, key, iv, binary);
    return string;
},

Недостающий кусок сейчасopenSSLkey функция:

openSSLKey = function(passwordArr, saltArr) {
    // Number of rounds depends on the size of the AES in use
    // 3 rounds for 256
    // 2 rounds for the key, 1 for the IV
    // 2 rounds for 128
    // 1 round for the key, 1 round for the IV
    // 3 rounds for 192 since it's not evenly divided by 128 bits
    var rounds = Nr >= 12 ? 3: 2,
    key = [],
    iv = [],
    md5_hash = [],
    result = [],
    data00 = passwordArr.concat(saltArr),
    i;
    md5_hash[0] = GibberishAES.Hash.MD5(data00);
    result = md5_hash[0];
    for (i = 1; i < rounds; i++) {
        md5_hash[i] = GibberishAES.Hash.MD5(md5_hash[i - 1].concat(data00));
        result = result.concat(md5_hash[i]);
    }
    key = result.slice(0, 4 * Nk);
    iv = result.slice(4 * Nk, 4 * Nk + 16);
    return {
        key: key,
        iv: iv
    };
},

Так что в основном вы должны перевестиopenSSLKey Функция к Python и скормить его свой пароль и соль. Это создает (ключ, IV) кортеж. Используйте их для шифрования ваших данных. Добавить строкуSalted__ и соль в зашифрованный текст, прежде чем кодировать его с base64. Тогда это должно работать, я думаю.

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