SORU
21 EYLÜL 2012, Cuma


Şifrelemek ve AES 256 PyCrypto kullanarak Şifresini

İki parametre kabul eden iki işlevi PyCrypto kullanarak yapmaya çalışıyorum: anahtar ve şifrelemek/şifresini mesaj mesaj.

Web üzerinde çeşitli linkler bana yardımcı buldum, ama her biri bir kusurları vardır:

This one at codekoala işletim sistemi kullanır.PyCrypto cesareti olan urandom,.

Ayrıca, işlevi verdiğim anahtarı tam uzunluğu beklenen garanti edilmez. Ben bunun olması için ne yapabilirim ?

Ayrıca, bir tavsiye olan birkaç modu vardır? Kullanımı: / bilmiyorum

Son olarak, tam olarak IV nedir? Şifreleme ve şifre çözme için farklı bir IV sağlayabilir miyim, yoksa bu farklı bir sonuç döndürür?

Şuana kadar yaptığım şey şu:

from Crypto import Random
from Crypto.Cipher import AES
import base64

BLOCK_SIZE=32

def encrypt(message, passphrase):
    # passphrase MUST be 16, 24 or 32 bytes long, how can I do that ?
    IV = Random.new().read(BLOCK_SIZE)
    aes = AES.new(passphrase, AES.MODE_CFB, IV)
    return base64.b64encode(aes.encrypt(message))

def decrypt(encrypted, passphrase):
    IV = Random.new().read(BLOCK_SIZE)
    aes = AES.new(passphrase, AES.MODE_CFB, IV)
    return aes.decrypt(base64.b64decode(encrypted))

Bana yardım ettiğin için teşekkürler!

CEVAP
21 EYLÜL 2012, Cuma


Giriş uzunluğu BLOCK_SİZE bir katı değilse, pad şifreleme yapmak ve unpad şifre çözme zaman () için aşağıdaki iki işlevi gerekebilir.

BS = 16
pad = lambda s: s   (BS - len(s) % BS) * chr(BS - len(s) % BS) 
unpad = lambda s : s[:-ord(s[len(s)-1:])]

Anahtar uzunluğu istiyorsunuz? Anahtar md5sum kullanmak yerine direkt olarak kullanabilirsiniz.

Daha çok, göre benim küçük deneyim kullanarak PyCrypto, IV için kullanılır karışıklık çıktı bir şifreleme giriş aynı, yani IV seçilmiş bir rasgele dize, ve kullanmak bir parçası olarak şifreleme çıktı, ve daha sonra kullanmak için şifresini mesaj.

Ve burada benim uygulama, sizin için yararlı olacağını umuyoruz:

import base64
from Crypto.Cipher import AES
from Crypto import Random

class AESCipher:
    def __init__( self, key ):
        self.key = key

    def encrypt( self, raw ):
        raw = pad(raw)
        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:] ))

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BaaaStuds's channel

    BaaaStuds's

    10 Mart 2009
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • ShoSho

    ShoSho

    20 Ocak 2010