📄 idotpcalculator.pas
字号:
'LUST', 'LYLE', 'LYNN', 'LYON', 'LYRA', 'MACE', 'MADE', 'MAGI', {do not localize}
'MAID', 'MAIL', 'MAIN', 'MAKE', 'MALE', 'MALI', 'MALL', 'MALT', {do not localize}
'MANA', 'MANN', 'MANY', 'MARC', 'MARE', 'MARK', 'MARS', 'MART', {do not localize}
'MARY', 'MASH', 'MASK', 'MASS', 'MAST', 'MATE', 'MATH', 'MAUL', {do not localize}
'MAYO', 'MEAD', 'MEAL', 'MEAN', 'MEAT', 'MEEK', 'MEET', 'MELD', {do not localize}
'MELT', 'MEMO', 'MEND', 'MENU', 'MERT', 'MESH', 'MESS', 'MICE', {do not localize}
'MIKE', 'MILD', 'MILE', 'MILK', 'MILL', 'MILT', 'MIMI', 'MIND', {do not localize}
'MINE', 'MINI', 'MINK', 'MINT', 'MIRE', 'MISS', 'MIST', 'MITE', {do not localize}
'MITT', 'MOAN', 'MOAT', 'MOCK', 'MODE', 'MOLD', 'MOLE', 'MOLL', {do not localize}
'MOLT', 'MONA', 'MONK', 'MONT', 'MOOD', 'MOON', 'MOOR', 'MOOT', {do not localize}
'MORE', 'MORN', 'MORT', 'MOSS', 'MOST', 'MOTH', 'MOVE', 'MUCH', {do not localize}
'MUCK', 'MUDD', 'MUFF', 'MULE', 'MULL', 'MURK', 'MUSH', 'MUST', {do not localize}
'MUTE', 'MUTT', 'MYRA', 'MYTH', 'NAGY', 'NAIL', 'NAIR', 'NAME', {do not localize}
'NARY', 'NASH', 'NAVE', 'NAVY', 'NEAL', 'NEAR', 'NEAT', 'NECK', {do not localize}
'NEED', 'NEIL', 'NELL', 'NEON', 'NERO', 'NESS', 'NEST', 'NEWS', {do not localize}
'NEWT', 'NIBS', 'NICE', 'NICK', 'NILE', 'NINA', 'NINE', 'NOAH', {do not localize}
'NODE', 'NOEL', 'NOLL', 'NONE', 'NOOK', 'NOON', 'NORM', 'NOSE', {do not localize}
'NOTE', 'NOUN', 'NOVA', 'NUDE', 'NULL', 'NUMB', 'OATH', 'OBEY', {do not localize}
'OBOE', 'ODIN', 'OHIO', 'OILY', 'OINT', 'OKAY', 'OLAF', 'OLDY', {do not localize}
'OLGA', 'OLIN', 'OMAN', 'OMEN', 'OMIT', 'ONCE', 'ONES', 'ONLY', {do not localize}
'ONTO', 'ONUS', 'ORAL', 'ORGY', 'OSLO', 'OTIS', 'OTTO', 'OUCH', {do not localize}
'OUST', 'OUTS', 'OVAL', 'OVEN', 'OVER', 'OWLY', 'OWNS', 'QUAD', {do not localize}
'QUIT', 'QUOD', 'RACE', 'RACK', 'RACY', 'RAFT', 'RAGE', 'RAID', {do not localize}
'RAIL', 'RAIN', 'RAKE', 'RANK', 'RANT', 'RARE', 'RASH', 'RATE', {do not localize}
'RAVE', 'RAYS', 'READ', 'REAL', 'REAM', 'REAR', 'RECK', 'REED', {do not localize}
'REEF', 'REEK', 'REEL', 'REID', 'REIN', 'RENA', 'REND', 'RENT', {do not localize}
'REST', 'RICE', 'RICH', 'RICK', 'RIDE', 'RIFT', 'RILL', 'RIME', {do not localize}
'RING', 'RINK', 'RISE', 'RISK', 'RITE', 'ROAD', 'ROAM', 'ROAR', {do not localize}
'ROBE', 'ROCK', 'RODE', 'ROIL', 'ROLL', 'ROME', 'ROOD', 'ROOF', {do not localize}
'ROOK', 'ROOM', 'ROOT', 'ROSA', 'ROSE', 'ROSS', 'ROSY', 'ROTH', {do not localize}
'ROUT', 'ROVE', 'ROWE', 'ROWS', 'RUBE', 'RUBY', 'RUDE', 'RUDY', {do not localize}
'RUIN', 'RULE', 'RUNG', 'RUNS', 'RUNT', 'RUSE', 'RUSH', 'RUSK', {do not localize}
'RUSS', 'RUST', 'RUTH', 'SACK', 'SAFE', 'SAGE', 'SAID', 'SAIL', {do not localize}
'SALE', 'SALK', 'SALT', 'SAME', 'SAND', 'SANE', 'SANG', 'SANK', {do not localize}
'SARA', 'SAUL', 'SAVE', 'SAYS', 'SCAN', 'SCAR', 'SCAT', 'SCOT', {do not localize}
'SEAL', 'SEAM', 'SEAR', 'SEAT', 'SEED', 'SEEK', 'SEEM', 'SEEN', {do not localize}
'SEES', 'SELF', 'SELL', 'SEND', 'SENT', 'SETS', 'SEWN', 'SHAG', {do not localize}
'SHAM', 'SHAW', 'SHAY', 'SHED', 'SHIM', 'SHIN', 'SHOD', 'SHOE', {do not localize}
'SHOT', 'SHOW', 'SHUN', 'SHUT', 'SICK', 'SIDE', 'SIFT', 'SIGH', {do not localize}
'SIGN', 'SILK', 'SILL', 'SILO', 'SILT', 'SINE', 'SING', 'SINK', {do not localize}
'SIRE', 'SITE', 'SITS', 'SITU', 'SKAT', 'SKEW', 'SKID', 'SKIM', {do not localize}
'SKIN', 'SKIT', 'SLAB', 'SLAM', 'SLAT', 'SLAY', 'SLED', 'SLEW', {do not localize}
'SLID', 'SLIM', 'SLIT', 'SLOB', 'SLOG', 'SLOT', 'SLOW', 'SLUG', {do not localize}
'SLUM', 'SLUR', 'SMOG', 'SMUG', 'SNAG', 'SNOB', 'SNOW', 'SNUB', {do not localize}
'SNUG', 'SOAK', 'SOAR', 'SOCK', 'SODA', 'SOFA', 'SOFT', 'SOIL', {do not localize}
'SOLD', 'SOME', 'SONG', 'SOON', 'SOOT', 'SORE', 'SORT', 'SOUL', {do not localize}
'SOUR', 'SOWN', 'STAB', 'STAG', 'STAN', 'STAR', 'STAY', 'STEM', {do not localize}
'STEW', 'STIR', 'STOW', 'STUB', 'STUN', 'SUCH', 'SUDS', 'SUIT', {do not localize}
'SULK', 'SUMS', 'SUNG', 'SUNK', 'SURE', 'SURF', 'SWAB', 'SWAG', {do not localize}
'SWAM', 'SWAN', 'SWAT', 'SWAY', 'SWIM', 'SWUM', 'TACK', 'TACT', {do not localize}
'TAIL', 'TAKE', 'TALE', 'TALK', 'TALL', 'TANK', 'TASK', 'TATE', {do not localize}
'TAUT', 'TEAL', 'TEAM', 'TEAR', 'TECH', 'TEEM', 'TEEN', 'TEET', {do not localize}
'TELL', 'TEND', 'TENT', 'TERM', 'TERN', 'TESS', 'TEST', 'THAN', {do not localize}
'THAT', 'THEE', 'THEM', 'THEN', 'THEY', 'THIN', 'THIS', 'THUD', {do not localize}
'THUG', 'TICK', 'TIDE', 'TIDY', 'TIED', 'TIER', 'TILE', 'TILL', {do not localize}
'TILT', 'TIME', 'TINA', 'TINE', 'TINT', 'TINY', 'TIRE', 'TOAD', {do not localize}
'TOGO', 'TOIL', 'TOLD', 'TOLL', 'TONE', 'TONG', 'TONY', 'TOOK', {do not localize}
'TOOL', 'TOOT', 'TORE', 'TORN', 'TOTE', 'TOUR', 'TOUT', 'TOWN', {do not localize}
'TRAG', 'TRAM', 'TRAY', 'TREE', 'TREK', 'TRIG', 'TRIM', 'TRIO', {do not localize}
'TROD', 'TROT', 'TROY', 'TRUE', 'TUBA', 'TUBE', 'TUCK', 'TUFT', {do not localize}
'TUNA', 'TUNE', 'TUNG', 'TURF', 'TURN', 'TUSK', 'TWIG', 'TWIN', {do not localize}
'TWIT', 'ULAN', 'UNIT', 'URGE', 'USED', 'USER', 'USES', 'UTAH', {do not localize}
'VAIL', 'VAIN', 'VALE', 'VARY', 'VASE', 'VAST', 'VEAL', 'VEDA', {do not localize}
'VEIL', 'VEIN', 'VEND', 'VENT', 'VERB', 'VERY', 'VETO', 'VICE', {do not localize}
'VIEW', 'VINE', 'VISE', 'VOID', 'VOLT', 'VOTE', 'WACK', 'WADE', {do not localize}
'WAGE', 'WAIL', 'WAIT', 'WAKE', 'WALE', 'WALK', 'WALL', 'WALT', {do not localize}
'WAND', 'WANE', 'WANG', 'WANT', 'WARD', 'WARM', 'WARN', 'WART', {do not localize}
'WASH', 'WAST', 'WATS', 'WATT', 'WAVE', 'WAVY', 'WAYS', 'WEAK', {do not localize}
'WEAL', 'WEAN', 'WEAR', 'WEED', 'WEEK', 'WEIR', 'WELD', 'WELL', {do not localize}
'WELT', 'WENT', 'WERE', 'WERT', 'WEST', 'WHAM', 'WHAT', 'WHEE', {do not localize}
'WHEN', 'WHET', 'WHOA', 'WHOM', 'WICK', 'WIFE', 'WILD', 'WILL', {do not localize}
'WIND', 'WINE', 'WING', 'WINK', 'WINO', 'WIRE', 'WISE', 'WISH', {do not localize}
'WITH', 'WOLF', 'WONT', 'WOOD', 'WOOL', 'WORD', 'WORE', 'WORK', {do not localize}
'WORM', 'WORN', 'WOVE', 'WRIT', 'WYNN', 'YALE', 'YANG', 'YANK', {do not localize}
'YARD', 'YARN', 'YAWL', 'YAWN', 'YEAH', 'YEAR', 'YELL', 'YOGA', {do not localize}
'YOKE'); {do not localize}
function ReverseEndian(const AInt: LongWord): LongWord; overload;
begin
result := ((AInt and $FF000000) shr 24) or
((AInt and $00FF0000) shr 8) or
((AInt and $0000FF00) shl 8) or
((AInt and $000000FF) shl 24);
end;
function ReverseEndian(const AInt64: int64): int64; overload;
begin
result := ((AInt64 and $00000000FF000000) shr 24) or
((AInt64 and $0000000000FF0000) shr 8) or
((AInt64 and $000000000000FF00) shl 8) or
((AInt64 and $00000000000000FF) shl 24) or
((AInt64 and $FF00000000000000) shr 24) or
((AInt64 and $00FF000000000000) shr 8) or
((AInt64 and $0000FF0000000000) shl 8) or
((AInt64 and $000000FF00000000) shl 24);
end;
class function TIdOTPCalculator.ToHex(const AKey: int64): string;
begin
result := IntToHex(AKey, 16);
end;
class function TIdOTPCalculator.ToSixWordFormat(const AKey: int64): string;
function GetBits(const Afrom: int64; const AStart: integer; const ACount: integer): word;
begin
result := (Afrom shl AStart) shr (64 - ACount);
end;
var
i: integer;
LParity: integer;
begin
for i := 0 to 4 do
result := result + Dictionary[GetBits(AKey, i * 11, 11)] + ' ';
LParity := 0;
for i := 0 to 32 do
inc(LParity, GetBits(AKey, i * 2, 2));
LParity := LParity and 3;
result := result + Dictionary[GetBits(AKey, 55, 11) + LParity];
end;
class function TIdOTPCalculator.GenerateKeyMD4(const ASeed: string; const APassword: string; const ACount: integer): int64;
var
LMD4: TIdHashMessageDigest4;
LMD4Hash: T4x4LongWordRecord;
LTmpMemStream: TMemoryStream;
I: integer;
L64Bit: int64;
LTempLongWord: LongWord;
begin
LMD4 := TIdHashMessageDigest4.Create;
try
LMD4Hash := LMD4.HashValue(lowercase(ASeed) + APassword);
L64Bit := (Int64(LMD4Hash[0] xor LMD4Hash[2]) shl 32) or (LMD4Hash[1] xor LMD4Hash[3]);
for i := 1 to ACount do begin
LTmpMemStream := TMemoryStream.Create;
try
L64Bit := ReverseEndian(L64Bit);
LTempLongWord := (L64Bit shr 32);
LTempLongWord := ReverseEndian(LTempLongWord);
LTmpMemStream.write(LTempLongWord, 4);
LTempLongWord := (L64Bit and $FFFFFFFF);
LTempLongWord := ReverseEndian(LTempLongWord);
LTmpMemStream.write(LTempLongWord, 4);
LTmpMemStream.Position := 0;
LMD4Hash := LMD4.HashValue(LTmpMemStream);
L64Bit := (Int64(LMD4Hash[0] xor LMD4Hash[2]) shl 32) or (LMD4Hash[1] xor LMD4Hash[3]);
finally
LTmpMemStream.free;
end
end;
finally
LMD4.free;
end;
Result := ReverseEndian(L64Bit);
end;
class function TIdOTPCalculator.GenerateKeyMD5(const ASeed: string; const APassword: string; const ACount: integer): int64;
var
LMD5: TIdHashMessageDigest5;
LMD5Hash: T4x4LongWordRecord;
LTmpMemStream: TMemoryStream;
I: integer;
L64Bit: int64;
LTempLongWord: LongWord;
begin
LMD5 := TIdHashMessageDigest5.Create;
try
LMD5Hash := LMD5.HashValue(lowercase(ASeed) + APassword);
L64Bit := (Int64(LMD5Hash[0] xor LMD5Hash[2]) shl 32) or (LMD5Hash[1] xor LMD5Hash[3]);
for i := 1 to ACount do begin
LTmpMemStream := TMemoryStream.Create;
try
L64Bit := ReverseEndian(L64Bit);
LTempLongWord := (L64Bit shr 32);
LTempLongWord := ReverseEndian(LTempLongWord);
LTmpMemStream.write(LTempLongWord, 4);
LTempLongWord := (L64Bit and $FFFFFFFF);
LTempLongWord := ReverseEndian(LTempLongWord);
LTmpMemStream.write(LTempLongWord, 4);
LTmpMemStream.Position := 0;
LMD5Hash := LMD5.HashValue(LTmpMemStream);
L64Bit := (Int64(LMD5Hash[0] xor LMD5Hash[2]) shl 32) or (LMD5Hash[1] xor LMD5Hash[3]);
finally
LTmpMemStream.free;
end
end;
finally
LMD5.free;
end;
Result := ReverseEndian(L64Bit);
end;
class function TIdOTPCalculator.GenerateKeySHA1(const ASeed: string; const APassword: string; const ACount: integer): int64;
var
LSHA1: TIdHashSHA1;
LSHA1Hash: T5x4LongWordRecord;
LTmpMemStream: TMemoryStream;
I: integer;
L64Bit: int64;
LTempLongWord: LongWord;
begin
LSHA1 := TIdHashSHA1.Create;
try
LSHA1Hash := LSHA1.HashValue(lowercase(ASeed) + APassword);
L64Bit := (Int64(LSHA1Hash[0] xor LSHA1Hash[2] xor LSHA1Hash[4]) shl 32) or (LSHA1Hash[1] xor LSHA1Hash[3]);
for i := 1 to ACount do begin
LTmpMemStream := TMemoryStream.Create;
try
L64Bit := ReverseEndian(L64Bit);
LTempLongWord := (L64Bit shr 32);
LTmpMemStream.write(LTempLongWord, 4);
LTempLongWord := (L64Bit and $FFFFFFFF);
LTmpMemStream.write(LTempLongWord, 4);
LTmpMemStream.Position := 0;
LSHA1Hash := LSHA1.HashValue(LTmpMemStream);
L64Bit := (Int64(LSHA1Hash[0] xor LSHA1Hash[2] xor LSHA1Hash[4]) shl 32) or (LSHA1Hash[1] xor LSHA1Hash[3]);
finally
LTmpMemStream.free;
end
end;
finally
LSHA1.free;
end;
result:=L64Bit;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -