生成随机比特序列

时间:2012-04-04 22:49:33

标签: c# java c++ c random

我正在尝试生成一个包含给定长度的绝对随机密钥的文件,让我们说100位并将它们存储在一个文件中。什么是最好的方法,哪种语言提供最好的图书馆?提前谢谢。

4 个答案:

答案 0 :(得分:13)

随机性来自不同层次的"力量&#34 ;;您可以获得真正的随机位或随机位。真正的随机比特从实际来源获得它们的熵。 随机位产生一个出现随机的位序列,但实际上是可预测的。

生成密钥时,应始终使用指定为具有加密强度的随机性生成器。这些随机位发生器经过精心设计,确实无法预测。切勿使用较弱的随机源来生成密钥。

在C#中,你可以通过创建一个名为random number generator cryptographic service provider的实例,然后调用GetBytes来获得所需长度的随机字节数组。

毋庸置疑:在生成自己的加密密钥时要非常小心。密码学就​​是利用密钥的安全性来保护消息的安全性;如果您对如何生成,存储和传输密钥不是很谨慎,那么安全系统就会受到损害。如果您不是自己而不是尝试推出自己的加密代码,请考虑聘请密码学专家。

我还注意到,根据您的应用程序,100位可能太小,密钥大小太大或太大。它可能太小,因为您的算法可能容易受到小密钥大小的攻击,并且在一些国家限制使用或导出具有太高位数的加密软件的意义上它可能太大。考虑咨询律师。

答案 1 :(得分:2)

取决于你的意思绝对随机。如果伪随机数生成器是可接受的,那么C ++ <random>库是一个很好的选择。

如果您需要更强的保证,那么您仍然可以使用来自std::random_device的{​​{1}},如果您的平台具有该功能,则<random>会提供非确定性随机数。它甚至可以提供对加密随机数生成器的访问。您必须检查平台的文档。

#include <random>
#include <iostream>

int main() {
    std::random_device r("/dev/random"); // Cryptographically secure RNG on Linux, OpenBSD, OSX, (using libc++)
    unsigned int completely_random_value = r();
    std::cout << completely_random_value << '\n';
}

可能与您有关的一件事是Microsoft的文档中关于它们在VS11中实现random_device的说明:“在此实现中,默认生成的值不是非确定性的。”这是Visual Studio的C ++ 11库的另一个令人遗憾的实现质量问题(至少与他们的chrono :: high_resolution_clock的低分辨率一起)

答案 2 :(得分:-2)

确定性过程无法生成真正的随机数,因此语言的选择在某种意义上并不重要。既然你说“密钥”,你可能正在寻找加密密钥,并且通过确定性过程生成这些密钥确实是非常危险的,并且是造成大量系统中断的原因。

我会重新考虑整个事情 - 如果你自己生成加密密钥,你绝对应该重新思考整个问题。无论编程技巧如何,业余爱好者都不应该编写加密代码。这导致了更多的系统错误。

答案 3 :(得分:-2)

在C / C ++中相对容易,假设你明白没有随机数这样的东西,只有伪随机数:

uint8_t *randomBytes(int length)
{
    uint8_t buffer = malloc(length);

    for (int i = 0; i < length; i++)
    {
        buffer[i] = arc4random_uniform(256); // or similar random function
    }

    return buffer; // don't forget to free buffer when done!
}

在Java中,您将返回一个字节数组,如下所示:

byte[] randomBytes(int length)
{
    Random rand = new Random();
    byte[] buffer = new byte[length];

    for (int i = 0; i < length; i++)
    { 
        buffer[i] = (byte) rand.nextInt(256);
    }

    return buffer;
}

在C#中,它与Java大致相同,但有一些区别:

byte[] randomBytes(int length)
{
    Random rand = new Random();
    byte[] buffer = new byte[length];

    for (int i = 0; i < length; i++)
    { 
        buffer[i] = (byte) rand.Next(256);
    }

    return buffer;
}