2012-01-22 18 views
5

Bir dizeyi IOS'da şifrelemeye çalışıyorum ve sonra bir TCP sunucusuna göndereceğim. Kodun ve iOS sürümlerinin Python sürümü aşağıda gösterilmiştir. Lütfen her iki versiyonun çıktılarına bakın. Oldukça benzer görünüyorlar ama uzunlukları farklı ve sebebini bilmiyorum. Herkes kontrol edebilir mi, sebebi ne olabilir?Python'da AES Şifreleme, farklı bir biçimdir iOS

Lütfen 16 önceden bir metin uzunluğu verdiğim için Python komut dosyasında PADDING öğesinin atılması gerektiğini unutmayın.

PYTHON Kodu:

 #!/usr/bin/env python 

    from Crypto.Cipher import AES 
    import base64 
    import os 

    # the block size for the cipher object; must be 16, 24, or 32 for AES 
    BLOCK_SIZE = 16 

    PADDING = '{' 

    # one-liner to sufficiently pad the text to be encrypted 
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

    # one-liners to encrypt/encode and decrypt/decode a string 
    # encrypt with AES, encode with base64 
    EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
    DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 


    secret = "123456789" 

    # create a cipher object using the random secret 
    cipher = AES.new(secret) 

    encoded = EncodeAES(cipher, 'password12345678') 
    print 'Encrypted string:', encoded 

    decoded = DecodeAES(cipher, encoded) 
    print 'Decrypted string:', decoded 

ÇIKIŞ:

Şifreli dizesi: 57AayWF4jKYx7KzGkwudIBZUsn1ULOC0C4c5YF3xeI8 =

Decrypted dize: password12345678

NSString *[email protected]"123456789"; 
NSString *mystr [email protected]"password12345678"; 
const char *utfString = [mystr UTF8String]; 
NSData *aData=[NSData dataWithBytes: utfString length: strlen(utfString)]; 
aData=[mystr dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *data;//=[aData AES128EncryptWithKey:forKey]; 
data=[aData AES128EncryptWithKey:forKey]; 

NSString *base64 = [data base64EncodedString]; 

aData=[data AES128DecryptWithKey:forKey]; 
mystr=[[NSString alloc] initWithData:aData encoding:NSUTF8StringEncoding]; 

NSLog(@"AES data : %@ \n %@",mystr,base64); 

ÇIKIŞ:

AES veriler: password12345678
57AayWF4jKYx7KzGkwudIKNlwA + HErrmiy1Z0szzZds =

+2

Yalnızca dolgu yok sayabilirsiniz [ECB modunu] kullanarak (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29). Umarım ECB modunu kullanmıyorsundur. – sarnold

+0

Python'da modu ayarlamadım, varsayılan değeri kullandığına inanıyorum. – Bora

+0

@sarnold ECB modu da dolgu gerektirir, IV ECB modunda ayarlanmamalı veya tüm sıfıra ayarlanmamalıdır (platform bir IV gerektiriyorsa), ancak doldurma kesinlikle gereklidir. Ya da Python/iOS platformuna özgü olan nedir? –

cevap

5

Tamam, işte burada. Teşekkür ipucu :)

from Crypto.Cipher import AES 
import base64 
import os 

    # the block size for the cipher object; must be 16, 24, or 32 for AES 
    BLOCK_SIZE = 16 
    mode = AES.MODE_CBC 
    secret = "123456789" #os.urandom(BLOCK_SIZE) 

    # create a cipher object using the random secret 
    cipher = AES.new(secret,mode) 

    # encode a string 
    #tx=cipher.encrypt('123456789') 
    #print base64.b64encode(tx) 

    myData='aaaaaaaaaaaaaaaa' 
    #encoded = EncodeAES(cipher, myData) 
    encoded = cipher.encrypt(myData) 
    print 'Encrypted string:', base64.b64encode(encoded) 
    mode = AES.MODE_ECB 
    cipher=AES.new(secret,mode) 
    decoded = cipher.decrypt(encoded) 
    print 'Decrypted string:', decoded 

Python için sarnold ÇIKIŞ:

Şifreli dize: C9pEG6g8ge76xt2q9XLbpw ==

Decrypted dize: aaaaaaaaaaaaaaaa

* in kCCOptionECBMode için AES CCOptions Değişti iOS. *

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,keyPtr, CCKeySizeAES128, NULL,[self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); 

Ve şimdi çıktısı:

iOS Çıkışı:

AES veriler: sen eğer aaaaaaaaaaaaaaaa
C9pEG6g8ge76xt2q9XLbpw ==

+0

Güzel iş :) Bence "topluluk wiki" yi seçmemeliydin - kendi sorularına cevap vermekte yanlış olan bir şey yok ve bu cevap kesinlikle çok daha iyi. Bundan itibar almalısın. ;) – sarnold

+0

Wiki durumu kaldırıldı. Çok daha geniş bir kullanıcı grubunun, zaman içinde değişmesi gerekebilecek çok yaygın bir soruna kanonik bir cevap gibi bir şeyi düzenleyebileceğinden emin olmak için Topluluk wiki'si yararlıdır. Kendi sorunuzu cevaplamakta yanlış bir şey yoktur, aslında, bu teşvik edilir. –