2012-01-22 86 views
5

Tôi đang cố gắng mã hóa một chuỗi trong IOS và sau đó gửi nó đến máy chủ TCP. Phiên bản mã của Python và các phiên bản iOS được hiển thị bên dưới. Vui lòng xem kết quả đầu ra của cả hai phiên bản. Họ trông khá giống nhau nhưng độ dài khác nhau và tôi không biết lý do. Ai có thể kiểm tra nó, điều gì có thể là lý do?Mã hóa AES bằng Python có dạng khác nhau iOS

Xin lưu ý rằng PADDING trong kịch bản Python nên được loại bỏ, vì tôi đã cung cấp độ dài văn bản là 16.

PYTHON Code:

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

OUTPUT:

Mã hóa chuỗi: 57AayWF4jKYx7KzGkwudIBZUsn1ULOC0C4c5YF3xeI8 =

Giải mã chuỗi: 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); 

OUTPUT:

AES dữ liệu: password12345678
57AayWF4jKYx7KzGkwudIKNlwA + HErrmiy1Z0szzZds =

+2

Bạn chỉ có thể bỏ qua các đệm nếu bạn sử dụng [chế độ ECB] (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29). Tôi hy vọng bạn không sử dụng chế độ ECB. – sarnold

+0

Tôi chưa đặt chế độ bằng Python, tôi tin rằng nó đang sử dụng giá trị mặc định. – Bora

+0

@ ngoại trừ chế độ ECB cũng yêu cầu đệm, IV không được đặt ở chế độ ECB hoặc được đặt thành tất cả các số không (nếu nền tảng yêu cầu IV), nhưng chắc chắn cần có đệm. Hoặc là cụ thể cho nền tảng Python/iOS? –

Trả lời

5

OK, ở đây nó được. Cảm ơn sarnold cho đầu mối :)

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 OUTPUT:

chuỗi mã hóa: C9pEG6g8ge76xt2q9XLbpw ==

chuỗi được giải: aaaaaaaaaaaaaaaa

* Thay đổi CCOptions AES để kCCOptionECBMode trong iOS. *

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

Và bây giờ là đầu ra:

iOS Output:

dữ liệu AES: aaaaaaaaaaaaaaaa
C9pEG6g8ge76xt2q9XLbpw ==

+0

Công việc tốt :) Mặc dù tôi nghĩ bạn không nên chọn "cộng đồng wiki" - không có gì sai khi trả lời các câu hỏi của riêng bạn, và câu trả lời này chắc chắn tốt hơn nhiều. Bạn nên có được danh tiếng từ nó. ;) – sarnold

+0

Trạng thái wiki đã bị xóa. Wiki cộng đồng hữu ích khi bạn muốn chắc chắn một nhóm người dùng rộng lớn hơn có thể chỉnh sửa nội dung nào đó, chẳng hạn như câu trả lời chuẩn cho một câu hỏi rất phổ biến có thể cần phải thay đổi theo thời gian. Không có gì sai khi trả lời câu hỏi của riêng bạn, trên thực tế, nó được khuyến khích. –

Các vấn đề liên quan