gpt4 book ai didi

c# - 可以从其输出预测 Random.Next()

转载 作者:行者123 更新时间:2023-11-30 20:34:32 26 4
gpt4 key购买 nike

拥有这个(简化的)C# 类:

public static class RandomValue
{
private static readonly Random s_random = new Random();

public static int GetRandomValue()
{
lock (s_random)
{
return s_random.Next();
}
}
}

是否可以通过查看此方法生成的值来预测 GetRandomValue() 的下一个值?

假设(为了这个问题):

  • 攻击者不知道(当然)知道种子。
  • 攻击者可以观察到无限数量的 GetRandomValue() 后续结果。

我问这个问题是因为我看到一些代码使用类似的方法来生成某种访问 token 。这段代码不是我写的,我可能会使用 .NET 的加密随机类之一。我只是好奇这是否仍然足够安全。

最佳答案

根据 kennytm 的评论,我创建了一个关于如何“打破”Random 的概念证明。它的边缘可能有点粗糙,但它表明您只需要 55 个值来预测下一个值(以及之后的每个值)。

以下代码首先从单个 Random 实例中读取 55 个值,然后预测接下来的 10 个值:

public class Program
{
static void Main(string[] args)
{
const int INTERNAL_ARRAY_SIZE = 56;
const int INEXTP_START = 21;

var internalArray = new int[INTERNAL_ARRAY_SIZE];

var random = new Random();

// Read 56 values.
for (int x = 0; x < INTERNAL_ARRAY_SIZE - 1; x++)
{
internalArray[x + 1] = random.Next();
}

int inext = INTERNAL_ARRAY_SIZE - 1;
int inextp = INEXTP_START;

// Predict the next 10 values.
for (int x = 0; x < 10; x++)
{
int predictedRandomValue = PredictNextRandomValue(internalArray, ref inext, ref inextp);
int officialRandomValue = random.Next();

if (officialRandomValue == predictedRandomValue)
{
Console.WriteLine("Yes, they're the same.");
}
else
{
Console.WriteLine("No, they're different.");
}
}
}

private static int PredictNextRandomValue(int[] seedArray, ref int inext, ref int inextp)
{
const int MBIG = int.MaxValue;

int retVal;
int locINext = inext;
int locINextp = inextp;

if (++locINext >= 56) locINext = 1;
if (++locINextp >= 56) locINextp = 1;

retVal = seedArray[locINext] - seedArray[locINextp];

if (retVal == MBIG) retVal--;
if (retVal < 0) retVal += MBIG;

seedArray[locINext] = retVal;

inext = locINext;
inextp = locINextp;

return retVal;
}
}

关于c# - 可以从其输出预测 Random.Next(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39093911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com