2012-01-22 12 views
5

है IOS में एक स्ट्रिंग एन्क्रिप्ट करने की कोशिश कर रहा हूं और फिर इसे एक टीसीपी सर्वर पर भेज रहा हूं। कोड और आईओएस संस्करणों के पायथन संस्करण नीचे दिखाए गए हैं। कृपया दोनों संस्करणों के आउटपुट देखें। वे काफी समान दिखते हैं लेकिन लंबाई अलग होती है और मुझे कारण पता नहीं है। क्या कोई इसे देख सकता है, कारण क्या हो सकता है?पायथन में एईएस एन्क्रिप्शन आईएसओ

कृपया ध्यान दें कि पायथन लिपि में पैडिंग को त्याग दिया जाना चाहिए, क्योंकि मैंने पहले से ही 16 की टेक्स्ट लंबाई दी है।

अजगर कोड:

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

उत्पादन:

एन्क्रिप्टेड स्ट्रिंग: 57AayWF4jKYx7KzGkwudIBZUsn1ULOC0C4c5YF3xeI8 =

Decrypted स्ट्रिंग: 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); 

उत्पादन:

एईएस डेटा: password12345678
57AayWF4jKYx7KzGkwudIKNlwA + HErrmiy1Z0szzZds =

+2

आप केवल गद्दी अनदेखा कर सकते हैं अगर आप [ईसीबी मोड] का उपयोग (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29)। मुझे आशा है कि आप ईसीबी मोड का उपयोग नहीं कर रहे हैं। – sarnold

+0

मैंने पाइथन में मोड सेट नहीं किया है, मुझे विश्वास है कि यह डिफ़ॉल्ट मान का उपयोग कर रहा है। – Bora

+0

@ कर्नाल्ड ईसीबी मोड को पैडिंग की भी आवश्यकता है, IV को ईसीबी मोड में सेट नहीं किया जाना चाहिए या सभी शून्य पर सेट नहीं किया जाना चाहिए (यदि प्लेटफ़ॉर्म को IV की आवश्यकता होती है), लेकिन पैडिंग निश्चित रूप से आवश्यक है। या वह पायथन/आईओएस मंच के लिए विशिष्ट है? –

उत्तर

5

ठीक है, यहाँ यह है। धन्यवाद सुराग :)

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 

अजगर के लिए sarnold उत्पादन:

एन्क्रिप्टेड स्ट्रिंग: C9pEG6g8ge76xt2q9XLbpw ==

Decrypted स्ट्रिंग: aaaaaaaaaaaaaaaa

* में kCCOptionECBMode को एईएस CCOptions बदली गई आईओएस। *

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

और अब उत्पादन होता है:

आईओएस आउटपुट:

एईएस डेटा: aaaaaaaaaaaaaaaa
C9pEG6g8ge76xt2q9XLbpw ==

+0

अच्छी नौकरी :) हालांकि मुझे लगता है कि आपको "समुदाय विकी" नहीं चुना जाना चाहिए था - आपके अपने सवालों के जवाब देने में कुछ भी गलत नहीं है, और यह उत्तर निश्चित रूप से कई लोगों से बेहतर है। आपको इससे प्रतिष्ठा प्राप्त करनी चाहिए। ;) – sarnold

+0

विकी स्थिति हटा दी गई। सामुदायिक विकी उपयोगी होता है जब आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता का एक बड़ा समूह कुछ संपादित कर सकता है, जैसे समय के साथ बदलने के लिए एक बहुत ही आम प्रश्न के कैननिकल उत्तर के रूप में। अपने स्वयं के प्रश्न का उत्तर देने में कुछ भी गलत नहीं है, वास्तव में, इसे प्रोत्साहित किया जाता है। –

संबंधित मुद्दे