rijndael:用C和Python加密/解密相同的数据

2024-10-01 17:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找出如何将加密/解密从现有的C函数镜像到python。然而,在我用C加密和python解密的测试中,我无法找出密钥周围的一些元素。在

这些都是在线的代码示例,所以我在Python中对base64调用进行了注释,现在我不确定:

1)如果我正确确定了键位到键大小/块大小设置。

2)如何在python中从password获取密钥,以匹配C代码。

3)我是否遗漏了任何核心转换步骤?

rijndael.h中的C:

#define KEYLENGTH(keybits) ((keybits)/8)
#define RKLENGTH(keybits)  ((keybits)/8+28)
#define NROUNDS(keybits)   ((keybits)/32+6)

用C加密

^{pr2}$

在Python中解密

KEY_SIZE = 32
BLOCK_SIZE = 16

def decrypt(password, filename):

    #
    # I KNOW THIS IS WRONG, BUT HOW DO I CONVERT THE PASSWD TO KEY?
    #
    key = password

    padded_key = key.ljust(KEY_SIZE, '\0')

    #ciphertext = base64.b64decode(encoded)
    ciphertext = file_get_contents(filename);

    r = rijndael(padded_key, BLOCK_SIZE)

    padded_text = ''
    for start in range(0, len(ciphertext), BLOCK_SIZE):
        padded_text += r.decrypt(ciphertext[start:start+BLOCK_SIZE])

    plaintext = padded_text.split('\x00', 1)[0]

    return plaintext

谢谢!在


Tags: key代码textsize密钥passwordblockstart
1条回答
网友
1楼 · 发布于 2024-10-01 17:34:43

示例C代码只将password字符串中的32个字节复制到键中。如果密钥小于32字节,则在右侧用零填充。 翻译成python,它将是:

key = password[:32]+b'\x00'*(32-len(password))

实际上产生的结果与

^{pr2}$

但是,您应该注意到,这种生成密钥的方法被认为是extremely unsafe。如果攻击者怀疑密钥由0字节填充的ASCII字符组成,则密钥空间(可能的密钥数量)将大大减少。如果密钥由随机字节组成,则有256^32=1.15e77个密钥。如果键以8个ASCII字符开头,后跟0,则只有(127-32)^8=6.63e15个可能的键。而且,由于有dictionaries和经常使用的密码,攻击者可能不必用尽这个减少的密钥空间;他会首先尝试相对较小的字典。在

考虑使用cryptographic hash function或其他合适的key derivation function将密码短语转换为密钥。在

尝试使用pycrypto工具箱。它实现了Rijndael/AES and other ciphers。在

相关问题 更多 >

    热门问题