2012-01-22 13 views
5

Próbuję zaszyfrować ciąg znaków w IOS, a następnie wysłać je do serwera TCP. Wersja kodu Python i wersje dla iOS pokazane są poniżej. Proszę zobaczyć wyniki obu wersji. Wyglądają dość podobnie, ale długości są inne i nie znam powodu. Czy ktokolwiek może to sprawdzić, jaki może być powód?Szyfrowanie AES w języku Python różni się od iOS

Należy pamiętać, że PADDING w skrypcie w języku Python należy odrzucić, ponieważ dałem już tekst o długości 16 znaków.

PYTHON Kod:

 #!/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 

WYJŚCIE:

Szyfrowane ciąg: 57AayWF4jKYx7KzGkwudIBZUsn1ULOC0C4c5YF3xeI8 =

odszyfrowany ciąg: 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); 

WYJŚCIE:

AES dane: password12345678
57AayWF4jKYx7KzGkwudIKNlwA + HErrmiy1Z0szzZds =

+2

Można zignorować jedynie dopełnienie jeśli jesteś przy użyciu [trybu EBC] (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29). Mam nadzieję, że nie korzystasz z trybu ECB. – sarnold

+0

Nie ustawiłem trybu w Pythonie, uważam, że używa on wartości domyślnej. – Bora

+0

@Sarnold Tryb EBC wymaga również wypełnienia, IV nie powinno być ustawione w trybie ECB lub ustawione na wszystkie zero (jeśli platforma wymaga IV), ale dopełnienie jest z pewnością wymagane. Czy jest to specyficzne dla platformy Python/iOS? –

Odpowiedz

5

OK, tutaj jest. Dzięki sarnold za wskazówkę :)

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 

Pythonie WYJŚCIE:

Szyfrowane ciąg: C9pEG6g8ge76xt2q9XLbpw ==

odszyfrowany ciąg: aaaaaaaaaaaaaaaa

* Zmieniono CCOptions AES w celu kCCOptionECBMode iOS. *

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

A teraz wyjście jest:

iOS wyjściowa:

AES dane: aaaaaaaaaaaaaaaa
C9pEG6g8ge76xt2q9XLbpw ==

+0

Dobra robota :) Choć myślę, że nie powinieneś wybierać "społecznościowej wiki" - nie ma nic złego w odpowiadaniu na twoje pytania, a ta odpowiedź jest zdecydowanie lepsza niż wiele innych. Powinieneś uzyskać z tego reputację. ;) – sarnold

+0

Usunięto status Wiki. Społeczność wiki jest przydatna, gdy chcesz mieć pewność, że dużo szersza grupa użytkowników może edytować coś, na przykład kanoniczną odpowiedź na bardzo częste pytanie, które może wymagać zmiany w czasie. Nie ma nic złego w odpowiadaniu na twoje własne pytanie, w rzeczywistości jest zachęcane. –

Powiązane problemy