2015-11-14 4 views
1

С одной стороны, у меня есть тексты зашифрованы/расшифровываются в Perl Crypt::CBCИспользование Python PyCrypto с Perl Crypt :: CBC

my $key = 'key to the gates'; 
my $cipher = Crypt::CBC->new(
    -key => $key, 
    -cipher => 'Blowfish', 
    -salt => '12341234' 
); 

С другой стороны, у меня есть в Python PyCrypto, что мне нужно, чтобы декодировать данные из Perl, но и отправить текст, который шифр Perl может читать с учетом шифрования.

У меня есть ключ от программы Perl и encrypt_hex: ed паролей из Perl, отправленных в систему Python.

Но Python, кажется, абсолютно хотят иметь IV делать свою работу

cipher = Blowfish.new(self.key, Blowfish.MODE_CBC, self.iv) 
     return hexlify(cipher.encrypt(raw)) 

Однако Crypt::CBC documnetation, кажется, указывает, что IV есть уже

"соль" - Комбинируйте кодовую фразу с 8-байтовым случайным значением до , генерируя как ключ блочного шифрования, так и идентификатор IV из предоставленной кодовой фразы . Соль будет добавлена ​​к началу началу потока данных, позволяющему дешифровать до регенерировать как ключ, так и IV с учетом правильной кодовой фразы .

Есть ли способ извлечь IV из ключа/парольной фразы через PyCrypto? Или IV нужно отправить отдельно каким-то образом?

Это может быть наивный вопрос, но я не работаю с этим каждый день.

Я знаю, что могу получить IV со стороны Perl, но я действительно хочу извлечь его на стороне Python, если это возможно.

+0

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

+0

Упс! Я новичок здесь и не знал, что другие люди могут редактировать ваши сообщения, поэтому я думал, что сделал что-то и попытался откат. Теперь, когда я знаю, вы можете повторно редактировать, если хотите;) – bobdobalina

ответ

2

Crypt::CBC претензии совместимы с OpenSSL. Это означает, что он выполняет специфичную для OpenSSL BytesToKey функцию вывода ключа на основе пароля (PBKDF). Во время этого вывода также рассчитывается IV. Таким образом, ключ, который вы предоставили для Crypt::CBC, фактически рассматривается как пароль.

Вам необходимо найти реализацию EVP_BytesToKey и интегрировать ее в свою программу. Вы можете начать с этим кодом from GitHub:

def bytes_to_key(data, salt="12345678"): 
    # Simplified version of M2Crypto.m2.bytes_to_key(). Based on: 
    # https://github.com/ajmirsky/M2Crypto/blob/master/M2Crypto/EVP.py#L105 
    # http://stackoverflow.com/questions/8008253/c-sharp-version-of-openssl-evp-bytestokey-method 
    assert len(salt) == 8, len(salt) 
    data += salt 
    key = md5(data).digest() 
    key += md5(key + data).digest() 
    return key 

Затем возьмите первые байты ключа, и следующие 8 байт для IV. Но обратите внимание на следующее заявление для Crypt: CBC:

Если -keysize не указан, то Crypt :: CBC будет использовать максимальную длину Blowfish размер ключа 56 байт (448 бит).

Таким образом, вам может понадобиться еще несколько вызовов key += md5(key + data).digest(), поскольку выход md5 составляет всего 128 бит.

 Смежные вопросы

  • Нет связанных вопросов^_^