BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
base64pad = lambda s: s + '=' * (4 - len(s) % 4)
base64unpad = lambda s: s.rstrip(" = ")
encrypt_key = 'BKHlhb899Y09olUa' #Needs to be 16 chars
def encrypt(key, msg):
iv = Random.new().read(BS)
cipher = AES.new(key.encode("utf8"), AES.MODE_CFB, iv)
encrypted_msg = cipher.encrypt(pad(str(msg)).encode("utf8"))
return base64unpad(urlsafe_b64encode(iv + encrypted_msg).decode("utf8"))
def decrypt(key, msg):
decoded_msg = urlsafe_b64decode(base64pad(msg))
iv = decoded_msg[:BS]
encrypted_msg = decoded_msg[BS:]
cipher = AES.new(key.encode("utf8"), AES.MODE_CFB, iv)
return unpad(cipher.decrypt(encrypted_msg))
Encrypted = encrypt(encrypt_key, "1234567890123456")
print(Encrypted)
Decrypted = decrypt(encrypt_key, Encrypted)
print(Decrypted)
Выше приведен код, который я использую в Python 3, и он отлично работает. Но я не могу расшифровать зашифрованный текст в PHP. Мой текущий код:
$encryptedText = "wIR0ElYIkuKckQQ-0KikhLuXjkL2vTAaOtaO7WyVp2A2JE5FTWZf__ZgCmUQ2Lre";
$key = "BKHlhb899Y09olUa";
echo openssl_decrypt(substr(base64_decode($encryptedText), 16), "AES-128-CFB", $key, OPENSSL_RAW_DATA, substr(base64_decode($encryptedText), 0, 16))."<br>";
На самом деле это упоминается в документы, размер сегмента по умолчанию составляет 8 бит.






Кажется, PHP-эквивалентом Python
MODE_CFBявляетсяAES-128-CFB8. Такжеbase64_decodeнеправильно декодирует ваши строки Python, используйтеb64encodeвместоurlsafe_b64encode. CFB не требует заполнения, но если это необходимо, то PyCryptodome предоставляет функции заполнения. Наконец, если вам нужно назватьlambda, лучше всего определить обычную функцию.