V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nowheretoseek
V2EX  ›  问与答

自定义词表的 base64 编码容易被解码吗?

  •  
  •   nowheretoseek · 2021-08-17 15:14:50 +08:00 · 2487 次点击
    这是一个创建于 976 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到过前段时间关于 base64 编码 /加密的讨论,想知道如果自定义字表后 base64encode (不用"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),而解密的人没有此字表,那么是不是不容易解密 /破解。 并且如果自定义字符表不明文出现在程序源码中,是不是会极大增加破解的难度?

    21 条回复    2021-08-18 14:43:39 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2021-08-17 15:30:19 +08:00
    这种替换式密码是几十年前的了吧,
    放现在也就专门防外行的,一眼看不出来就没办法了的那种,
    这还不如直接替换不要 base64, 你这 base64 一下多了些规律,更好破解了,
    lakehylia
        2
    lakehylia  
       2021-08-17 15:35:28 +08:00   ❤️ 1
    要加密就上 AES 这种真加密算法。你这个做法太小儿科,破解字表不要太简单。。。
    Rever1e
        3
    Rever1e  
       2021-08-17 15:36:26 +08:00
    如果编码的内容是 非连贯的 无字面意义 的内容 还可以
    这种代换密码通常可以通过 句子中字母出现概率,常用单词出现的字母顺序等 逆推你的密码表
    blackshow
        4
    blackshow  
       2021-08-17 15:37:29 +08:00   ❤️ 1
    Base64 不是加密算法,替换式密码是几百年前的东西了
    noe132
        5
    noe132  
       2021-08-17 15:40:43 +08:00 via Android
    打乱映射顺序是之前战时常用的一种加密方式,通常用一本书做密钥查询字典,在密文前用页数+字数确定密钥的起始位置。只要书不泄漏基本不可能还原原文。
    现代密码学后你直接用 aes 就行了,有现成的工具,实现一样的效果。
    polaa
        6
    polaa  
       2021-08-17 15:53:17 +08:00
    当时学密码学 第一节课说的就是 不要自己设计加密算法
    sujin190
        7
    sujin190  
       2021-08-17 16:05:17 +08:00
    其实这中固定字符替换的问题是,人工编写的文章有差不多固定字频,非人工文章比如 http 协议、图片这样的有固定格式,也就是在固定位置会出现特定字符,只要收集的数据相对多,通过这些信息就可以反向推断出你用的码表,和自定义字符出不出现都没啥关系,除非你发送全部乱码无意义数据,但是这样的数据你发送了又有啥用

    aes 这样的算法不可以这样反向推算密钥是因为,使用密钥加密的过程中前一块加密结果会影响后一块的加密结果,所以无法用上面方法反向推算密钥来解密全部数据,所以还是那句话这么多数学家辛辛苦苦为你设计好了严谨科学的加密验证算法不用,好好的自己设计啥加密算法啊
    ipwx
        8
    ipwx  
       2021-08-17 16:07:02 +08:00   ❤️ 1
    和普通密码的字频攻击一样的处理方法。

    1 、统计普通文本 base64 以后的字频。
    2 、根据你这修改版 base64 的字频来探测可能的匹配
    3 、验证解码结果。
    ipwx
        9
    ipwx  
       2021-08-17 16:09:28 +08:00
    p.s. 第三步甚至可以通过预训练一个 language model 然后把你的解密结果丢进去看似然。把似然最高的比如 20 组 base64 加密方法给你挑出来。
    ipwx
        10
    ipwx  
       2021-08-17 16:09:51 +08:00
    p.s.2 比如这个,是给凯撒密码自动解密的:

    https://quipqiup.com/
    pabupa
        11
    pabupa  
       2021-08-17 16:19:11 +08:00
    简单的映射如果数据量多的话,就很容易破解。
    nowheretoseek
        12
    nowheretoseek  
    OP
       2021-08-17 16:31:53 +08:00
    @nowheretoseek @AoEiuV020 @lakehylia @Rever1e @blackshow @noe132 @polaa @sujin190 @ipwx 谢谢各位,学习了,之前对替换是密码和从字频入手破解有些了解,也了解了 base64 大致原理,但还是感觉破解起来有点难度,所以小范围用过,没想到竟这么脆弱,并且有现成工具。
    Rever1e
        13
    Rever1e  
       2021-08-17 16:38:52 +08:00
    gzdeflate() php 的压缩编码函数

    <?php
    $compressed = gzdeflate('Compress me', 9);
    echo $compressed;
    ?>

    具体压缩方式 http://www.faqs.org/rfcs/rfc1951.html
    mxT52CRuqR6o5
        14
    mxT52CRuqR6o5  
       2021-08-17 16:41:57 +08:00 via Android
    固定映射,你觉得凯撒密码安不安全
    nowheretoseek
        15
    nowheretoseek  
    OP
       2021-08-17 16:51:40 +08:00
    @Rever1e 搞错了,12 楼的不是 custom table 的,没必要尝试了,代码写太久了给自己看糊涂了……
    nowheretoseek
        16
    nowheretoseek  
    OP
       2021-08-17 16:52:56 +08:00
    管理员大大,求删 12 楼或仅保留第一行,谢谢!
    @Livid @Kai @Olivia @GordianZ @sparanoid @Girlphobia
    GordianZ
        17
    GordianZ  
    MOD
       2021-08-17 17:56:27 +08:00   ❤️ 1
    yolee599
        18
    yolee599  
       2021-08-17 20:56:27 +08:00 via Android
    这不就是凯撒密码吗?直接根据字母使用频率可以推出来
    wdssmq
        19
    wdssmq  
       2021-08-18 11:04:21 +08:00   ❤️ 1
    原文——base64
    中文——汉语拼音

    甚至都不用专门重新制定一套拼音,台湾的注音符号`ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ`这楼里能有几个人懂?

    然而 汉语拼音 或 注音符号 是为了加密么?

    ~~其实你直接把 base64 踢出「加密」这个范畴都没问题。~~

    下边是 lz-string.js 这个库的两个函数针对同一输入的「加密」结果,严格来说这个库的主要用途也不是加密而是压缩;

    // LZString.compress(str)
    ` ᮂ悦Ǫ鵞᐀`

    ↑ 这个不仅人不可读,因为特殊字符的关系复制出来就已经损坏了;

    // LZString.compressToBase64(str)
    `G4JgpgHqnV4UA===`

    ↑ 二次处理成 base64,保证存储和传输过程不会损失信息;
    wdssmq
        20
    wdssmq  
       2021-08-18 11:47:32 +08:00   ❤️ 1
    @wdssmq #19

    补充结论:

    base64 存在的主要意义并不是为了保证不被破解,而是为了保证接受方使用「正确的方法」就一定能拿到原始内容;

    在这个前提下,任何基于 base64 的改造升级都是没有意义的,要安全没安全,还不通用;

    就像 v 站留微信都是用 base64,就是在解码的便利性上和防范采集的折中,要提高安全性已经有很多现成算法可以选,也可以用脚本实现自动化,然而让所有用户都先装上这个脚本就很不现实。
    nowheretoseek
        21
    nowheretoseek  
    OP
       2021-08-18 14:43:39 +08:00
    @wdssmq 二进制因为包含一些 ASCII 范围内的控制字符或不可见字符,不便显示,也会在复制过程中损坏,并且某些传输协议对二进制不够友好(协议内使用了某些字符的组合作为控制字符使用等等)。base64 现在的主要作用是避免了这些问题,代价是增加了 1/3 的体积。这样理解对吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2673 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:01 · PVG 10:01 · LAX 19:01 · JFK 22:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.