level 8
panpy22
楼主
伪随机数的生成(MT19937-64算法)
{$mode objfpc}//要使用class前必须打开的编译开关
unit Rand_MT19937;
interface
type
MT19937=class//为了方便采用面向对象编程
private
const
NN=312;
MM=156;
MATRIX_A=$B5026F5AA96619E9;
UM=$FFFFFFFF80000000;
LM=$7FFFFFFF;
var
mt:array[0..NN-1]of uint64;
mti:uint16;
public
constructor Create(const seed:uint64);
function RandBit:boolean;
function RandU8:uint8;
function Rand8:int8;
function RandU16:uint16;
function Rand16:int16;
function RandU32:uint32;
function Rand32:int32;
function RandU64:uint64;
function Rand64:int64;
function RandInt(const range:int64):int64;
function Random:extended;
function Uniform(const a:extended=1;const b:extended=0):extended;
function Normal(const mu:extended=0;const sigma:extended=1):extended;
end;
implementation
constructor MT19937.Create(const seed:uint64);
var i:uint16;
begin
mt[0]:=seed;
for i:=1 to NN-1 do
mt[i]:=6364
13622384679
3005*(mt[i-1]xor(mt[i-1]shr 62))+i;
mti:=0
end;
function MT19937.RandBit:boolean;//[false,true]
begin
Result:=boolean(RandU64)
end;
function MT19937.RandU8:uint8;//[0,2^8-1]
begin
Result:=uint8(RandU64)
end;
function MT19937.Rand8:int8;//[-2^7,2^7-1]
begin
Result:=int8(RandU64)
end;
function MT19937.RandU16:uint16;//[0,2^16-1]
begin
Result:=uint16(RandU64)
end;
function MT19937.Rand16:int16;//[-2^15,2^15-1]
begin
Result:=int16(RandU64)
end;
function MT19937.RandU32:uint32;//[0,2^32-1]
begin
Result:=uint32(RandU64)
end;
function MT19937.Rand32:int32;//[-2^31,2^31-1]
begin
Result:=int32(RandU64)
end;
function MT19937.RandU64:uint64;//[0,2^32-1]
var
i:uint16;
mag01:array[0..1]of uint64=(0, MATRIX_A);
begin
if mti>=NN then
begin
for i:=0 to NN-MM-1 do
begin
Result:=(mt[i]and UM)or(mt[i+1]and LM);
mt[i]:=mt[i+MM]xor(Result shr 1)xor mag01[Result and 1]
end;
for i:=NN-MM to NN-2 do
begin
Result:=(mt[i]and UM)or(mt[i+1]and LM);
mt[i]:=mt[i+(MM-NN)]xor(Result shr 1)xor mag01[Result and 1]
end;
Result:=(mt[NN-1]and UM)or(mt[0]and LM);
mt[NN-1]:=mt[MM-1]xor(Result shr 1)xor mag01[Result and 1];
mti:=0
end;
Result:=mt[mti];
Result:=Result xor((Result shr 29)and $5555555555555555);
Result:=Result xor((Result shl 17)and $71D67FFFEDA60000);
Result:=Result xor((Result shl 37)and $FFF7EEE000000000);
Result:=Result xor(Result shr 43);
inc(mti)
end;
function MT19937.Rand64:int64;//[0,2^64-1]
begin
Result:=int64(RandU64)
end;
function MT19937.RandInt(const range:int64):int64;//[0,range]
begin
Result:=round(Random*range)
end;
function MT19937.Random:extended;//[0,1]
begin
Result:=Extended(RandU32)/$ffffffffffffffff
end;
function MT19937.Uniform(const a:extended=1;const b:extended=0):extended;//[a,b]
begin
Result:=Random*(a-b)+b
end;
function MT19937.Normal(const mu:extended=0;const sigma:extended=1):extended;
begin
Result:=sqrt(-2*ln(Uniform))*cos(2*pi*Random)*sigma+mu//Box-Muller
end;
end.
加密
{$mode objfpc}
unit Encrypt_MT19937;
interface
uses Rand_MT19937;
type
Encrypt=class//加密解密算法相同
private
FRandom:MT19937;
public
constructor Create(const Key:uint64);
destructor Destroy;override;
function EncryptBit(const data:boolean):boolean;
function EncryptU8(const data:uint8):uint8;
function EncryptU16(const data:uint16):uint16;
function EncryptU32(const data:uint32):uint32;
function EncryptU64(const data:uint64):uint64;
end;
implementation
constructor Encrypt.Create(const Key:uint64);
begin
FRandom:=MT19937.Create(Key)
end;
destructor Encrypt.Destroy;
begin
FRandom.Destroy
end;
function Encrypt.EncryptBit(const data:boolean):boolean;
begin
Result:=data xor FRandom.RandBit
end;
function Encrypt.EncryptU8(const data:uint8):uint8;
begin
Result:=data xor FRandom.RandU8
end;
function Encrypt.EncryptU16(const data:uint16):uint16;
begin
Result:=data xor FRandom.RandU16
end;
function Encrypt.EncryptU32(const data:uint32):uint32;
begin
Result:=data xor FRandom.RandU32
end;
function Encrypt.EncryptU64(const data:uint64):uint64;
begin
Result:=data xor FRandom.RandU64
end;
end.
{
加密解密算法相同
操作1次加密
连续操作2次解密
明文与MT19937伪随机数做xor运算得密文
密文与MT19937伪随机数做xor运算得明文
只有伪随机种子相同时才能还原
伪随机种子即为密钥
理论上伪随机算法随机性越强保密性越高
}
2017年04月12日 13点04分
1
{$mode objfpc}//要使用class前必须打开的编译开关
unit Rand_MT19937;
interface
type
MT19937=class//为了方便采用面向对象编程
private
const
NN=312;
MM=156;
MATRIX_A=$B5026F5AA96619E9;
UM=$FFFFFFFF80000000;
LM=$7FFFFFFF;
var
mt:array[0..NN-1]of uint64;
mti:uint16;
public
constructor Create(const seed:uint64);
function RandBit:boolean;
function RandU8:uint8;
function Rand8:int8;
function RandU16:uint16;
function Rand16:int16;
function RandU32:uint32;
function Rand32:int32;
function RandU64:uint64;
function Rand64:int64;
function RandInt(const range:int64):int64;
function Random:extended;
function Uniform(const a:extended=1;const b:extended=0):extended;
function Normal(const mu:extended=0;const sigma:extended=1):extended;
end;
implementation
constructor MT19937.Create(const seed:uint64);
var i:uint16;
begin
mt[0]:=seed;
for i:=1 to NN-1 do
mt[i]:=6364
13622384679
3005*(mt[i-1]xor(mt[i-1]shr 62))+i;
mti:=0
end;
function MT19937.RandBit:boolean;//[false,true]
begin
Result:=boolean(RandU64)
end;
function MT19937.RandU8:uint8;//[0,2^8-1]
begin
Result:=uint8(RandU64)
end;
function MT19937.Rand8:int8;//[-2^7,2^7-1]
begin
Result:=int8(RandU64)
end;
function MT19937.RandU16:uint16;//[0,2^16-1]
begin
Result:=uint16(RandU64)
end;
function MT19937.Rand16:int16;//[-2^15,2^15-1]
begin
Result:=int16(RandU64)
end;
function MT19937.RandU32:uint32;//[0,2^32-1]
begin
Result:=uint32(RandU64)
end;
function MT19937.Rand32:int32;//[-2^31,2^31-1]
begin
Result:=int32(RandU64)
end;
function MT19937.RandU64:uint64;//[0,2^32-1]
var
i:uint16;
mag01:array[0..1]of uint64=(0, MATRIX_A);
begin
if mti>=NN then
begin
for i:=0 to NN-MM-1 do
begin
Result:=(mt[i]and UM)or(mt[i+1]and LM);
mt[i]:=mt[i+MM]xor(Result shr 1)xor mag01[Result and 1]
end;
for i:=NN-MM to NN-2 do
begin
Result:=(mt[i]and UM)or(mt[i+1]and LM);
mt[i]:=mt[i+(MM-NN)]xor(Result shr 1)xor mag01[Result and 1]
end;
Result:=(mt[NN-1]and UM)or(mt[0]and LM);
mt[NN-1]:=mt[MM-1]xor(Result shr 1)xor mag01[Result and 1];
mti:=0
end;
Result:=mt[mti];
Result:=Result xor((Result shr 29)and $5555555555555555);
Result:=Result xor((Result shl 17)and $71D67FFFEDA60000);
Result:=Result xor((Result shl 37)and $FFF7EEE000000000);
Result:=Result xor(Result shr 43);
inc(mti)
end;
function MT19937.Rand64:int64;//[0,2^64-1]
begin
Result:=int64(RandU64)
end;
function MT19937.RandInt(const range:int64):int64;//[0,range]
begin
Result:=round(Random*range)
end;
function MT19937.Random:extended;//[0,1]
begin
Result:=Extended(RandU32)/$ffffffffffffffff
end;
function MT19937.Uniform(const a:extended=1;const b:extended=0):extended;//[a,b]
begin
Result:=Random*(a-b)+b
end;
function MT19937.Normal(const mu:extended=0;const sigma:extended=1):extended;
begin
Result:=sqrt(-2*ln(Uniform))*cos(2*pi*Random)*sigma+mu//Box-Muller
end;
end.
加密
{$mode objfpc}
unit Encrypt_MT19937;
interface
uses Rand_MT19937;
type
Encrypt=class//加密解密算法相同
private
FRandom:MT19937;
public
constructor Create(const Key:uint64);
destructor Destroy;override;
function EncryptBit(const data:boolean):boolean;
function EncryptU8(const data:uint8):uint8;
function EncryptU16(const data:uint16):uint16;
function EncryptU32(const data:uint32):uint32;
function EncryptU64(const data:uint64):uint64;
end;
implementation
constructor Encrypt.Create(const Key:uint64);
begin
FRandom:=MT19937.Create(Key)
end;
destructor Encrypt.Destroy;
begin
FRandom.Destroy
end;
function Encrypt.EncryptBit(const data:boolean):boolean;
begin
Result:=data xor FRandom.RandBit
end;
function Encrypt.EncryptU8(const data:uint8):uint8;
begin
Result:=data xor FRandom.RandU8
end;
function Encrypt.EncryptU16(const data:uint16):uint16;
begin
Result:=data xor FRandom.RandU16
end;
function Encrypt.EncryptU32(const data:uint32):uint32;
begin
Result:=data xor FRandom.RandU32
end;
function Encrypt.EncryptU64(const data:uint64):uint64;
begin
Result:=data xor FRandom.RandU64
end;
end.
{
加密解密算法相同
操作1次加密
连续操作2次解密
明文与MT19937伪随机数做xor运算得密文
密文与MT19937伪随机数做xor运算得明文
只有伪随机种子相同时才能还原
伪随机种子即为密钥
理论上伪随机算法随机性越强保密性越高
}