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

2021-08-17 15:14:50 +08:00
 nowheretoseek

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

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

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

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

https://quipqiup.com/
pabupa
2021-08-17 16:19:11 +08:00
简单的映射如果数据量多的话,就很容易破解。
nowheretoseek
2021-08-17 16:31:53 +08:00
@nowheretoseek @AoEiuV020 @lakehylia @Rever1e @blackshow @noe132 @polaa @sujin190 @ipwx 谢谢各位,学习了,之前对替换是密码和从字频入手破解有些了解,也了解了 base64 大致原理,但还是感觉破解起来有点难度,所以小范围用过,没想到竟这么脆弱,并且有现成工具。
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
2021-08-17 16:41:57 +08:00
固定映射,你觉得凯撒密码安不安全
nowheretoseek
2021-08-17 16:51:40 +08:00
@Rever1e 搞错了,12 楼的不是 custom table 的,没必要尝试了,代码写太久了给自己看糊涂了……
nowheretoseek
2021-08-17 16:52:56 +08:00
管理员大大,求删 12 楼或仅保留第一行,谢谢!
@Livid @Kai @Olivia @GordianZ @sparanoid @Girlphobia
GordianZ
2021-08-17 17:56:27 +08:00
yolee599
2021-08-17 20:56:27 +08:00
这不就是凯撒密码吗?直接根据字母使用频率可以推出来
wdssmq
2021-08-18 11:04:21 +08:00
原文——base64
中文——汉语拼音

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

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

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

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

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

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

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

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

补充结论:

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

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

就像 v 站留微信都是用 base64,就是在解码的便利性上和防范采集的折中,要提高安全性已经有很多现成算法可以选,也可以用脚本实现自动化,然而让所有用户都先装上这个脚本就很不现实。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX