【问题标题】:How to get customized bytes from /dev/urandom?如何从 /dev/urandom 获取自定义字节?
【发布时间】:2023-01-02 16:37:57
【问题描述】:

我正在开发一个在比特币地址中发现部分冲突的程序。 我已经获得了 urandom 的源代码,但不知道从哪里开始。 所以我想从 /dev/urandom 中获取总共长度为 32(包括掩码 0)的随机字节,因为我的程序需要 256 位,但在转换为十六进制时在开头用零掩码。

十六进制输出将是这样的

000000000000000000000000000000000000000000000000000000000000002d4

注意实际十六进制值之前的 0(这就是我所说的掩码),在 python 中,许多库都需要它来获取比特币地址。

我在我的代码中(不是在 random.c 中)尝试了以下内容但无济于事,现在我认为修改 urandom 本身可能更有帮助。

static bool init_rand(void *data, size_t size)
{
unsigned char mask = 0x0000000000000000000000;
FILE *stream = open("/dev/urandom","r");
if(stream= NULL)
return false;
bool ok = (fread(data=(mask<<9) + data,9,size,stream) == size);
fclose(stream);
return ok;
}

这会产生编译和分段错误,我无法减轻这种错误,因为我不是 C 程序员。

有关完整代码,请参阅 GitHub 上的 Pairgen。

是否可以修改 Linux 内核驱动程序中的 random.c 以生成已经用 0 屏蔽的字节?

【问题讨论】:

  • 你认为 unsigned char 有多大?
  • 使困惑。你说你想要“长度为 32 的随机字节”,但是给出一个 65 个半字节长的样本......你是说 32.5 个随机字节吗? (如果你任意改变它们,那将不再是随机的。)
  • @fe203 我想要总共长度为 32 的字节(24 个零和 8 个随机)
  • 对不起,0s 是否以字节为单位

标签: c random byte bitcoin puzzle


【解决方案1】:

您将印刷表示(“十六进制输出”)与实际值混淆了。

0x2d4 和 0x0000000000000000000000000000000000000000000000000000000000000002d4 是完全相同的值。

“0x2d4”和“0x000000000000000000000000000000000000000000000000000000000000002d4”是两个截然不同的字符串。

如果你想格式化一个字符串——使用格式化操作(比如sprintf)。

【讨论】:

  • 十六进制是 4 位,意味着 2d4 是 12 位,它是 1.5 字节。所以我编辑了问题,因为我需要输出等于 32 个字节,包括屏蔽 (0s),8 个字节,不屏蔽 0,但我希望 urandom 为我屏蔽它
  • @diviserbyzero hex is 4 bits - 这是什么意思? Hex 表示 base 16,它与位无关。如果您需要 32 位随机值 - 读取 32 位。 “面具”对你来说意味着什么?
  • 开头为零,这就是我所说的掩码
  • @diviserbyzero 开头是什么?你想把它打印出来吗?
  • 抱歉,我没有尝试打印任何内容,但我需要读取从 /dev/random 自定义的字节
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多