我正在尝试编写一个加密文件的基本算法。它取字符串中每个字符的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()但没有帮助,同样的错误
答案 0 :(得分:1)
x
是字符串中的字符,而不是整数。让我来说明一下:
>>> s = list('abcd') >>> for x in s: ... print(x) ... a b c d >>>
您希望x是从0到字符串长度的整数值,如下所示:
>>> for x in range(len(s)): ... print(x) ... 0 1 2 3 >>>
所以,你的函数应该看起来像这样(未经测试):
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 range(len(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
答案 1 :(得分: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__()
答案 2 :(得分:1)
您获得了TypeError
例外,因为x
语句中s[x]=ord(s[x])
的值是s
列表中的一个元素,因此它&# 39; 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范围内的字符都是可打印的,因此您可能希望限制加密转换,如果需要(加密的话)版本可打印)。