#php #python-3.x #encryption #rijndael #cbc-mode
#php #python-3.x #шифрование #rijndael #cbc-режим
Вопрос:
Я переношу свой существующий код на Python3, к сожалению, расшифровка показывает ошибку, что IV должен быть длиной 16 байт.
Я попытался расшифровать ключ с помощью sha1, а затем попытался расшифровать.
Мой код php5.6
<?php
define('ENCR_ALGO', MCRYPT_RIJNDAEL_256);
define('ENCR_MODE', MCRYPT_MODE_CBC);
define('KEY',"This is test key");
function encryptData($plaintext){
$iv=generateIv();
$ciphertext = mcrypt_encrypt(ENCR_ALGO, getKey(), $plaintext, ENCR_MODE, $iv);
$ciphertext.=$iv;
return trim(base64_encode($ciphertext));
}
function decryptData($ciphertext){
$iv=getIvFromCiphertext($ciphertext);
$ciphertext=getActualCiphertext($ciphertext);
$plaintext = mcrypt_decrypt(ENCR_ALGO, getKey(), $ciphertext, ENCR_MODE, $iv);
return trim($plaintext);
}
function getIvFromCiphertext($encryptedData){
$encryptedData = base64_decode($encryptedData);
$cipherTextSize = strlen($encryptedData);
$ivStartIndex = $cipherTextSize-ivSize();
return substr($encryptedData, $ivStartIndex , ivSize());
}
function getActualCiphertext($encryptedData){
$encryptedData = base64_decode($encryptedData);
$cipherTextSize = strlen($encryptedData);
return substr($encryptedData, 0,$cipherTextSize-ivSize());
}
function ivSize(){
return mcrypt_get_iv_size(ENCR_ALGO, ENCR_MODE);
}
function keySize(){
return mcrypt_get_key_size(ENCR_ALGO, ENCR_MODE);
}
function generateIv(){
return mcrypt_create_iv(keySize(), MCRYPT_RAND );
}
function getKey(){
return substr(sha1(KEY), 0, keySize());
}
echo "<br/>";
echo encryptData("my pass");
echo decryptData("vuv6kZgweA2YqSU4vMOuYStrbwZayDYaL7UQ JajFCVc2p4HW1o68OmIm2l3Rbi/IaCWtKD5m6an7LqnvwRYVA==");
?>
В моем файле python3 это похоже
from hashlib import sha1
import base64
from Crypto import Random
from Crypto.Cipher import AES
def actual_text(txt):
data = base64.b64decode(txt)
return data[:32], data[32:64]
passs = "vuv6kZgweA2YqSU4vMOuYStrbwZayDYaL7UQ JajFCVc2p4HW1o68OmIm2l3Rbi/IaCWtKD5m6an7LqnvwRYVA=="
key = "This is test key"
text, iv = actual_text(passs)
class Encryptor:
def __init__(self, key):
self.key = key
def pad(self, s):
return s b"" * (AES.block_size - len(s) % AES.block_size)
def encrypt(self, message, key, key_size=256):
message = self.pad(message)
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv)
return iv cipher.encrypt(message)
def decrypt(self, ciphertext, key, iv):
# iv = ciphertext[:AES.block_size]
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext[AES.block_size:])
return plaintext.rstrip(b"")
def make_sha1(s, encoding='utf-8'):
return sha1(s.encode(encoding)).hexdigest()
make_sha1(key, encoding='utf-8')
key2 = make_sha1(key, encoding='utf-8')[:32]
print(iv)
enc = Encryptor(key2)
enc.decrypt(text,key2,iv)
Отображается ошибка ValueError: IV должен иметь длину 16 байт
Я ожидал, что результат — «мой пропуск»
Комментарии:
1. Вы не можете преобразовать свой код в AES. RIJNDAEL — это не AES. Это был кандидат на конкурс AES и победитель. Когда AES стандартизировал, он отличается от RIJNDAEL. RIJNDAEL может иметь размеры блоков 128 32 * k бит, тогда как AES имеет только 128-битный. MCRYPT_RIJNDAEL_256 имеет размер блока 256 бит, поэтому он несовместим с AES.
2. LOL, get key сначала выполняет хэширование 16-символьного пароля (называемого КЛЮЧОМ), который затем преобразуется в шестнадцатеричную кодировку хэша SHA-1 (20 байт или 40 символов), который затем сокращается до 32 символов, которые интерпретируются как байты. Вы не можете создавать подобные вещи.
3. Обратите внимание, что я проголосовал за закрытие вопроса, поскольку обработка IV и ключей полностью отличается в PHP и Python.
4. @MaartenBodewes какой у вас флаг при закрытии? неясно?
5. Слишком широко, как правило, когда я закрываю вопросы такого рода. Вопрос ясен: «пожалуйста, преобразуйте этот код для меня». По крайней мере, я так это интерпретирую, если нет даже указания на пошаговое выполнение кода и исправление его по одному преобразованию / значению за раз. На самом деле я могу проверить голоса, которые уже были отданы, расширив существующие голоса, но я не уверен, связано ли это с одним из привилегий, основанных на репутации.