0

所以我已经完成了这段代码(这只是将字符串转换为十六进制的部分),当我尝试解密时,我收到这条消息:找到非十六进制数字

这是字符串到十六进制代码:

def password (pslen):
  alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+}{:|?><,./;'\[]"
  pw_length = pslen
  mypw = ""
  for i in range(pw_length):
    next_index = random.randrange(len(alphabet))
    mypw = mypw + alphabet[next_index]
  print ("Password: ",mypw) 
  parolaBin = bin(int.from_bytes(mypw.encode(), 'big'))
  parolaHex = hex(int(parolaBin, 2))
  return parolaHex

这里是字符串代码的十六进制

pw = binascii.unhexlify(pw)

程序从文件中读取 pw。

该程序要大得多,但这是让我陷入困境并且无法正常工作的部分。

我用来将字符串转换为十六进制的方法有效,但十六进制到字符串却没有。

有人能帮助我吗?

4

1 回答 1

4

您正在使用以下hex()函数将整数转换为十六进制:

parolaHex = hex(int(parolaBin, 2))

这包括一个0x前缀,它不是十六进制值。这就是binascii.unhexlify()抱怨的原因:

>>> import binascii
>>> binascii.unhexlify('0xff')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: Non-hexadecimal digit found
>>> binascii.unhexlify('ff')
b'\xff'

只需删除该前缀,或者首先不要生成它,format(integer, 'x')而是使用:

parolaHex = format(int(parolaBin, 2), 'x')

您以十六进制生成随机密码的方法......太冗长了。您可以只生成随机的十六进制数字:

import string

return ''.join([random.choice(string.hexdigits) for _ in range(pwlen)])

并以更少的工作获得相同的结果。无论如何,首先将整数转换为二进制符号,然后将其转换整数:

parolaBin = bin(int.from_bytes(mypw.encode(), 'big'))
parolaHex = hex(int(parolaBin, 2))

当然,除了让你的 CPU 在晚上保持温暖外,别无他法。您本可以直接使用十六进制:

parolaHex = format(int.from_bytes(mypw.encode(), 'big'), 'x')
于 2016-12-14T17:24:31.030 回答