在 Python 中生成 1 和 0 序列的 SHA 1 散列的任何方法
Any way to generate SHA 1 hash of a sequence of 1s and 0s in Python
我想生成一个由 1 和 0 组成的随机序列,并将其输入到 Python 中的 SHA1 哈希计算器中。
用于生成哈希的 hashlib 库 (doc link) 在其 update() 函数中接受类似字节的对象作为输入。
我曾尝试使用 random.getrandbits(64) 生成随机序列,但是当我尝试使用 .to_bytes() 将其转换为字节时,它给出了 'utf-8' 编解码器可以'对其进行解码。
代码:
x = random.getrandbits(64)
print(x)
print(format(x, 'b'))
binary_int = int(format(x, 'b'), 2)
# Getting the byte number
byte_number = (binary_int.bit_length() + 7) // 8
# Getting an array of bytes
binary_array = binary_int.to_bytes(byte_number, "big")
# Converting the array into ASCII text
ascii_text = binary_array.decode()
# Getting the ASCII value
print(ascii_text)
错误:
17659976144931976749
1111010100010100110101101011110010111100100010101111011000101101
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/var/folders/9s/msn7k8q55yn6t6br55830hc40000gn/T/ipykernel_33103/157314006.py in <module>
12
13 # Converting the array into ASCII text
---> 14 ascii_text = binary_array.decode()
15
16 # Getting the ASCII value
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf5 in position 0: invalid start byte
我意识到错误意味着生成的随机位序列对于 UTF-8/ASCII 代码无效,但我该如何解决这个问题才能为 SHA1 函数创建有效输入?
我也试过here提到的建议使用“ISO-8859-1”编码:
binary_int = random.getrandbits(64)
# Getting the byte number
byte_number = (binary_int.bit_length() + 7) // 8
# Getting an array of bytes
binary_array = binary_int.to_bytes(byte_number, "big")
# Converting the array into ASCII text
text = binary_array.decode(encoding='ISO-8859-1')
print(text)
print(type(text))
print(len(text))
import sys
print(sys.getsizeof(text.encode('ISO-8859-1')))
print(hash_sha1(text.encode('ISO-8859-1')))
输出:
¦—u¦9}5É
<class 'str'>
8
41
bc25cb6cb34c2b7c73bbba610e0388386c2e70b2
但是 sys.getsizeof() 为 text.encode('ISO-8859-1') 打印 81 字节,而不是应该的 64 位。
在上面的代码中,我尝试了 64 位数据,用于测试目的。但是,最终,我只是想确保我将随机生成的 512 位恒定大小数据输入到 SHA1 生成器中。有什么办法吗,希望可以。谢谢。
编辑:让它工作,感谢 Drakax
的回答
最终代码:
import os, hashlib
k = os.urandom(64)
# print random no.
print(k)
# print it in bit format (64 bits)
for byte in k:
print(f'{byte:0>8b}', end='')
print()
# print the sha1 hash
print(hashlib.sha1(k).hexdigest())
你试过其中之一吗:
1. UUID
import uuid
uuid.uuid4().hex
文档:
http://docs.python.org/2/library/uuid.html
1.1
import uuid
from md5 import md5
print md5(str(uuid.uuid4())).hexdigest()
2. 秘密 (Python 3.6+)
import secrets
secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'
secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'
secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\Ev\x1a|u'
文档:
https://docs.python.org/3/library/secrets.html
3. binascii (python 2.x and 3.x)
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
文档:https://docs.python.org/3/library/binascii.html
4. hashlib
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
文档:https://docs.python.org/3/library/hashlib.html
现在应该够了 ;)
我想生成一个由 1 和 0 组成的随机序列,并将其输入到 Python 中的 SHA1 哈希计算器中。
用于生成哈希的 hashlib 库 (doc link) 在其 update() 函数中接受类似字节的对象作为输入。 我曾尝试使用 random.getrandbits(64) 生成随机序列,但是当我尝试使用 .to_bytes() 将其转换为字节时,它给出了 'utf-8' 编解码器可以'对其进行解码。
代码:
x = random.getrandbits(64)
print(x)
print(format(x, 'b'))
binary_int = int(format(x, 'b'), 2)
# Getting the byte number
byte_number = (binary_int.bit_length() + 7) // 8
# Getting an array of bytes
binary_array = binary_int.to_bytes(byte_number, "big")
# Converting the array into ASCII text
ascii_text = binary_array.decode()
# Getting the ASCII value
print(ascii_text)
错误:
17659976144931976749
1111010100010100110101101011110010111100100010101111011000101101
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/var/folders/9s/msn7k8q55yn6t6br55830hc40000gn/T/ipykernel_33103/157314006.py in <module>
12
13 # Converting the array into ASCII text
---> 14 ascii_text = binary_array.decode()
15
16 # Getting the ASCII value
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf5 in position 0: invalid start byte
我意识到错误意味着生成的随机位序列对于 UTF-8/ASCII 代码无效,但我该如何解决这个问题才能为 SHA1 函数创建有效输入?
我也试过here提到的建议使用“ISO-8859-1”编码:
binary_int = random.getrandbits(64)
# Getting the byte number
byte_number = (binary_int.bit_length() + 7) // 8
# Getting an array of bytes
binary_array = binary_int.to_bytes(byte_number, "big")
# Converting the array into ASCII text
text = binary_array.decode(encoding='ISO-8859-1')
print(text)
print(type(text))
print(len(text))
import sys
print(sys.getsizeof(text.encode('ISO-8859-1')))
print(hash_sha1(text.encode('ISO-8859-1')))
输出:
¦—u¦9}5É
<class 'str'>
8
41
bc25cb6cb34c2b7c73bbba610e0388386c2e70b2
但是 sys.getsizeof() 为 text.encode('ISO-8859-1') 打印 81 字节,而不是应该的 64 位。
在上面的代码中,我尝试了 64 位数据,用于测试目的。但是,最终,我只是想确保我将随机生成的 512 位恒定大小数据输入到 SHA1 生成器中。有什么办法吗,希望可以。谢谢。
编辑:让它工作,感谢 Drakax
的回答最终代码:
import os, hashlib
k = os.urandom(64)
# print random no.
print(k)
# print it in bit format (64 bits)
for byte in k:
print(f'{byte:0>8b}', end='')
print()
# print the sha1 hash
print(hashlib.sha1(k).hexdigest())
你试过其中之一吗:
1. UUID
import uuid
uuid.uuid4().hex
文档: http://docs.python.org/2/library/uuid.html
1.1
import uuid
from md5 import md5
print md5(str(uuid.uuid4())).hexdigest()
2. 秘密 (Python 3.6+)
import secrets
secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'
secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'
secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\Ev\x1a|u'
文档: https://docs.python.org/3/library/secrets.html
3. binascii (python 2.x and 3.x)
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
文档:https://docs.python.org/3/library/binascii.html
4. hashlib
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
文档:https://docs.python.org/3/library/hashlib.html
现在应该够了 ;)