让我们假设我们生成非常大的(例如128或256位)数字作为分组密码的密钥.
让我们进一步假设我们戴着锡箔帽(至少在外面时).
如此偏执,我们希望确定我们的可用熵,但我们并不完全信任任何特定的来源.也许政府正在操纵我们的硬币.也许这些骰子是如此微妙的加权.如果硬件中断输入/dev/random
只是有点过于一致怎么办?(除了偏执,我们很懒,我们不想手工制作它......)
所以,让我们把它们混合起来.
这样做的安全方法是什么?据推测,只是从每个源连接几个字节并不完全安全 - 如果其中一个源有偏差,理论上它可能适用于诸如相关密钥攻击之类的事情.
在连接的字节上运行SHA-256是否足够?
(是的,在某个时候我很快就会拿起一本密码学工程.:))
我想在Windows上生成随机加密密钥.我在哪里可以获得熵?
我希望我的熵函数在没有网络连接的情况下工作,并且在Windows 2000及更高版本上可靠.即使是可能提供或不提供少量熵的来源也可能是有用的,因为所有来源都将汇集在一起.
这是我最初的功能列表:
GetCurrentProcessID, GetCurrentThreadID, GetTickCount, GetLocalTime, QueryPerformanceCounter, GlobalMemoryStatus, GetDiskFreeSpace, GetComputerName, GetUserName, GetCursorPos, GetMessageTime, GetSystemInfo, CryptGenRandom, GetProcessHandleCount, GetProcessMemoryInfo.
为什么Shannon的熵测量用于决策树分支?
熵(S)= - p(+)log(p(+)) - p( - )log(p( - ))
我知道这是衡量否定的标准.编码信息所需的比特数; 分布越均匀,熵越多.但我不明白为什么它经常应用于创建决策树(选择一个分支点).
encoding machine-learning entropy information-theory decision-tree
我正在做一个小型扑克计划,我想确定一个牌组的洗牌程度.我有一张带有52张牌的List然后我运行我的洗牌算法,我希望能够确定牌组在某种程度上的洗牌程度.有人知道怎么做吗?谢谢
编辑:哇.很多回复.一切都很好但不完全是我想要的.这是我没有进一步指出我的问题的错.但我认为Saran最接近我真正想要的.我来说明一下.
我不想马上进行"完美"的洗牌.我已经读完了,我实施了Fisher-Yates.那个人很擅长"完美"的洗牌.我想要做的是模拟一个真实世界的情况,朋友们正在玩德州扑克,经销商拿着套牌并使用混合其他洗牌的浅滩洗牌来洗牌.最后,我想要的是一种衡量现实世界洗牌之间差异的方法.
一个例子.假设牌组总是新鲜的(对于所有四件套装来说,王牌适合王牌,然后是王牌王牌.)乔拿着甲板,做了2次浅口洗牌,其中一次切入.彼得做了5次剥离洗牌.我想找到一种方法,看看哪一个改组"更好".
我越想它越多,我认为它很难确定.
再次感谢.
编辑23.10.2013
这是我想出的方法,将Sarans的想法与我的想法结合起来:
public int checkShuffle(List<Card> cardDeckToCheck,int[] previousOrder)
{
// Higher is worse? Sure.
int score = 0;
for (int i = 0; i < cardDeckToCheck.Count; i++)
{
Card cardToCheck = cardDeckToCheck[i];
Card cardToLeft = null;
Card cardToRight = null;
// Should cost more since the card has not moved at all.
// For this I need an array that shows me the arangement of the deck before shuffling.
if(cardToCheck.index == previousOrder[i])
{
score += …
Run Code Online (Sandbox Code Playgroud) 我一直使用UUIDString作为存储在我的iPAD上的文件的加密密钥,但第三方在我的应用程序上完成的安全审查提示如下.
随着应用程序的启动,生成全局数据库密钥并将其存储在密钥链中.在生成期间,使用由iOS提供的类NSUUID的方法UUIDString.此函数生成由字母A到F,数字和连字符组成的随机字符串,并且不必要地限制密钥空间,从而导致熵减弱.由于密钥仅由应用程序逻辑使用,并且不必由个人读取,理解或处理,因此不需要将密钥空间限制为可读字符.因此,SecRandomCopyBytes
应使用via ()生成的随机256位密钥作为主密钥.
现在我已经搜索了很多并尝试了一些代码实现,但还没找到确切的东西.我尝试过的:
NSMutableData* data = [NSMutableData dataWithLength:32];
int result = SecRandomCopyBytes(kSecRandomDefault, 32, data.mutableBytes);
NSLog(@"Description %d",result);
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该给我一个整数,我应该将它转换为NSString并使用它作为我的键,但我很确定这不是这里所需要的,并且上述方法总是将结果给出为0.我完全迷失在这里,任何帮助表示赞赏.
谢谢.
我正在看麻省理工学院的一个演示文稿,他们解释了不同类型的ASLR实现.
例如,他们指出对于静态ASLR,堆栈具有19位的熵.根据我的理解,这意味着堆栈基地址只能随机化以获取2 ^ 19个不同的值.
我想问一下如何计算堆栈有19位的熵?
编辑:
在线检查后,我在Linux上找到了堆栈ASLR的一些解释.从另一个问题中学习,我认为可能相关的代码是:
#ifndef STACK_RND_MASK
#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
#endif
static unsigned long randomize_stack_top(unsigned long stack_top)
{
unsigned int random_variable = 0;
if ((current->flags & PF_RANDOMIZE) &&
!(current->personality & ADDR_NO_RANDOMIZE)) {
random_variable = get_random_int() & STACK_RND_MASK;
random_variable <<= PAGE_SHIFT;
}
#ifdef CONFIG_STACK_GROWSUP
return PAGE_ALIGN(stack_top) + random_variable;
#else
return PAGE_ALIGN(stack_top) - random_variable;
#endif
}
Run Code Online (Sandbox Code Playgroud)
我想问一下这是否适合推理我的问题?
我有一个直方图的例子:
mu1 = 10, sigma1 = 10
s1 = np.random.normal(mu1, sigma1, 100000)
Run Code Online (Sandbox Code Playgroud)
并计算
hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True)
for i in hist1[0]:
ent = -sum(i * log(abs(i)))
print (ent)
Run Code Online (Sandbox Code Playgroud)
现在我想从给定的直方图数组中找到熵,但由于np.histogram返回两个数组,我在计算熵方面遇到了麻烦.我怎样才能调用第一个np.histogram数组并计算熵?即使上面的代码是正确的,我也会得到熵的数学域错误.:(
**编辑:当Mu = 0时如何找到熵?和log(0)产生数学域错误?
所以我想写的实际代码是:
mu1, sigma1 = 0, 1
mu2, sigma2 = 10, 1
s1 = np.random.normal(mu1, sigma1, 100000)
s2 = np.random.normal(mu2, sigma2, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -(data1*np.log(np.abs(data1))).sum()
hist2 = np.histogram(s2, bins=100, range=(-20,20), density=True)
data2 = hist2[0]
ent2 = -(data2*np.log(np.abs(data2))).sum()
Run Code Online (Sandbox Code Playgroud)
到目前为止,第一个示例ent1将产生nan,而第二个示例ent2产生数学域错误:(
我知道 KL 不是一个指标,也不能被视为一个指标。但是,是否可以使用 KL 来衡量一幅图像与另一幅图像的差异?我试图从中得出一种直觉。提前感谢所有回复。
我在Linux上,它具有地址空间布局随机化.是否有必要在堆栈上声明一个缓冲区,保持未初始化,并将其用于熵,或者我可以只获取堆栈中已有内容的地址,将其转换为整数并且(知道它有点随机到期)解决空间布局随机化问题)使用那个整数来代替熵?
指针方法的优点在于它不会产生编译器警告,因为当您尝试操作时,单位化缓冲区会执行,但在我的测试中,似乎只有地址的低位部分(可能是最后一个或两个字节)会改变从调用到调用.熵缓冲区似乎表现得更糟,通常根本没有任何东西.
我对BQ人员有一个建议:我认为如果有一个内置函数可以返回列的熵,那将非常有用.一列离散的类别或值将相对容易.思考?这已经存在但我找不到了吗?