【问题标题】:Random long long generator C++ [closed]随机长长生成器 C++ [关闭]
【发布时间】:2012-12-04 17:53:48
【问题描述】:

生成具有密码强度С++的随机long long的解决方案是什么? (允许升压)

【问题讨论】:

  • 为什么不升压? - 它可以帮助我们了解您的限制是什么
  • 在linux上你可以从/dev/random读取sizeof(long long)字节。
  • 你可以随机复制 boost headers
  • 部署平台上不需要boost,只需要在构建机上即可。
  • @Roman:这是一个适合答案的小问题,没关系。不好的是从根本上改变问题,所以没有其他(cmets/answers)有意义。

标签: c++ random int64


【解决方案1】:

<random> 标头提供对随机数工具的可移植访问,包括可能的加密 pRNG。

#include <random>     // random_device, uniform_int_distribution
#include <algorithm>  // generate_n
#include <iterator>   // ostream_iterator
#include <iostream>   // cout
#include <functional> // bind, ref

int main() {
    std::random_device r;
    std::uniform_int_distribution<long long> dist;

    std::generate_n(std::ostream_iterator<long long>(std::cout, "\n"), 10,
        std::bind(dist,std::ref(r)));
}

std::random_device 可能不是所有实现的加密 pRNG,因此您必须检查您的实现文档。特别是 2012 年之前的 VC++ 不提供非确定性实现。 VC++ 2012 及更高版本使用 Windows 加密服务实现了这一点。

Linux 或 Mac OS X 等其他操作系统上的实现通常可以使用“/dev/urandom”或“/dev/random”或通过文件系统公开的任何其他随机设备。例如。 libc++ 默认使用“/dev/urandom”,在 OS X 上使用 Yarrow 算法。

我知道你排除了 boost,但 boost::random_device 有一个使用该平台加密服务的 Windows 实现。

【讨论】:

  • +1 用于使用 std 但又指向 boost(我不明白为什么人们默认没有 boost 设置)
  • @gvd:许多公司不喜欢将开源代码放到构建机器上。
【解决方案2】:

在linux下你可以从/dev/random/dev/urandom读取

它们都提供加密熵。

它们之间的区别是:/dev/random 如果熵耗尽则阻塞,因此它可能比/dev/urandom 慢但“更强”

所以,使用流它看起来像这样

long long n;
std::ifstream rstream ("/dev/random");
rstream >> n;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2012-01-26
    • 2012-05-16
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多