我花了一夜的时间颠倒了Jasypt 1的“基本文本加密器”的实现。该算法在文档中被定义为'PBEWithMD5AndDES‘。
执行情况如下:
secret = password + salt
for i in range(0, 1000):
secret = md5(secret)考虑到这一点,我是否正确地认为实现的总密钥空间是120位(56+64)?
我已经在python中写了一个概念反转的证明,但我想计算一下野蛮使用一个真正的键需要多长时间。到目前为止,我还无法诱导hashcat解密使用这个算法加密的东西,而且我也不确定它是否能解密。
我的问题是:
编辑:为了减少任何混淆,我的解密器如下所示
import base64
import hashlib
from Crypto.Cipher import DES
passphrase = "123456" # Key used to encrypt
# Salt randomly generated at encrypt-time, and stored at
# the beginning of the encrypted data:
salt = base64.b64decode("vqmy2fiCipU=")
enc_b64 = "vqmy2fiCipVBIhiAzDfvTL0301DLgTqd"
enc_data = base64.b64decode(enc_b64)
if (salt != enc_data[0:8]):
raise Exception("Salt does not match enc_data salt")
enc_data = enc_data[8:]
m = hashlib.md5()
m.update(passphrase.encode())
m.update(salt)
result = m.digest()
for i in range(1, 1000):
m = hashlib.md5()
m.update(result)
result = m.digest()
# value of result is: md5("123456" + salt) iterated 1,000 times.
key = result[:8]
iv = result[8:16]
des = DES.new(key, DES.MODE_CBC, iv)
print(des.decrypt(enc_data).decode())
# > Hello World1
发布于 2020-05-01 00:34:28
键空间真的是120位吗?
不是的。它仍然是56位,至少当多个块被加密。对于CBC模式,您可以尝试并解密一个带密钥的块,用前面的密文块对它进行XOR,您应该会得到一个明文块。如果您对最后一个明文块执行此操作,则需要查找PKCS#5填充。如果这是正确的,那么您可以开始查看是否可以生成有效的明文。
如果只有一个块被加密,那么IV就像一个一次性垫。在这种情况下,您将不得不猜测密码(当然,假设您有盐)。
我是不是漏掉了什么东西,还是hashcat没有能力破解它?
有可能。但是,对于一个有成就的程序员来说,编程可能并不难。Hashcat似乎专注于密码哈希本身。假设密码不太复杂,猜测它可能仍然是尝试解密密码文本的最佳方法。
其他工具能破解吗?
当然,破解单个DES可以由专门的硬件完成(列表是这里)。不过,要求获得这样的资源是个不话题。
是否有可能在不对预期输出进行假设的情况下推断出正确的输出(例如所有输出必须是ASCII数据,或匹配文件头)?
嗯,除了填充物,是的,你必须能够测试明文是否在某种程度上是可理解的。但是,如果您解密了许多块,那么明文可能就不会那么随意了,所以您可以对其进行测试。例如,如果它压缩得很好,它可能值得再看一次(但是压缩通常是相当昂贵的)。
https://crypto.stackexchange.com/questions/80368
复制相似问题