Найти - Пользователи
Полная версия: AES шифрование
Начало » Python для новичков » AES шифрование
1
Nikita32
Добрый день, пытаюсь зашифровать строку 128-битным ключом с помощью AES алгоритма. Нашел этот код:
import base64
from Crypto import Random
from Crypto.Cipher import AES
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[0:-s[-1]]
class AESCipher:
    def __init__( self, key ):
        self.key = key
    def encrypt( self, raw ):
        raw = pad(raw)
        print(AES.block_size)
        iv = Random.new().read( AES.block_size )
        cipher = AES.new( self.key, AES.MODE_CBC, iv )
        return base64.b64encode( iv + cipher.encrypt( raw ) )
    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return unpad(cipher.decrypt( enc[16:] ))
cipher = AESCipher('mysecretpassword')
encrypted = cipher.encrypt('Secret Message A')
decrypted = cipher.decrypt(encrypted)
print (encrypted.decode('UTF-8'))
print (decrypted.decode('UTF-8'))
Строка шифруется и расшифровывается, но ни на одном онлайн-aes дешифраторе расшифровать с таким же ключом не получилось. В чем может быть проблема?
Ссылки на онлайн дешифраторы:
http://crypt-online.narod.ru/crypts/aes/
http://aes.online-domain-tools.com/
ZerG
BS поставьте такой как на сайте - 128 например
Nikita32
ZerG
BS поставьте такой как на сайте - 128 например
Попробовал, тоже не декодируется потом. BS - это размер в байтах 16 * 8 = 128 бит, и еще: ключ сколько символов должен быть?
terabayt
а как с помощью этого сайта вы пытаетесь что-то сделать если он даже cbc не поддерживает??!
http://crypt-online.narod.ru/crypts/aes/
Nikita32
Да, согласен с помощью первого указанного сайта это невозможно. Вот другой код, испльзую ECB режим, BLOCK_SIZE должен быть равен размеру ключа?
from Crypto.Cipher import AES
import base64
import os
from base64 import b64encode
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).decode("UTF-8").rstrip(PADDING)
secret = b'asasasasasasasas'
cipher = AES.new(secret, AES.MODE_ECB)
print(secret.decode('utf-8'))
encoded = EncodeAES(cipher, 'password')
print ('Encrypted string:', encoded.decode('utf-8'))
decoded = DecodeAES(cipher, encoded)
print ('Decrypted string:', decoded)
Проверял потом через: http://aes.online-domain-tools.com/ - не работает
Nikita32
http://aesencryption.net/ - работает
py.user.next
Nikita32
ключ сколько символов должен быть?
Ключ занимает столько же, сколько один блок. Если ключ короче или длиннее, то обычно его транслируют как-то до такой длины (могут и хеш от него взять). То есть бывает так, что алгоритм один, а ключ участвует не напрямую, а сначала транслируется во что-то. Поэтому разные сервисы один шифротекст в одном алгоритме не могут расшифровать, так как по разному делают ключ.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB