通过二进制操作加密字符串

0 投票
1 回答
579 浏览
提问于 2025-04-18 10:44

我遇到了一个关于加密字符串的问题。我现在的做法是用 ord() 函数把每个字母转换成数字,然后再把这些数字转换成二进制代码。接着,我会对这些数字进行反转或者异或操作,比如字母 'A' 的二进制代码是 '0100 0001',经过处理后变成 '1011 1110',再转换回十进制就是 190,然后我用 chr() 把它变回字母。 我发现有些字母转换后根本看不到任何符号。当我尝试把十进制值 157 转换成 ASCII 字符时,得到的是 '\x9d',而不是一个可以识别的 ASCII 值。根据扩展 ASCII 码,它应该给我一个可以用打印函数显示的符号,并且也能打印到文件里。请问有没有办法让 Python 打印出一个可读的符号,这样我就能把它打印出来?现在我无法做到这一点,因为程序不能把它打印成我能看懂的符号,也无法逆向这个过程。

1 个回答

1

在Python中,默认情况下会显示字符串的表示形式,除非你明确地打印它。\x9d 是这个字符的表示方式,如果你打印出来,看到的内容会根据你的终端使用的编码和字体而有所不同。

>>> chr(157)
'\x9d'
>>> print repr(chr(157)) # equivalent to the above
'\x9d'
>>> print chr(157)
� # this appears as a question mark in a diamond shaped box on my system

不过,这并不妨碍你将数据写入文件。

编辑

如果你所说的“扩展ASCII”是指这个字符集 http://en.wikipedia.org/wiki/Code_page_437,那么你应该可以使用

>>> print chr(157).decode('CP437')
¥

这会返回一个适合打印的unicode字符串(前提是你的终端支持这个功能)。

编辑 2

在Python 3.x中情况稍有不同,因为ord返回的是unicode字符串。你需要的是bytes字符串(这相当于Python 2.x中的字符串):

>>> bytes([157]) # this is equivalent to ord(157) in Python 2.x
b'\x9d'
>>> bytes([157]).decode('cp437') # decode this to a unicode str with the desired encoding
'¥'
>>> print(bytes([157]).decode('cp437')) # now it's suitable for printing
¥

确保在将数据写入文件时,写入的是原始的bytes字符串,而不是unicode(可打印的)字符串:

>>> data = bytes([154, 155, 156, 157])
>>> print (data.decode('cp437')) # use decode for printing
Ü¢£¥
>>> with open('output.dat', 'wb') as f:
...     f.write(data) # but not for writing to a file
...
4
>>> with open('output.dat', 'rb') as f:
...     data = f.read()
...     print(data)
...     print(data.decode('cp437'))
...
b'\x9a\x9b\x9c\x9d'
Ü¢£¥

撰写回答