问题描述
我想使用加密安全的库从正态分布中采样,然后将结果添加到TensorFlow张量。我听说python内置的random
库不是一个选择。
tf.random.normal
的密码安全吗?如果不是,知道有什么用吗?
解决方法
不。它们和tf.random
中的其他方法都使用Philox和ThreeFry算法,尽管它们基于加密算法,但它们并没有主张加密安全性。正如介绍这些算法的论文所述:
任何加密块密码的修改将使其不适合其在安全方面的预期用途,但是PRNG设计在保持[统计质量]的同时以加密强度为代价进行交换是合理的。
(Salmon等人,“并行随机数:像1,2,3一样简单”,2011年。)
,正如彼得所言//GET: File
public JsonResult FileIndex()
{
List<byte> fileList = new List<byte>();
using (FileDBEntities db = new FileDBEntities())
{
fileList = db.tblFiles.ToList();
foreach(var itemFile in fileList) {
fileList.add(File.ReadAllBytes(itemFile));
}
}
return new JsonResult { Data = fileList,JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
不是CSPRNG。因此,我将回答您“您知道有什么可行的方法吗?”问题,而不是标题中一直否定的问题。
Python的tensorflow.random.normal
模块可以提供对操作系统CSPRNG的访问,例如getrandom(2)
在Linux和* BSD下。这是通过SystemRandom
类发生的,该类又使用os.urandom
调用来访问主机的random
系统调用(或Windows下的CryptGenRandom
)。
要将其中的高斯变量转化为getrandom
,您需要执行以下操作:
tensorflow
为您提供形状为import random
import tensorflow as tf
rng = random.SystemRandom()
tf.convert_to_tensor([rng.gauss(0,1) for _ in range(10)])
的{{1}}。