⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiger.pas

📁 超级Delphi函数包,包括编程时常需要的一些函数
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    $A7BE29E7ADBCE118   {  858 },    $E544EE5CDE8431DD   {  859 },
    $8A781B1B41F1873E   {  860 },    $A5C94C78A0D2F0E7   {  861 },
    $39412E2877B60728   {  862 },    $A1265EF3AFC9A62C   {  863 },
    $BCC2770C6A2506C5   {  864 },    $3AB66DD5DCE1CE12   {  865 },
    $E65499D04A675B37   {  866 },    $7D8F523481BFD216   {  867 },
    $0F6F64FCEC15F389   {  868 },    $74EFBE618B5B13C8   {  869 },
    $ACDC82B714273E1D   {  870 },    $DD40BFE003199D17   {  871 },
    $37E99257E7E061F8   {  872 },    $FA52626904775AAA   {  873 },
    $8BBBF63A463D56F9   {  874 },    $F0013F1543A26E64   {  875 },
    $A8307E9F879EC898   {  876 },    $CC4C27A4150177CC   {  877 },
    $1B432F2CCA1D3348   {  878 },    $DE1D1F8F9F6FA013   {  879 },
    $606602A047A7DDD6   {  880 },    $D237AB64CC1CB2C7   {  881 },
    $9B938E7225FCD1D3   {  882 },    $EC4E03708E0FF476   {  883 },
    $FEB2FBDA3D03C12D   {  884 },    $AE0BCED2EE43889A   {  885 },
    $22CB8923EBFB4F43   {  886 },    $69360D013CF7396D   {  887 },
    $855E3602D2D4E022   {  888 },    $073805BAD01F784C   {  889 },
    $33E17A133852F546   {  890 },    $DF4874058AC7B638   {  891 },
    $BA92B29C678AA14A   {  892 },    $0CE89FC76CFAADCD   {  893 },
    $5F9D4E0908339E34   {  894 },    $F1AFE9291F5923B9   {  895 },
    $6E3480F60F4A265F   {  896 },    $EEBF3A2AB29B841C   {  897 },
    $E21938A88F91B4AD   {  898 },    $57DFEFF845C6D3C3   {  899 },
    $2F006B0BF62CAAF2   {  900 },    $62F479EF6F75EE78   {  901 },
    $11A55AD41C8916A9   {  902 },    $F229D29084FED453   {  903 },
    $42F1C27B16B000E6   {  904 },    $2B1F76749823C074   {  905 },
    $4B76ECA3C2745360   {  906 },    $8C98F463B91691BD   {  907 },
    $14BCC93CF1ADE66A   {  908 },    $8885213E6D458397   {  909 },
    $8E177DF0274D4711   {  910 },    $B49B73B5503F2951   {  911 },
    $10168168C3F96B6B   {  912 },    $0E3D963B63CAB0AE   {  913 },
    $8DFC4B5655A1DB14   {  914 },    $F789F1356E14DE5C   {  915 },
    $683E68AF4E51DAC1   {  916 },    $C9A84F9D8D4B0FD9   {  917 },
    $3691E03F52A0F9D1   {  918 },    $5ED86E46E1878E80   {  919 },
    $3C711A0E99D07150   {  920 },    $5A0865B20C4E9310   {  921 },
    $56FBFC1FE4F0682E   {  922 },    $EA8D5DE3105EDF9B   {  923 },
    $71ABFDB12379187A   {  924 },    $2EB99DE1BEE77B9C   {  925 },
    $21ECC0EA33CF4523   {  926 },    $59A4D7521805C7A1   {  927 },
    $3896F5EB56AE7C72   {  928 },    $AA638F3DB18F75DC   {  929 },
    $9F39358DABE9808E   {  930 },    $B7DEFA91C00B72AC   {  931 },
    $6B5541FD62492D92   {  932 },    $6DC6DEE8F92E4D5B   {  933 },
    $353F57ABC4BEEA7E   {  934 },    $735769D6DA5690CE   {  935 },
    $0A234AA642391484   {  936 },    $F6F9508028F80D9D   {  937 },
    $B8E319A27AB3F215   {  938 },    $31AD9C1151341A4D   {  939 },
    $773C22A57BEF5805   {  940 },    $45C7561A07968633   {  941 },
    $F913DA9E249DBE36   {  942 },    $DA652D9B78A64C68   {  943 },
    $4C27A97F3BC334EF   {  944 },    $76621220E66B17F4   {  945 },
    $967743899ACD7D0B   {  946 },    $F3EE5BCAE0ED6782   {  947 },
    $409F753600C879FC   {  948 },    $06D09A39B5926DB6   {  949 },
    $6F83AEB0317AC588   {  950 },    $01E6CA4A86381F21   {  951 },
    $66FF3462D19F3025   {  952 },    $72207C24DDFD3BFB   {  953 },
    $4AF6B6D3E2ECE2EB   {  954 },    $9C994DBEC7EA08DE   {  955 },
    $49ACE597B09A8BC4   {  956 },    $B38C4766CF0797BA   {  957 },
    $131B9373C57C2A75   {  958 },    $B1822CCE61931E58   {  959 },
    $9D7555B909BA1C0C   {  960 },    $127FAFDD937D11D2   {  961 },
    $29DA3BADC66D92E4   {  962 },    $A2C1D57154C2ECBC   {  963 },
    $58C5134D82F6FE24   {  964 },    $1C3AE3515B62274F   {  965 },
    $E907C82E01CB8126   {  966 },    $F8ED091913E37FCB   {  967 },
    $3249D8F9C80046C9   {  968 },    $80CF9BEDE388FB63   {  969 },
    $1881539A116CF19E   {  970 },    $5103F3F76BD52457   {  971 },
    $15B7E6F5AE47F7A8   {  972 },    $DBD7C6DED47E9CCF   {  973 },
    $44E55C410228BB1A   {  974 },    $B647D4255EDB4E99   {  975 },
    $5D11882BB8AAFC30   {  976 },    $F5098BBB29D3212A   {  977 },
    $8FB5EA14E90296B3   {  978 },    $677B942157DD025A   {  979 },
    $FB58E7C0A390ACB5   {  980 },    $89D3674C83BD4A01   {  981 },
    $9E2DA4DF4BF3B93B   {  982 },    $FCC41E328CAB4829   {  983 },
    $03F38C96BA582C52   {  984 },    $CAD1BDBD7FD85DB2   {  985 },
    $BBB442C16082AE83   {  986 },    $B95FE86BA5DA9AB0   {  987 },
    $B22E04673771A93F   {  988 },    $845358C9493152D8   {  989 },
    $BE2A488697B4541E   {  990 },    $95A2DC2DD38E6966   {  991 },
    $C02C11AC923C852B   {  992 },    $2388B1990DF2A87B   {  993 },
    $7C8008FA1B4F37BE   {  994 },    $1F70D0C84D54E503   {  995 },
    $5490ADEC7ECE57D4   {  996 },    $002B3C27D9063A3A   {  997 },
    $7EAEA3848030A2BF   {  998 },    $C602326DED2003C0   {  999 },
    $83A7287D69A94086   { 1000 },    $C57A5FCB30F57A8A   { 1001 },
    $B56844E479EBE779   { 1002 },    $A373B40F05DCBCE9   { 1003 },
    $D71A786E88570EE2   { 1004 },    $879CBACDBDE8F6A0   { 1005 },
    $976AD1BCC164A32F   { 1006 },    $AB21E25E9666D78B   { 1007 },
    $901063AAE5E5C33C   { 1008 },    $9818B34448698D90   { 1009 },
    $E36487AE3E1E8ABB   { 1010 },    $AFBDF931893BDCB4   { 1011 },
    $6345A0DC5FBBD519   { 1012 },    $8628FE269B9465CA   { 1013 },
    $1E5D01603F9C51EC   { 1014 },    $4DE44006A15049B7   { 1015 },
    $BF6C70E5F776CBB1   { 1016 },    $411218F2EF552BED   { 1017 },
    $CB0C0708705A36A3   { 1018 },    $E74D14754F986044   { 1019 },
    $CD56D9430EA8280E   { 1020 },    $C12591D7535F5065   { 1021 },
    $C83223F1720AEF96   { 1022 },    $C3A0396F7363A51F   { 1023 }
  );

procedure TigerRound(var a, b, c: Int64; x, mul: Int64);
begin
  c := c xor x;
  a := a - (
    t1[Byte(c)] xor
    t2[Byte(LongWord(c) shr 16)] xor
    t3[Byte(c shr 32)] xor
    t4[Byte(LongWord(c shr 32) shr 16)]
  );
  b := b + (
    t4[Byte(LongWord(c) shr (8))] xor
    t3[Byte(LongWord(c) shr (24))] xor
    t2[Byte(LongWord(c shr 32) shr 8)] xor
    t1[Byte(LongWord(c shr 32 shr 24))]
  );
  b := b * mul;
end;

procedure TigerPass(var a, b, c: Int64; x: array of Int64; mul: Int64);
begin
  TigerRound(a, b, c, x[0], mul);
  TigerRound(b, c, a, x[1], mul);
  TigerRound(c, a, b, x[2], mul);
  TigerRound(a, b, c, x[3], mul);
  TigerRound(b, c, a, x[4], mul);
  TigerRound(c, a, b, x[5], mul);
  TigerRound(a, b, c, x[6], mul);
  TigerRound(b, c, a, x[7], mul);
end;

procedure TigerKeySchedule(var x: array of Int64);
begin
  x[0] := x[0] - (x[7] xor $A5A5A5A5A5A5A5A5);
  x[1] := x[1] xor x[0];
  x[2] := x[2] + x[1];
  x[3] := x[3] - (x[2] xor ((not x[1]) shl 19));
  x[4] := x[4] xor x[3];
  x[5] := x[5] + x[4];
  x[6] := x[6] - (x[5] xor ((not x[4]) shr 23));
  x[7] := x[7] xor x[6];
  x[0] := x[0] + x[7];
  x[1] := x[1] - (x[0] xor ((not x[7]) shl 19));
  x[2] := x[2] xor x[1];
  x[3] := x[3] + x[2];
  x[4] := x[4] - (x[3] xor ((not x[2]) shr 23));
  x[5] := x[5] xor x[4];
  x[6] := x[6] + x[5];
  x[7] := x[7] - (x[6] xor $0123456789ABCDEF);
end;

procedure TigerCompress(str: Pointer; var state: array of Int64; PASSES: LongWord);
var
  a, b, c: Int64;
  x: array[0..7] of Int64;
  aa, bb, cc, tmpa: Int64;
  pass_no: LongWord;
begin
  if PASSES < 1 then PASSES := 1;
  a := state[0]; b := state[1]; c := state[2];
  Move(str^, x, SizeOf(x));
  {tiger_compress}
  aa := a; bb := b; cc := c;
  for pass_no := 0 to PASSES - 1 do
  begin
    if (pass_no <> 0) then TigerKeySchedule(x);
    if pass_no = 0 then
      TigerPass(a, b, c, x, 5)
    else if pass_no = 1 then
      TigerPass(a, b, c, x, 7)
    else
      TigerPass(a, b, c, x, 9);
    tmpa := a; a := c; c := b; b := tmpa;
  end;
  a := a xor aa;
  b := b - bb;
  c := c + cc;
  {--}
  state[0] := a; state[1] := b; state[2] := c;
end;

procedure TigerInit(var ctx: TTigerCtx);
begin
  ctx.length := 0; ctx.curlen := 0;
  ctx.state[0] := $0123456789ABCDEF;
  ctx.state[1] := $FEDCBA9876543210;
  ctx.state[2] := $F096A5B4C3B2E187;
end;

procedure TigerUpdate(var ctx: TTigerCtx; buf: Pointer; len: LongWord; PASSES: LongWord);
begin
  while (len > 0) do
  begin
    ctx.buf[ctx.curlen] := PByte(buf)^;
    Inc(ctx.curlen);
    buf := Ptr(LongWord(buf) + 1);
    if (ctx.curlen = 64) then
    begin
      TigerCompress(@ctx.buf, ctx.state, PASSES);
      Inc(ctx.length, 512);
      ctx.curlen := 0;
    end;
    Dec(len);
  end;
end;

function TigerFinal(var ctx: TTigerCtx; sz: Word; PASSES: LongWord): String;
var
  i: LongWord;
begin
  Inc(ctx.length, ctx.curlen shl 3);
  ctx.buf[ctx.curlen] := $1;
  Inc(ctx.curlen);
  if (ctx.curlen >= 56) then
  begin
    while ctx.curlen < 64 do
    begin
      ctx.buf[ctx.curlen] := 0;
      Inc(ctx.curlen);
    end;
    TigerCompress(@ctx.buf, ctx.state, PASSES);
    ctx.curlen := 0;
  end;
  while ctx.curlen < 56 do
  begin
    ctx.buf[ctx.curlen] := 0;
    Inc(ctx.curlen);
  end;
  for i := 56 to 59 do
    ctx.buf[i] := 0;
  PInt64Array(@ctx.buf[56])^[0] := ctx.length;
  TigerCompress(@ctx.buf, ctx.state, PASSES);
  ctx.state[0] := Endian64(ctx.state[0]);
  ctx.state[1] := Endian64(ctx.state[1]);
  ctx.state[2] := Endian64(ctx.state[2]);
  Result := '';  
  for i := 0 to sz div 8 - 1 do
    Result := Result + IntToHex(PByte(LongWord(@ctx.state) + i)^, 2);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -