CryptGenRandom返回非统一结果

CryptGenRandom返回非统一结果,c,winapi,random,cryptography,C,Winapi,Random,Cryptography,在windows上,我使用C语言中的CryptGenRandomAPI(我认为它相当于Linux上的/dev/random或/dev/urandom)。为了证实这一点,我在Windows上使用这些文件创建了随机文件,并在Linux上从/dev/uradom读取,然后使用 我使用CryptGenRandom生成随机文件时使用的代码示例(最初来自): 结果与此类似: [4101, 4026, 4027, 4074, 4200, 4021, 4121, 4066, 4035, 3972, 4127,

在windows上,我使用C语言中的
CryptGenRandom
API(我认为它相当于Linux上的
/dev/random
/dev/urandom
)。为了证实这一点,我在Windows上使用这些文件创建了随机文件,并在Linux上从
/dev/uradom
读取,然后使用

我使用
CryptGenRandom
生成随机文件时使用的代码示例(最初来自):

结果与此类似:

[4101, 4026, 4027, 4074, 4200, 4021, 4121, 4066, 4035, 3972, 4127, 4010, 
3978, 8214, 4009, 4155, 4083, 4065, 4067, 4064, 3993, 4021, 4136, 4112, 4221, 
4172, 4134, 4117, 3972, 4127, 4175, 4110, 4125, 4181, 4092, 4157, 4122, 4024, 
4020, 4088, 3980, 4140, 4159, 4129, 4064, 4141, 4096, 4238, 4036, 4080, 4151, 
4115, 4086, 4156, 4111, 4106, 4086, 4058, 4179, 4193, 4144, 4206, 4180, 4028, 
4148, 4015, 3979, 4201, 4098, 4146, 4169, 4120, 4044, 4066, 4049, 4051, 4051, 
4122, 4048, 4139, 4125, 4052, 4224, 4091, 4084, 4040, 4183, 4134, 3948, 4132, 
3955, 4162, 4183, 4014, 4100, 4091, 4005, 4146, 4182, 4032, 4037, 3985, 4098, 
4078, 4147, 4060, 4085, 4215, 4039, 4187, 4207, 4161, 4086, 4159, 4018, 4073, 
4051, 4008, 4095, 4110, 4160, 4288, 4077, 4074, 4113, 4104, 4097, 4115, 4049, 
3963, 4083, 4111, 4066, 4084, 4107, 4035, 3977, 4078, 4035, 4008, 3993, 4080, 
4152, 4121, 4111, 4033, 4094, 4191, 4131, 3978, 4082, 4134, 4119, 4135, 4071, 
3993, 3888, 4137, 4188, 4110, 4078, 4186, 4188, 4074, 4196, 4110, 4069, 4135, 
4043, 4150, 4023, 4095, 4074, 4179, 4112, 4084, 4124, 4180, 4154, 3996, 4103, 
4199, 4137, 4155, 4039, 4077, 4159, 4167, 4171, 4115, 4025, 4218, 4046, 4008, 
4178, 3969, 4135, 4077, 4044, 4080, 4085, 4230, 4161, 4151, 4056, 4222, 4033, 
4020, 4187, 4034, 4175, 4167, 3962, 4102, 4054, 3978, 4111, 4001, 4028, 4103, 
4088, 4054, 4049, 4164, 4136, 4110, 4181, 3964, 4098, 4046, 3997, 4151, 4122, 
4272, 4067, 4112, 4037, 4083, 4072, 4106, 4105, 4104, 4166, 4090, 4071, 4080, 
4070, 4087, 4162, 4060, 4237, 4061, 4044, 4128, 4051, 4097]
很明显,13(第14个数字)出现的可能性大约是所有其他数字的两倍,这也可以解释127.05的算术平均数

我不确定是不是一个错误的
CryptGenRandom
或我错误地实现了它,但我已经在64位Windows 10和32位Windows 7计算机上测试过,结果是一致的。那么有人有什么想法或者可以帮助进一步调查和确认吗

FILE*tfile=fopen(“随机文件”,“w”)

您以文本模式打开文件,每个字符大约写入4000次。包括
'\r'
'\n'
字符

每次编写
'\n'
,程序都会插入一个额外的
'\r'
,因此大约有8000个
'\r'
字符的ASCII值为13

在Windows中,对于非文本文件,应以二进制模式打开文件

FILE*tfile=fopen(“随机文件”,“w”)

您以文本模式打开文件,每个字符大约写入4000次。包括
'\r'
'\n'
字符

每次编写
'\n'
,程序都会插入一个额外的
'\r'
,因此大约有8000个
'\r'
字符的ASCII值为13


在Windows中,对于非文本文件,您应该以二进制模式打开文件。

它可以工作,谢谢。但我仍然很好奇为什么这个问题不会在Linux上发生。我使用了相同的测试脚本(带有
“w”
,作为
fopen
的模式)。是因为Linux对待
“w”
“wb”
相同,还是因为Linux只使用
LF
而Windows使用
CRLF
呢?是的,这是Windows特有的问题。在其他平台上,没有进行隐藏转换,因此二进制模式和文本模式之间没有区别。请看,它也可以工作,谢谢。但我仍然很好奇为什么这个问题不会在Linux上发生。我使用了相同的测试脚本(带有
“w”
,作为
fopen
的模式)。是因为Linux对待
“w”
“wb”
相同,还是因为Linux只使用
LF
而Windows使用
CRLF
呢?是的,这是Windows特有的问题。在其他平台上,没有进行隐藏转换,因此二进制模式和文本模式之间没有区别。另见
f = open("random_file", "rb")
a = f.read()
f.close()

tmp = [0 for _ in range(256)]

for x in a:
    tmp[int(x)] += 1

print(tmp)
[4101, 4026, 4027, 4074, 4200, 4021, 4121, 4066, 4035, 3972, 4127, 4010, 
3978, 8214, 4009, 4155, 4083, 4065, 4067, 4064, 3993, 4021, 4136, 4112, 4221, 
4172, 4134, 4117, 3972, 4127, 4175, 4110, 4125, 4181, 4092, 4157, 4122, 4024, 
4020, 4088, 3980, 4140, 4159, 4129, 4064, 4141, 4096, 4238, 4036, 4080, 4151, 
4115, 4086, 4156, 4111, 4106, 4086, 4058, 4179, 4193, 4144, 4206, 4180, 4028, 
4148, 4015, 3979, 4201, 4098, 4146, 4169, 4120, 4044, 4066, 4049, 4051, 4051, 
4122, 4048, 4139, 4125, 4052, 4224, 4091, 4084, 4040, 4183, 4134, 3948, 4132, 
3955, 4162, 4183, 4014, 4100, 4091, 4005, 4146, 4182, 4032, 4037, 3985, 4098, 
4078, 4147, 4060, 4085, 4215, 4039, 4187, 4207, 4161, 4086, 4159, 4018, 4073, 
4051, 4008, 4095, 4110, 4160, 4288, 4077, 4074, 4113, 4104, 4097, 4115, 4049, 
3963, 4083, 4111, 4066, 4084, 4107, 4035, 3977, 4078, 4035, 4008, 3993, 4080, 
4152, 4121, 4111, 4033, 4094, 4191, 4131, 3978, 4082, 4134, 4119, 4135, 4071, 
3993, 3888, 4137, 4188, 4110, 4078, 4186, 4188, 4074, 4196, 4110, 4069, 4135, 
4043, 4150, 4023, 4095, 4074, 4179, 4112, 4084, 4124, 4180, 4154, 3996, 4103, 
4199, 4137, 4155, 4039, 4077, 4159, 4167, 4171, 4115, 4025, 4218, 4046, 4008, 
4178, 3969, 4135, 4077, 4044, 4080, 4085, 4230, 4161, 4151, 4056, 4222, 4033, 
4020, 4187, 4034, 4175, 4167, 3962, 4102, 4054, 3978, 4111, 4001, 4028, 4103, 
4088, 4054, 4049, 4164, 4136, 4110, 4181, 3964, 4098, 4046, 3997, 4151, 4122, 
4272, 4067, 4112, 4037, 4083, 4072, 4106, 4105, 4104, 4166, 4090, 4071, 4080, 
4070, 4087, 4162, 4060, 4237, 4061, 4044, 4128, 4051, 4097]