Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Загадочные вещи с Intel® 82802 FWH. 26.05.03 23:25 Число просмотров: 2958
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 26.05.03 23:49 Количество правок: 1
|
Итак, имеем subj. Программа получает аппаратно сгенерированные случайные числа и печатает их на консоль, причём в последней колонке выводит «сумму» битов по текущему ряду. Как известно, в хорошем генераторе эта «сумма» должна «плавать» около нуля. («Сумма» считается так — если 1 то увеличиваем счётчик, если 0 — уменьшаем.)
Она плавает, и всё вроде бы хорошо, но только «сумма» получается всегда чётная ;-) У кого-нибудь есть какие-нибудь объяснения? Ухудшает ли этот факт криптостойкость, если, к примеру, шифровать текст наложением полученной гаммы?
Насколько я понимаю, абсолютно случайная гамма не подчиняется никаким законам, кроме одного — при достаточно большой выборке количество нулей и количество единиц в гамме приблизительно равно.
Заранее всем спасибо. Код программы ниже.
Program Rng;
Uses Strings;
Type PBYTE = ^Byte;
Const
RNG_STATUS_REG: PBYTE = Pointer($FFBC015F);
RNG_DATASTATUS_REG: PBYTE = Pointer($FFBC0160);
RNG_DATA_REG: PBYTE = Pointer($FFBC0161);
Function IsRngPresent: Boolean;
Const RNG_PRESENT_MASK = 1 shl 6;
Begin
Result := RNG_STATUS_REG^ And RNG_PRESENT_MASK = RNG_PRESENT_MASK;
End;
Procedure InitRng;
Const RNG_ENABLED_BIT = 1;
Begin
RNG_STATUS_REG^ := RNG_STATUS_REG^ Or RNG_ENABLED_BIT;
End;
Function GetRndNum: DWORD;
Type
OutBuff = Packed Array[1..4] Of Byte;
pOutBuff = ^OutBuff;
Var J: Integer;
Begin
For J := 1 to 4 Do
Begin
While RNG_DATASTATUS_REG^ and 1 <> 1 Do ;
pOutBuff(@Result)^[J] := RNG_DATA_REG^;
End;
End;
Function CalcSum(aValue: DWORD): Integer;
Var
J: Integer;
TestMask: DWORD;
Begin
Result := 0;
For J := 0 To 31 Do
Begin
TestMask := 1 shl J;
If aValue And TestMask = TestMask Then Inc(Result)
Else Dec(Result);
End;
End;
Var
OutBuff: Array[1..5] Of DWORD;
BitSum, J: Integer;
begin
WriteLn; WriteLn('True random number generator written by HandleX');
WriteLn('It works with 82802 Intel(R) Firmware Hub (810 or higher chipsets) only');
If IsRngPresent Then
Begin
InitRng;
WriteLn('Random number generator is found and initialized.');
WriteLn('First random number is generated: $', hex(GetRndNum));
Write('Press Enter to generate RND numbers to console...');
ReadLn;
WriteLn;
End
Else Begin
WriteLn('Error: random number generator is NOT present on this computer!');
WriteLn;
Exit;
End;
BitSum := 0;
Repeat
For J := 1 to 5 Do
Begin
OutBuff[J] := GetRndNum;
If J <> 5 Then Write('$', Hex(OutBuff[J]), ' ')
Else Write('$', Hex(OutBuff[J]), ' Sum: ');
BitSum := BitSum + CalcSum(OutBuff[J]);
End;
WriteLn(BitSum);
Until False;
end.
---
Откомпилированная прога.
|
- Загадочные вещи с Intel® 82802 FWH. - HandleX 26.05.03 23:25 [2958]
- логично - RElf 28.05.03 21:00 [2849]
|
|
|