你可以使用标准 Python 库中的两个内置函数来实现。第一个函数是ord()函数,它接收一个 Unicode 字符串字符作为单个输入参数,并将其转换为相应的 Unicode 代码(一个整数)。下面提供了这个函数的两个简单示例:
>>> ord('a')
97
>>> ord('b')
98
接下来,您还有ord()的反函数:chr()。正如您所想象的那样,它可以完全相反地工作:它以Unicode代码作为输入(整数),并获取相应的Unicode字符(字符串):
>>> chr(97)
'a'
>>> chr(98)
'b'
然后,您可以通过添加或减去一些任意整数来进行简单的加密... 在这种情况下,数字2:
注意:不要使用非常大的值,否则如果达到负数,例如,您将会得到错误。
def encrypt(message):
newS=''
for car in message:
newS=newS+chr(ord(car)+2)
return newS
print(encrypt('hello world'))
得到的结果如下:
jgnnq"yqtnf
现在你可以复制并粘贴相同的函数,生成解密函数。在这种情况下,显然需要减去2:
def decrypt(message):
newS=''
for car in message:
newS=newS+chr(ord(car)-2)
return newS
print(decrypt('jgnnq"yqtnf'))
结果将会是原始消息:
'hello world'
这是一种加密消息以便非程序员阅读的好方法。然而,任何有一点编程知识的人都可以编写一个程序,改变我们使用的整数,直到他们发现我们只是添加了(2)到Unicode字符来加密代码...
为了避免这种情况,我提出了两个更复杂的替代方案。
1. 第一个是最简单的:它包括根据字符的位置应用不同的和值到chr函数上(例如,在字符串中占据偶数位置时将每个Unicode代码加2,在奇数位置时减去3)。
2. 第二个将产生最大的安全性。它将包括为每个字符随机生成一个数字来添加或减去每个Unicode代码。它需要存储一个值数组来解密消息。请确保这个值数组不可供第三方使用。
这里是可能的解决方案1:
def encryptHard(message):
newS=''
for i in range(len(message)):
if i%2==0:
newS=newS+chr(ord(message[i])+2)
else:
newS=newS+chr(ord(message[i])-3)
return newS
print(encryptHard('hello world'))
结果会是:
jbniqyltif
根据提供的信息,解密脚本显而易见,所以我不会麻烦你复制、粘贴和更改两个值。
最后,让我们深入分析第二种更复杂的替代方案。通过这种方法,我们可以说加密将几乎无法被破解。其思想是通过介于0和255之间的随机数来变化我们添加或减去到每个Unicode代码的值(这是chr()函数允许的数字范围,因此不要尝试使用其他数字,否则您肯定会出现错误)。
在这种情况下,我的建议还随机化操作(求和或减去),并避免最终数字为0(即我们将得到一个原始字符)。最后,它还返回一个列表,其中包含已减去的数字,这是您需要用来解密消息的。
如果您使用相同长度为n的消息两次调用此函数,则获得相同加密消息的机会接近于255^n...所以不用担心(我说“接近”,因为创建的算法实际上会在值的低端或高端范围内生成更多重复值,例如,如果最常见的字符未集中在此分布Unicode字符集(从0到255)中,则是这种情况。但是,尽管程序并不完美,但它可以无缝运行并保护信息。
import random as r
def encryptSuperHard(message):
newS=''
l_trans=[]
for car in message:
code=ord(car)
add_subtract=r.choice([True,False])
if add_subtract:
transpose=r.randint(0,code-1)
newS=newS+chr(code-transpose)
l_trans=l_trans+[-transpose]
else:
transpose=r.randint(code+1,255)
newS=newS+chr(code+transpose)
l_trans=l_trans+[transpose]
return newS, l_trans
print(encryptSuperHard('hello world'))
在这种情况下,我制作的这个随机加密脚本返回了一个包含两个值的元组,第一个值是加密后的消息,第二个值是将每个字符按出现顺序"转置"的值。
('A0ŤłY\x10řG;,à', [-39, -53, 248, 214, -22, -16, 226, -40, -55, -64, 124])
在这种情况下解密需要取出加密的消息和列表,然后按照以下步骤进行:
def decryptSuperHard(encriptedS,l):
newS=''
for i in range(len(l)):
newS=newS+chr(ord(encriptedS[i])-l[i])
return newS
print(decryptSuperHard('A0ŤłY\x10řG;,à', [-39,-53,248,214,-22,-16,226,-40,-55,-64,124]))
结果返回到:
你好,世界
print(deccryptSuperHard('A0ŤłY\x10řG;,à', [-39, -53, 248, 214, -22, -16, 226, -40, -55, -64, 124])
pycrypto
进行加密本身,然后使用base64
来获取结果的字符串表示形式。 - John Coleman