M2Crypto的AES密钥

时间:2013-08-30 07:49:39

标签: python aes encryption

我使用此代码加密plist文件,但我发现密钥是什么,通过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

1 个答案:

答案 0 :(得分:1)

您在此处引用的密钥可能不是文件而是字符串:

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

不幸的是,键不是字符串,它们被定义为位,通常由固定长度的字节数组表示。

有些库通过错误地接受任何内容作为键而不是拒绝任何不是正确长度的字节数组的任何内容使其“更容易”。常见的策略是添加零值字节或忽略最后的任何虚假字节。我认为你只是改变了上面的字符串的结尾,这是被丢弃的部分。

现在,要正确加密任何内容,请生成由随机字节组成的AES 128,192或256位密钥并使用它(可能以十六进制编码)。然后使用随机IV(16字节,AES的块大小)。如果您需要使用秘密字符串或密码,请使用PBKDF2从密码中获取密钥(使用64位随机盐和大量迭代)。