0

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

4

4 回答 4

13

随机性来自不同级别的“强度”;您可以获得真正的随机位或随机位。真正的随机位从现实世界的来源中获得熵。随机位产生看似随机但实际上是可预测的位序列。

在生成密钥时,您应该始终使用指定为具有加密强度的随机生成器。这些随机位生成器经过精心设计,真正不可预测。永远不要使用较弱的随机源来生成密钥。

在 C# 中,您可以通过创建一个恰当命名的随机数生成器加密服务提供程序的实例,然后调用GetBytes来获取所需长度的随机字节数组。

不用说:生成自己的加密密钥时要非常小心。密码学就​​是利用密钥的安全性来保证消息的安全性。如果您对如何生成、存储和传输密钥不是很小心,那么安全系统就会受到威胁。如果您自己不是专家,请考虑聘请密码学专家,而不是尝试推出自己的加密代码。

我还注意到,根据您的应用程序,100 位可能太小或太大。它可能太小了,因为您的算法可能容易受到如此小的密钥大小的攻击,并且它可能太大,因为某些国家/地区限制使用或出口具有过多位数的加密软件。考虑咨询律师。

于 2012-04-04T22:56:27.527 回答
2

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

如果您需要比这更强大的保证,那么如果您的平台具有该功能,您仍然可以使用std::random_devicewhich<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 的低分辨率)

于 2012-04-04T23:00:37.347 回答
-2

真正的随机数不能由确定性过程生成,因此语言的选择在某种意义上并不重要。既然您说“密钥”,您可能正在寻找加密密钥,而通过确定性过程生成这些密钥确实非常危险,并且会导致许多系统中断。

我会重新考虑整个事情——如果你自己生成加密密钥,你绝对应该重新考虑整个事情。业余爱好者,无论编程多么熟练,都不应该编写密码代码。这导致了比我数不清的更多系统错误。

于 2012-04-04T22:51:16.773 回答
-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;
}
于 2012-04-04T22:51:20.940 回答