Я переношу свой существующий код на 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"\0" * (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"\0")
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 байт
Я ожидал, что результат "мой проход"