[英]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.