将一些C函数转换为Python

时间:2013-02-14 01:19:16

标签: python c linux encryption

我需要将C中的这个函数转换为Python:

void myencrypt(char password[],int mkey)
{
    unsigned int i;
    for(i=0;i<strlen(password);++i)
    {
    password[i] = password[i] - mkey;
    }
}

我试试这个,但失败了......

def myencrypt(password, mkey):

    i = 0
    newpass = []

    for i in range(len(password)):
        newpass[i] = ord(password[i]) - mkey;

    return newpass

任何帮助?

3 个答案:

答案 0 :(得分:2)

在Python中,如果列表足够长,则只能分配给列表中的索引,否则会出现IndexError。请尝试以下方法:

def myencrypt(password, mkey):
    i = 0
    newpass = []
    for i in range(len(password)):
        newpass.append(ord(password[i]) - mkey)
    return newpass

通过使用newpass.append(),您只需将每个新元素添加到列表的末尾。作为旁注,您可以直接迭代password的元素,这更简洁:

def myencrypt(password, mkey):
    newpass = []
    for x in password:
        newpass.append(ord(x) - mkey)
    return newpass

答案 1 :(得分:2)

C代码正在修改password。所以,最接近的等价物是:

def myencrypt(password, mkey):
    for i in range(len(password)):
        password[i] = chr(ord(password[i]) - mkey)

假设passwordlist个字符,而不是字符串。

另外,请注意我在每个chr的结果上调用ord(password[i]) - mkey,因为否则您要用数字替换每个字符 - 例如,myencrypt(['a'], 32)会给你[65]代替['A']。 (这在C中不是必需的,因为65'A'在C中是相同的值。)

您更有可能想要使用字符串调用此函数,并返回一个字符串。你可以仍然使用C风格的就地功能来做,只需转换并转换回来:

def myencrypt(password, mkey):
    newpass = list(password)
    for i in range(len(newpass)):
        newpass[i] = chr(ord(newpass[i]) - mkey)
    return ''.join(newpass)

然而,这不是一种非常恐怖的做事方式。一个更惯用的解决方案是:

def myencrypt(password, mkey):
    return ''.join(chr(ord(ch) - mkey) for ch in password)

这提出了一个更普遍的观点:除非在非常微不足道的情况下,试图直接“将C代码转换为Python”是一个坏主意。相反,弄清楚C代码的作用,编写新的Python代码,以最好的方式完成相同的任务,而不是像C代码那样。

答案 2 :(得分:1)

首先,我不会在此功能中使用“加密”一词。在现代Python中,您可以使用可变的bytearray对象。然后转换为字符串。

def myobfuscate(password, mkey):
    a = bytearray(password)
    for i, c in enumerate(password):
        a[i] = ord(c) - mkey
    return str(a)


myobfuscate("secret", 10)
# OUT: 'i[Yh[j'

在Python中,字符串是不可变的,它们不能就地替换。所以你会使用这样的函数:

pw = myobfuscate(pw, 10)

假设您不再需要原始值。这将使用函数返回的新对象替换原始引用。