看到过前段时间关于 base64 编码 /加密的讨论,想知道如果自定义字表后 base64encode (不用"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),而解密的人没有此字表,那么是不是不容易解密 /破解。 并且如果自定义字符表不明文出现在程序源码中,是不是会极大增加破解的难度?
1
AoEiuV020 2021-08-17 15:30:19 +08:00
这种替换式密码是几十年前的了吧,
放现在也就专门防外行的,一眼看不出来就没办法了的那种, 这还不如直接替换不要 base64, 你这 base64 一下多了些规律,更好破解了, |
2
lakehylia 2021-08-17 15:35:28 +08:00 1
要加密就上 AES 这种真加密算法。你这个做法太小儿科,破解字表不要太简单。。。
|
3
Rever1e 2021-08-17 15:36:26 +08:00
如果编码的内容是 非连贯的 无字面意义 的内容 还可以
这种代换密码通常可以通过 句子中字母出现概率,常用单词出现的字母顺序等 逆推你的密码表 |
4
blackshow 2021-08-17 15:37:29 +08:00 1
Base64 不是加密算法,替换式密码是几百年前的东西了
|
5
noe132 2021-08-17 15:40:43 +08:00 via Android
打乱映射顺序是之前战时常用的一种加密方式,通常用一本书做密钥查询字典,在密文前用页数+字数确定密钥的起始位置。只要书不泄漏基本不可能还原原文。
现代密码学后你直接用 aes 就行了,有现成的工具,实现一样的效果。 |
6
polaa 2021-08-17 15:53:17 +08:00
当时学密码学 第一节课说的就是 不要自己设计加密算法
|
7
sujin190 2021-08-17 16:05:17 +08:00
其实这中固定字符替换的问题是,人工编写的文章有差不多固定字频,非人工文章比如 http 协议、图片这样的有固定格式,也就是在固定位置会出现特定字符,只要收集的数据相对多,通过这些信息就可以反向推断出你用的码表,和自定义字符出不出现都没啥关系,除非你发送全部乱码无意义数据,但是这样的数据你发送了又有啥用
aes 这样的算法不可以这样反向推算密钥是因为,使用密钥加密的过程中前一块加密结果会影响后一块的加密结果,所以无法用上面方法反向推算密钥来解密全部数据,所以还是那句话这么多数学家辛辛苦苦为你设计好了严谨科学的加密验证算法不用,好好的自己设计啥加密算法啊 |
8
ipwx 2021-08-17 16:07:02 +08:00 1
和普通密码的字频攻击一样的处理方法。
1 、统计普通文本 base64 以后的字频。 2 、根据你这修改版 base64 的字频来探测可能的匹配 3 、验证解码结果。 |
9
ipwx 2021-08-17 16:09:28 +08:00
p.s. 第三步甚至可以通过预训练一个 language model 然后把你的解密结果丢进去看似然。把似然最高的比如 20 组 base64 加密方法给你挑出来。
|
10
ipwx 2021-08-17 16:09:51 +08:00
|
11
pabupa 2021-08-17 16:19:11 +08:00
简单的映射如果数据量多的话,就很容易破解。
|
12
nowheretoseek OP |
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 |
14
mxT52CRuqR6o5 2021-08-17 16:41:57 +08:00 via Android
固定映射,你觉得凯撒密码安不安全
|
15
nowheretoseek OP @Rever1e 搞错了,12 楼的不是 custom table 的,没必要尝试了,代码写太久了给自己看糊涂了……
|
16
nowheretoseek OP |
17
GordianZ MOD @nowheretoseek done.
|
18
yolee599 2021-08-17 20:56:27 +08:00 via Android
这不就是凯撒密码吗?直接根据字母使用频率可以推出来
|
19
wdssmq 2021-08-18 11:04:21 +08:00 1
原文——base64
中文——汉语拼音 甚至都不用专门重新制定一套拼音,台湾的注音符号`ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ`这楼里能有几个人懂? 然而 汉语拼音 或 注音符号 是为了加密么? ~~其实你直接把 base64 踢出「加密」这个范畴都没问题。~~ 下边是 lz-string.js 这个库的两个函数针对同一输入的「加密」结果,严格来说这个库的主要用途也不是加密而是压缩; // LZString.compress(str) ` ᮂ悦Ǫ鵞᐀` ↑ 这个不仅人不可读,因为特殊字符的关系复制出来就已经损坏了; // LZString.compressToBase64(str) `G4JgpgHqnV4UA===` ↑ 二次处理成 base64,保证存储和传输过程不会损失信息; |
20
wdssmq 2021-08-18 11:47:32 +08:00 1
@wdssmq #19
补充结论: base64 存在的主要意义并不是为了保证不被破解,而是为了保证接受方使用「正确的方法」就一定能拿到原始内容; 在这个前提下,任何基于 base64 的改造升级都是没有意义的,要安全没安全,还不通用; 就像 v 站留微信都是用 base64,就是在解码的便利性上和防范采集的折中,要提高安全性已经有很多现成算法可以选,也可以用脚本实现自动化,然而让所有用户都先装上这个脚本就很不现实。 |
21
nowheretoseek OP @wdssmq 二进制因为包含一些 ASCII 范围内的控制字符或不可见字符,不便显示,也会在复制过程中损坏,并且某些传输协议对二进制不够友好(协议内使用了某些字符的组合作为控制字符使用等等)。base64 现在的主要作用是避免了这些问题,代价是增加了 1/3 的体积。这样理解对吧?
|