[加密算法] 有没有可以 ‘限制密文长度’ 且 ‘可逆’ 加密算法?

2019-01-29 16:07:24 +08:00
 lqzhgood
steam 账号丢了~ 我估摸着是撞库。
用 算法 代替 密码 的想法由来已久了,是时候行动了。

大致想法如下:
域名 /用户名等----------算法--------->密码----------- [秘钥 + 加密算法] ---------> 密文

虽然通过算法生成后的密码已经足够好了(至少不会被撞库),但是还是想一步到位。再用一个加密算法加固下。

因为准备再写一个 Chrome 扩展来解决密文生成的问题,所以准备用 js 现实,看了下 node 的库 cryptojs。
但是 AES 4 位秘钥 10 位密码 生成的密文 高达 44 位。。。。
一般密码填写仅允许 16 位。

实在对密码学不了解。。。。

在这里求一个
4~6 位秘钥 + 10 位左右文本 生成的密文长度能在 ‘ 16 位’ 以内的 ‘可逆’ 加密算法。。。
10988 次点击
所在节点    程序员
68 条回复
hearfish
2019-01-30 00:21:31 +08:00
Aes128, 每个 block 是 128 bit 也就是 16 bytes, 你的密码才 10 位,理论上没问题啊, 只是实际操作上密文可能是诸如 0x10 之类的字符,再转义成可打印的字符就超过 16 位了
fakeshadow
2019-01-30 00:54:37 +08:00
我一般是用 bip39,自己的短密码只用来加密产生的私钥
enjoyCoding
2019-01-30 01:18:55 +08:00
就不能好好申请嘛 搞这搞着都忘记玩游戏了喂
dommyet
2019-01-30 01:41:43 +08:00
openssl rand -base64 16
weyou
2019-01-30 02:35:02 +08:00
如果存在这个算法,那它最大的价值不是加密领域,而是数据压缩领域。
leavic
2019-01-30 06:10:20 +08:00
你这个想法基本等同于靠一个 md5 逆推出一个 iso 镜像
billwsy
2019-01-30 06:20:32 +08:00
@codeklaus 我觉得 28#是正解,密钥再扩展一下就能对付任何长度了。。只是,这个算法随随便便就可以被破解,几乎抵挡不住任何 threat model
lqzhgood
2019-01-30 08:56:19 +08:00
@weyou
@leavic
请审题~ 我没想让 16 位的密码装下整个世界。
16 位密码 装不下 10 位文本+4 位秘钥?

前面已经有人提到了。置换加密就能满足。
strongcoder
2019-01-30 09:16:37 +08:00
1Password 可以帮你
yahon
2019-01-30 09:46:28 +08:00
弄个密码表 再加上一些错位混淆算法 这样就能加密解密了
bumz
2019-01-30 10:22:52 +08:00
对抗人眼的话
古典密码学的方法都可以
替换,比如 ROT13,或者和一组只有你知道的固定的随机数做异或
或者置换都能满足你的需求

其实 base64 (编码,非加密)都能骗过人眼(逃
harde
2019-01-30 10:31:25 +08:00
用 1Password 等密码管理软件才是正道。
每个站点密码不一样,谁爱撞,谁撞去。
lcatt
2019-01-30 10:37:47 +08:00
域名+用户名+固定字符 就很好了,一般忘记密码才是最大的挑战,除了支付及绑定邮箱几个密码外都可以用,防撞库就行,没那么多“有心人”。如果真需要防人眼就再做个异或其他混淆就行。
hanru
2019-01-30 10:43:59 +08:00
与其造一个千疮百孔的破轮子,为什么不使用现成的、漏洞不那么多的密码管理软件?

为什么?
liuzhaowei55
2019-01-30 11:00:54 +08:00
恩尼格玛密码机,可以符合你的要求,不过他只支持字母,且不区分大小写。
https://zh.wikipedia.org/wiki/%E6%81%A9%E5%B0%BC%E6%A0%BC%E7%8E%9B%E5%AF%86%E7%A0%81%E6%9C%BA
恩尼格玛密码机的一个实现,需要 flash,超级精美,建议大家都看下。
http://enigmaco.de/enigma/enigma.html
woostundy
2019-01-30 11:07:40 +08:00
学密码学一定要先学信息论呀,单从你这个标题来看,是反信息论基础的
woostundy
2019-01-30 11:10:07 +08:00
你这思路是映射,而不是可逆加密。
Yanni0507
2019-01-30 11:19:17 +08:00
Abstract:楼主可以用 RC4 或者 RSA 算法来实现。但是它们都对原文有要求,只包含数字和字母的话原文最多 16 个字符,包含扩展 ASCII 表中的特殊字符的话,原文最多 12 个字符。

不管是 AES 还是 RSA 加密出来的直接结果都是 byte[],它们按照通用的规则完全转换成可显示字符的时候都是有 bit 位扩充的。
比如按照十六进制显示,一个 byte 需要两个字符,
按照 Base64 编码,3 个 byte 需要 4 个字符,
ASCII 和扩展 ASCII 里面又有太多的不可显示字符。
那么楼主要求密文最多 16 个字符 -> 加密结果最多 12 个字符 -> 原文最多 96bit。
如果能保证原文符合 Base64 要求(大小写字母,数字,‘/’,‘=’),那原文长度最大 16 个字符。
否则最好的情况是按照扩展 ASCII 码表,原文最大长度 12 个字符。
我知道的符合要求的算法还有:RC4,RSA,都不是分组加密算法,原文长度比较随意。具体怎么实现楼主可以放狗搜一下
yikyo
2019-01-30 11:26:36 +08:00
不可逆,网上有开源实现,https://github.com/tmthrgd/mpw-js
yikyo
2019-01-30 11:28:34 +08:00
补上一句,算法公开,但是加密种子是由用户自定义的。

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

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

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

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

© 2021 V2EX