📄 tiger.pas
字号:
$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 + -