我正在尝试使用 MYSQL 方法来使用值为“symmetry_encryption.php”的密钥来加密字符串(仅作为示例)。然而输出是其他密码无法理解的垃圾。我尝试了一切,但无论如何它都会产生相同的垃圾。它可以解密这些垃圾,但如果没有其他工具可以做到同样的事情,那还有什么意义呢?
select HEX(DES_ENCRYPT('test12345','symmetric_encryption.php'));
输出为 FFDAF66D7309B91B9DC5CBC25F7514AFC4,而应为 e52099eb5e0f81e8bd24315f3a80ac7c
(在这里查看示例https://www.tools4noobs.com/online_tools/encrypt/)
select TO_BASE64(DES_ENCRYPT('test12345','symmetric_encryption.php'));
输出 /9r2bXMJuRudxcvCX3UUr8Q= 时应为 5SCZ614Pgei9JDFfOoCsfA==
有很多在线工具可以验证 TripleDES 加密的结果。
MYSQL 输出不一致。 MYSQL 产生的结果无法用任何其他加密工具解密,只能用 mysql 本身解密。
我设置了块大小
SET block_encryption_mode = 'aes-128-ecb';
什么是不必要的,因为它是默认的并且我的编码都是UTF8
这是死胡同还是有解决办法?
这就是 MySQL 在使用
DES_ENCRYPT
加密某些内容时所做的事情:
EVP_BytesToKey
通过一次迭代和 MD5 根据给定密码生成的EVP_BytesToKey
与密钥一起生成的初始化向量被清零,因此它本质上是 0x0000000000000000 IVDES_ENCRYPT
时才有意义;可以安全地忽略它。如果你想亲自查看,代码位于root/sql/item_strfunc.cc。 Here 是该文件中有趣的部分。不用说,这不是一个很好的加密方式。
按照@Artjom B.的大纲,我能够使用以下代码(python 3.12)解密MySQL“垃圾”。
from hashlib import md5
from Crypto.Cipher import DES3
class MySQLDES:
def __init__(self, password):
passbytes = password.encode()
key = md5(passbytes).digest() # 16 bytes
key += md5(key + passbytes).digest() # extend to 32 bytes
key = DES3.adjust_key_parity(key[:24]) # take first 24
self.cipher = DES3.new(
key,
DES3.MODE_CBC,
iv=bytes.fromhex('00') * 8)
def decrypt(self, hexstr):
cipherbytes = bytes.fromhex(hexstr)
clearbytes = self.cipher.decrypt(cipherbytes[1:])
clearbytes = clearbytes[:-clearbytes[-1]]
return clearbytes.decode()
用途:
des = MySQLDES('<password>')
des.decrypt('<hex string starting with FF>')