0

我使用此代码加密 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
4

1 回答 1

1

您在这里指的密钥可能不是文件,而是字符串:

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

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

一些库通过错误地接受任何作为键而不是拒绝任何不是正确长度的字节数组的东西来使其“更容易”。常见的策略是在末尾添加零值字节或忽略任何虚假字节。我想您只是更改了上面字符串的结尾,无论如何,这是被丢弃的部分。

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

于 2013-08-31T00:23:04.693 回答