繁体   English   中英

如何为 X509Certificate2 序列号生成一个 20 字节的十六进制值数组?

[英]How to generate a 20 byte array of hex values for an X509Certificate2 serial number?

我需要为自签名的 X509Certificate 生成一个序列号。 序列号必须是 20 字节的正 integer

我有一种方法可以生成给定长度的随机字节数组,但是我无法使用它生成 20 字节的十六进制值数组。

        public static byte[] GenerateRandomByteArray(int Length)
        {
            char[] availableCharacters = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

            var identifier = new char[Length];
            var randomData = new byte[Length];
            var key = new byte[Length];

            using (var rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(randomData);
            }

            for (var i = 0; i < identifier.Length; i++)
            {
                var pos = randomData[i] % availableCharacters.Length;
                identifier[i] = availableCharacters[pos];
                key[i] = Convert.ToByte(identifier[i]);
            }
            return key;
        }

使用这种方法,我得到序列号,它们是字节十进制值的ToString()表示。

    [0]: 65 'A'
    [1]: 54 '6'
    [2]: 48 '0'
    [3]: 69 'E'
    [4]: 53 '5'
    [5]: 50 '2'
    [6]: 50 '2'
    [7]: 56 '8'
    [8]: 52 '4'
    [9]: 56 '8'
    [10]: 51 '3'
    [11]: 57 '9'
    [12]: 51 '3'
    [13]: 66 'B'
    [14]: 48 '0'
    [15]: 55 '7'
    [16]: 67 'C'
    [17]: 65 'A'
    [18]: 57 '9'
    [19]: 57 '9'

变成41 36 30 45 35 32 32 38 34 38 33 39 33 42 30 37 43 41 39 39

如何生成序列号是十六进制值的ToString?

不要使用System.Random 在评论中,您使用了Random class 来生成序列号的随机部分。 Random class 的问题在于它是伪 RNG,并且对于给定的种子返回相同的随机序列。

正如 Dmitry Bychenko 在评论中指出的那样,您误解了要求。 您可以为序列号中的每个八位字节使用完整的 0-255 字节值空间。 有限的字符表( [0-9A-F] )只是字节值的十六进制表示。 因此,您的解决方案被简化为:

public static byte[] GenerateRandomByteArray(int Length)
{
    var randomData = new byte[Length];
    using (var rng = RandomNumberGenerator.Create())
    {
        rng.GetBytes(randomData);
    }

    return randomData;
}

RNGCryptoServiceProvider现在已过时,建议使用RandomNumberGenerator工厂方法来创建适当的 RNG 实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM