您收到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 范围内的字符都是可打印的,因此如果需要(加密版本可打印),您可能希望进一步限制加密转换。