1

我正在尝试编写一个用于加密文件的基本算法。它获取字符串中每个字符的 ASCII 值,并根据密码的长度将其上下移动一个量,然后您可以在顶部放置更多密码。

def encrypt(s):
    lenStr=s.__len__() #used later for working how far the int is moved
    s=list(s) #converts the string to a list
    for x in s:
        s[x]=ord(s[x]) #the same index of the list is = to the value of the string
        s[x]=chr(s[x])#is where it eventualy gets changed back to a str

s=ord(s)是抛出错误的行,我在它周围添加了 int() 但没有帮助,同样的错误

4

3 回答 3

1

x是字符串中的一个字符,而不是整数。让我举例说明:

>>> s = list('abcd')
>>> for x in s:
...打印(x)
...
一个
b
C
d
>>>

您希望 x 是从 0 到字符串长度的整数值,如下所示:

>>> for x in range(len(s)):
...打印(x)
...
0
1
2
3
>>>

所以,你的函数应该看起来像这样(未经测试):

def 加密:
    lenStr=s.__len__() #稍后用于计算 int 移动的距离
    s=list(s) #将字符串转换为列表
    对于范围内的 x (len(s)):
        s[x]=ord(s[x]) #列表相同的索引是=对字符串的值
        s[x]=chr(s[x])#是它最终变回str的地方
于 2013-07-19T14:51:41.023 回答
1

我猜这就是你的目标:

def encrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) + offset) for c in s)

def decrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) - offset) for c in s)

一些技巧:

  • 使用len(s)代替lenStr=s.__len__()
  • 在代码中第一次使用附近的命名值提高了可读性。
  • 选择描述值使用的名称。
  • 字符串是可迭代的,与列表相同。无需将字符串转换为列表。
  • 尽可能学习和使用列表推导和生成器,它们通常更快、更简单、更容易阅读并且更不容易创建错误。
  • 请记住接受和/或赞成有帮助的答案。
于 2013-07-19T15:02:38.047 回答
1

您收到TypeError异常是因为语句中的值x是列表s[x]=ord(s[x])的元素之一s,因此它是传递给的字符串参数中的单个字符encrypt()。要解决这个问题,只需遍历s列表的所有可能索引,这些索引恰好与原始字符串的长度相同:

def encrypt(s):
    lenStr=len(s)
    s=list(s) # convert the string to a list
    for i in range(lenStr):
        s[i]=ord(s[i])
        s[i]=chr(s[i])

这将允许您的代码运行而不会出现该错误。根据您对要实现的加密算法的描述,需要注意的一件事是产生 0-255 范围之外的非法 8 位字符值。您可以通过简单地将 mod 运算符%应用于中间结果以将值保持在适当的范围内来避免该问题。这就是我的意思:

def encrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) + lenStr) % 256)
    return ''.join(s) # convert list back into a string

同样,解密字符串时也必须做同样的事情:

def decrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) - lenStr) % 256)
    return ''.join(s) # convert list back into a string

enc = encrypt('Gnomorian')
print('encrypted:', enc)
dec = decrypt(enc)
print('decrypted:', dec)

输出:

encrypted: Pwxvx{rjw
decrypted: Gnomorian

另请注意,并非所有ord()值在 0-255 范围内的字符都是可打印的,因此如果需要(加密版本可打印),您可能希望进一步限制加密转换。

于 2013-07-19T18:23:16.170 回答