提问人:hobrin 提问时间:6/15/2023 最后编辑:hobrin 更新时间:6/16/2023 访问量:69
这是否安全:使用 SHA256 的加密算法
Is this Secure: Encryption Algorithm using SHA256
问:
我正在尝试创建一种加密算法,该算法使用 SHA256 生成它应该对数据进行异型或处理的流。 我想知道以下代码提供了一种安全的加密算法。
以下算法用于加密和解密。
def crypt(content: bytes, key) -> bytes:
out = []
for i in range(0, len(content), 32):
hasher = hashlib.sha256()
hasher.update(key)
hasher.update(b"FME&$#^01 is some tasty salt.")
hasher.update(str(i).decode())
block = content[i:i+32]
digest = hasher.digest()
for d in range(len(block)):
out.append(block[d] ^ digest[d])
return bytes(out)
编辑:不是;我忘了用当前位置更新哈希值,这会使 XOR 重复,如果您知道前 32 个字节,则可以解密整个字符串。我修复了代码。
答:
0赞
Frank Yellin
6/15/2023
#1
不,这是非常不安全的。
的值每次通过循环时都会具有完全相同的值。您正在使用相同的 32 个字节重复对内容进行异构。您已经创建了一个 Vigenere 密码,该密码很容易被破解。digest
您可以通过添加到哈希器的输入来使密码更安全。你需要一些东西来以不可预测的方式改变每一轮的摘要值。str(i).encode()
我不是一个足够好的密码学家,无法向你保证这个新版本是安全的。但打破并非易事。
更新。我需要补充两件重要的事情。
首先,只有每次都使用不同的密钥,您的算法才是安全的。如果与同一用户进行多次通信,则每次都必须重新协商会话密钥。您的程序正在生成一次性键盘,重复使用一次性键盘是致命的。或者,在每条消息前面预置一个 32 字节的随机 IV,并将该 IV 用作密钥的一部分。这会强制每个会话生成不同的流。
其次,我假设你正在玩耍并玩得开心。在任何情况下,都不应将其用于实际的生产代码。Stack Overflow 上的随机人员找不到它的问题这一事实毫无价值。公共加密算法已经过安全专业人员的审查。
评论
0赞
hobrin
6/15/2023
谢谢!我在你写这篇文章时编辑了这篇文章;因为我意识到我忘了这样做!但我很高兴我至少在某种程度上是安全的。
0赞
Frank Yellin
6/15/2023
只是确保您意识到返回,而不是.这很好。只要确保这是你想要的。从 AES 等内容构建流密码更为常见。因此,您的前 32 个字节将使用 encrypt(key, '00000001') 进行异或处理,接下来的 32 个字节将使用 encrypt(key, '000000002') 进行异或处理,依此类推。bytes(4)
b'\x00\x00\x00\x00'
b'4'
0赞
hobrin
6/15/2023
你是对的。再次感谢您确保它能够在这个宇宙的生命周期内加密东西。尽管它仍然可能是安全的。
0赞
Frank Yellin
6/16/2023
请阅读我的更新。
-1赞
HuffYuv
6/15/2023
#2
SHA256 不是加密。看起来您正在使用它作为密钥的一部分,但没有指定您正在使用的加密算法是问题的一部分。
评论
1赞
hobrin
6/15/2023
这是我自己的加密算法,使用 SHA256
0赞
Frank Yellin
6/15/2023
从理论上讲,加密函数和哈希函数之间存在着密切的联系。它们都声称具有输出不提供任何有关输入的信息的功能。
评论