需求:通过数十字节的种子生成长度 N 字节的随机数,并且随机性需足够高。运行时库有现成的 AES 算法。
为了偷懒写算法,直接将 N 个 0 的数据通过 AES 加密如何?密钥使用种子前半部分,IV 使用种子后半部分。
1
tuwulin365 121 天前
不怎么样。有不少伪随机数生成算法,比如:梅森旋转( Mersenne Twister/MT )算法。
|
2
GeekGao 121 天前
可行。不过需要确保种子的随机性和安全性
|
3
1423 121 天前
|
4
libook 121 天前 via Android 1
系统都有随机数生成器,对 Linux 来说就是/dev/random 和/dev/urandom
|
5
tool2dx 121 天前 via Android
我个人觉得可行,aes 硬件加速,速度飞快。
https://www.jandrewrogers.com/2019/02/12/fast-perfect-hashing/ |
6
7h3d4wn 121 天前
具有密码学安全性的随机数是要满足足够随机以及不可预知性
为此在 Linux/windows 下有成熟的调用方式 它们都用了模拟量来做种子 不要自己造纯数字量的随机数算法 |
7
churchmice 121 天前 via Android
AES 这种一般是用作随机数生成的后处理算法,可以了解一下
源头还是随机数 |
8
libook 121 天前 via Android
感觉 op 需要的不是伪随机数,而是可以生成看起来摸不清规律的字符串,但同时又可以还原成原文;所以需要的可能是一种编码或一种加密。
如果你可以满足于别人在不知道算法的情况下无法还原,那么就可以用一些编码方案,比如凯撒密码和 base64 (可以叠加多种算法);如果希望在公开算法的情况下依然确保自己能还原原文就用加密方案,如 aes 和 chacha20 。 |
9
henix 121 天前 1
AES 的 CTR 模式,通过加密一个不断增长的计数器来得到一个密钥流( key stream ),我认为这就相当于一个伪随机数生成器 https://zh.wikipedia.org/wiki/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F#%E8%AE%A1%E6%95%B0%E5%99%A8%E6%A8%A1%E5%BC%8F%EF%BC%88CTR%EF%BC%89
|
10
mxT52CRuqR6o5 121 天前 via Android
主要是看你生成随机数的目的
|
11
mengzhuo 121 天前
Go 就是用 3 round AES 来做 hash 的
|
12
dode 121 天前
话说对称加密,在使用密钥加密的时候,有写模式需要一个初始向量,这个向量设置影响安全性吗
|
14
0o0O0o0O0o 121 天前 1
|
15
zzzremake 120 天前
AES (分组密码)本身确实是可以当伪随机排列用,他的安全性是根据密钥长度来保证的,日常使用应该没啥问题,注意一下密钥的生成方式就行,一般来说要特定算法生成而非简单的 random...?
不过公开一部分明文仍要保证安全性...这就不懂了,理论上应该没啥问题,不过需要严谨的安全性证明. |
16
CodeCodeStudy 119 天前
@dode #12 需要初始向量 iv ,是因为某些模式是分组加密,每一组需要前一组的加密结果,那么第一组没有前一组,所以才需要初始向量
|
17
linglingling 119 天前
不什么样,高射炮打蚊子,虽然也行,不合算。
|
18
mengzhuo 119 天前
|
19
rekulas 118 天前
可以用 只是没啥必要, go 本身带了随机数库为啥用 aes 来转一遍,这个强度只取决于你的种子,用了 aes 也不能提高强度反而变慢了
说个题外话,说 aes 的速度快其实是说在对称加密算法上快,跟随机数生成器比起来其实很慢,可以慢几百甚至上千倍 |