2013-08-30 543 views
0

我使用此代碼來加密plist文件,但我發現無論關鍵是什麼,通過AES的值不會改變,有人可以幫助我嗎?M2Crypto的AES密鑰

import hashlib 
import os 
import subprocess 
from M2Crypto import EVP 

proj_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../')) 

def encrypt_plist(source_dir, name): 
    source_file = os.path.join(source_dir, name+'.plist') 
    target_file = os.path.join(source_dir, name) 
    hash_file = os.path.join(source_dir, name+'.md5') 
    tmp_file = os.path.join('/tmp', name+'.plist') 
    assert os.path.isfile(source_file) 
    assert not os.path.isfile(tmp_file), 'Cannot create %s which should be removed first' % tmp_file 
    subprocess.check_call(["cp", source_file, tmp_file]) 
    subprocess.check_call(["plutil", '-convert', 'binary1', tmp_file]) 
    cipher = EVP.Cipher(alg='aes_256_cbc', 
       key='\x00System/Library/Frameworks/GameKit.framework/GameK', 
       iv=chr(0)*32, 
       op=1) # 1:encode 0:decode 
    m = hashlib.md5() 
    with open(tmp_file, 'rb') as source: 
     with open(target_file, 'wb') as target: 
      while True: 
       buf = source.read() 
       if not buf: 
        break 
       target.write(cipher.update(buf)) 
       m.update(buf) 
      target.write(cipher.final()) 
    subprocess.check_call(["rm", tmp_file]) 
    content_hash = m.hexdigest().upper() 
    try: 
     with open(hash_file, 'r') as _hash: 
      if _hash.read() == content_hash: 
       return 
    except IOError: 
     pass 
    with open(hash_file, 'w') as _hash: 
     _hash.write(content_hash) 
    print ' ', target_file, 'changed\n\tmd5:', content_hash 
+0

歡迎來到Stackoverflow,熊。請看看你的問題的編輯(謝謝你們)。 –

回答

1

你在這裏所指的鍵可能不是一個文件,但一個字符的字符串:

key='\x00System/Library/Frameworks/GameKit.framework/GameK', 

不幸的是鍵沒有字符串,則定義爲比特,通常由一個固定長度的陣列表示的字節。

某些庫通過不正確地接受任何東西作爲關鍵字而不是拒絕任何不是正確長度的字節數組的東西而使它變得更容易。常用策略是添加零值字節或忽略末尾的任何虛假字節。我認爲你只是改變了上面的字符串的末尾,這是丟棄的部分。

現在,要正確加密任何東西,請製作由隨機字節組成的AES 128,192或256位密鑰並使用它(可能使用十六進制編碼)。然後使用隨機IV(16字節,AES的塊大小)。如果您需要使用祕密字符串或密碼,請使用PBKDF2從密碼中導出密鑰(使用64位隨機鹽和大量迭代)。

+0

bravo!我真的只是刪除字符串的結尾。最後,我使用一個32字節的密鑰來製作AES。在需求方面,另外,我對加密過程一直存在誤解。 –

+0

很高興你能工作,熊林。如果這有助於解決您的原始問題,請不要忘記接受我的回答。 –