Python中的 SHA3
加密散列函数是一类特殊的散列函数,它具有使其适用于密码学的某些特性。它是一种数值算法,将自断大小的信息映射到固定大小的一条线(散列函数),它同样是一个单向输出函数,即一个不可还原的函数。
哈希库模块
为了在Python中计算加密哈希值,使用了“hashlib”模块。 hashlib提供以下加密散列函数来发现文本的散列输出,如下所示:
- sha3_224 – 28 位摘要大小
- sha3_256 – 32 位摘要大小
- sha3_384 – 48 位摘要大小
- sha3_512 – 64 位摘要大小
该模块实现了各种安全散列和消息摘要计算的典型接口。包括 FIPS 安全哈希计算 SHA1、SHA224、SHA256、SHA384 和 SHA512,就像 RSA 的 MD5 计算(在 Internet RFC 1321 中表征)一样。早期的计算被称为消息摘要,但今天它是安全哈希。
Python通过库模块hashlib为哈希码计算提供了大量帮助。您可以利用“hashlib.algorithms_available”来获取Python变体中所有可访问哈希计算的概要。
Hashlib 提供以下常量属性:
- “hashlib.algorithms_guaranteed”——一个包含所有散列算法的集合,这些算法保证在所有平台上都得到这个模块的支持。
- “hashlib.algorithms_available” – 包含当前在解释器中可用的所有散列算法名称的集合。
Python3
import hashlib
print(hashlib.algorithms_guaranteed)
print(hashlib.algorithms_available)
Python3
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initiating the "s" object to use the
# sha3_224 algorithm from the hashlib module.
s = hashlib.sha3_224()
# will output the name of the hashing algorithm currently in use.
print(s.name)
# will output the Digest-Size of the hashing algorithm being used.
print(s.digest_size)
# providing the input to the hashing algorithm.
s.update(b"GeeksforGeeks")
print(s.hexdigest())
Python3
# import the library module
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initialize a string
str = "GeeksforGeeks"
# encode the string
encoded_str = str.encode()
# create sha3-256 hash objects
obj_sha3_256 = hashlib.sha3_256(encoded_str)
# print in hexadecimal
print("\nSHA3-256 Hash: ", obj_sha3_256.hexdigest())
Python3
# import the library module
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initialize a string
str = "GeeksforGeeks"
# encode the string
encoded_str = str.encode()
# create sha3-384 hash objects
obj_sha3_384 = hashlib.sha3_384(encoded_str)
# print in hexadecimal
print("\nSHA3-384 Hash: ", obj_sha3_384.hexdigest())
Python3
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
str = "GeeksforGeeks"
# create a sha3 hash object
hash_sha3_512 = hashlib.new("sha3_512", str.encode())
print("\nSHA3-512 Hash: ", hash_sha3_512.hexdigest())
输出 :
{‘blake2b’, ‘shake_256’, ‘sha512’, ‘sha3_224’, ‘sha384’, ‘sha3_512’, ‘sha3_256’, ‘sha3_384’, ‘md5’, ‘sha256’, ‘sha224’, ‘sha1’, ‘blake2s’, ‘shake_128’}
{‘SHA512’, ‘md5’, ‘blake2s’, ‘sha512’, ‘DSA-SHA’, ‘whirlpool’, ‘sha224’, ‘sha3_256’, ‘DSA’, ‘blake2b’, ‘MD5’, ‘SHA256’, ‘ecdsa-with-SHA1’, ‘dsaWithSHA’, ‘sha384’, ‘md4’, ‘sha3_384’, ‘MD4’, ‘sha3_512’, ‘sha256’, ‘RIPEMD160’, ‘ripemd160’, ‘shake_256’, ‘SHA’, ‘sha3_224’, ‘dsaEncryption’, ‘SHA224’, ‘sha’, ‘SHA1’, ‘sha1’, ‘shake_128’, ‘SHA384’}
常量属性
- hash.digest_size:后续散列的大小(以字节为单位)。
- hash.block_size:哈希计算的内部平方大小,以字节为单位。
- hash.name :此哈希的认可名称,始终为小写,并且始终适合作为 new() 的边界以创建另一个此类哈希。
hashlib 中的方法
- hash.update(data):用类似字节的对象更新哈希对象。
- hash.digest():返回到 update() 方法中的信息的浓缩到现在为止。这是一个大小为 digest_size 的字节对象,可以包含从 0 到 255 的字节数。
- hash.hexdigest():像digest()一样,除了摘要之外,还作为两倍长度的字符串对象返回,只包含十六进制数字。
- hash.copy():返回哈希对象的副本(“克隆”)。这可用于有效地计算共享典型起始子串的信息的概述。
SHAKE可变长度摘要
- shake.digest(length):返回传递给 update()函数的信息的浓缩。这是一个字节对象,其大小可能包含从 0 到 255 的整个范围内的字节。
- shake.hexdigest(length):除了缩合之外,与overview() 一样,作为双倍长度的字符串对象返回,只包含十六进制数字。
SHA – 简要
安全散列算法是由美国国家标准与技术研究院 (NIST) 提出的一组加密散列函数,包括:
- SHA-0:应用于 1993 年以“SHA”名称生成的 160 位哈希函数的第一种形式的词。由于未公开的“值得注意的瑕疵”,它在生产后不久就被撤回,并被稍微大修的变体 SHA-1 取而代之。
- SHA-1:一个 160 位的哈希函数,看起来像之前的 MD5。这是由国家安全局 (NSA) 计划的,对于数字签名算法至关重要。在 SHA-1 中发现了密码学上的缺陷,而该标准并未在 2010 年之后的大多数密码学用途中得到认可。
- SHA-2:一组两个比较哈希函数,具有不同的块大小,称为SHA-256和SHA-512,它们在字大小上形成对比; SHA-256 使用的是 32 字节字,而 SHA-512 是 64 字节字。
- SHA-3:一个散列函数,过去称为Keccak ,在非 NSA 发起者之间公开竞争后于 2012 年被选中。它支持与 SHA-2 类似的哈希长度,其内部结构与 SHA 系列的其余部分完全不同。
SHA-3 实施
Secure Hash Algorithm-3 也称为 Keccak,是一种单向方法,用于根据标准从任意大小的输入信息中创建给定长度的计算机打印件,如 224、256、384 或 512 件,由一群创建者推动创建Yoan Dimen 于 2008 年,并于 2015 年作为新的 FIPS 标准接受。该计算通过混合容量和压缩到选定大小的“密码海绵”的方法进行。
例子:
Input: HelloWorld
Output[sha3_224]: c4797897c58a0640df9c4e9a8f30570364d9ed8450c78ed155278ac0
Input: HelloWorld
Output[sha3_256]: 92dad9443e4dd6d70a7f11872101ebff87e21798e4fbb26fa4bf590eb440e71b
Input: HelloWorld
Output[sha3_384]: dc6104dc2caff3ce2ccecbc927463fc3241c8531901449f1b1f4787394c9b3aa55a9e201d0bb0b1b7d7f8892bc127216
Input: HelloWorld
Output[sha3_512]: 938315ec7b0e0bcac648ae6f732f67e00f9c6caa3991627953434a0769b0bbb15474a429177013ed8a7e48990887d1e19533687ed2183fd2b6054c2e8828ca1c
以下程序显示了使用不同方法在Python-3.8 中实现 SHA-3 哈希: 使用sha3_224的实现 更新方法
蟒蛇3
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initiating the "s" object to use the
# sha3_224 algorithm from the hashlib module.
s = hashlib.sha3_224()
# will output the name of the hashing algorithm currently in use.
print(s.name)
# will output the Digest-Size of the hashing algorithm being used.
print(s.digest_size)
# providing the input to the hashing algorithm.
s.update(b"GeeksforGeeks")
print(s.hexdigest())
sha3_224
28
11c044e8080ed87b3cf0643bc5880a38ae62dd4562390700000b1191
使用encode方法实现sha3_256
蟒蛇3
# import the library module
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initialize a string
str = "GeeksforGeeks"
# encode the string
encoded_str = str.encode()
# create sha3-256 hash objects
obj_sha3_256 = hashlib.sha3_256(encoded_str)
# print in hexadecimal
print("\nSHA3-256 Hash: ", obj_sha3_256.hexdigest())
输出:
SHA3-256 Hash: b05a48e99c60983b96b5a69efad8bb44e586702d484d43e592ab639ef64641ff
sha3_384的实现
蟒蛇3
# import the library module
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
# initialize a string
str = "GeeksforGeeks"
# encode the string
encoded_str = str.encode()
# create sha3-384 hash objects
obj_sha3_384 = hashlib.sha3_384(encoded_str)
# print in hexadecimal
print("\nSHA3-384 Hash: ", obj_sha3_384.hexdigest())
输出:
SHA3-384 Hash: b92ecaaafd00472daa6d619b68010b5f66da7c090e32bd4f5a6b60899e8de3e2c859792ec07a33775cfca8d05c64f222
sha3_512的实现使用 新方法
蟒蛇3
import sys
import hashlib
if sys.version_info < (3, 6):
import sha3
str = "GeeksforGeeks"
# create a sha3 hash object
hash_sha3_512 = hashlib.new("sha3_512", str.encode())
print("\nSHA3-512 Hash: ", hash_sha3_512.hexdigest())
输出:
SHA3-512 Hash: 3706a96a8fa96b3fc5ff30cbca36ce666042e2d07762022a78a2ec82439848fc3695e83336ab71f47dddbc24b96454df2a437e343801a4e13faab89e8d0fda61
哈希算法的应用:
- 信息摘要
- 密码验证
- 数据结构(编程语言)
- 编译操作
- Rabin-Karp 算法
- 将文件名和路径链接在一起