delphi7 写的一个验证btcdice网站结果的程序
mark 下:
主要实现的功能有:
Sha256算法 / hmac_sha512算法 (上网搜索了2天才搞定,资料太少)
包含Listview 相关用法
1. Main window
2. 运行结果
unit Main_unit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FlatUtils, FlatCtrls, StdCtrls, StrUtils, PerlRegEx,
DCPrijndael, Dcpsha256, flchash, ComCtrls;
type
TmainForm = class(TForm)
informationGroup: TFlatGroupBox;
informationMemo: TFlatMemo;
serverSeedEdit: TFlatEdit;
serverSeedHashEdit: TFlatEdit;
clientSeedEdit: TFlatEdit;
betIDEdit: TFlatEdit;
betRangeEdit: TFlatEdit;
queryButton: TFlatButton;
calculateButton: TFlatButton;
donateButton: TFlatButton;
copyBTCButton: TFlatButton;
copyLTCButton: TFlatButton;
copyDOGEButton: TFlatButton;
FlatListView1: TFlatListView;
procedure donateButtonClick(Sender: TObject);
procedure serverSeedEditClick(Sender: TObject);
procedure serverSeedHashEditClick(Sender: TObject);
procedure clientSeedEditClick(Sender: TObject);
procedure queryButtonClick(Sender: TObject);
procedure copyDOGEButtonClick(Sender: TObject);
procedure copyLTCButtonClick(Sender: TObject);
procedure copyBTCButtonClick(Sender: TObject);
procedure calculateButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure betIDEditKeyPress(Sender: TObject; var Key: Char);
procedure betRangeEditKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
mainForm: TmainForm;
openCopyButton: String;
readyToCalculate: String;
implementation
{
ChangeLog : 2016/7/4 1:11:37 v1.3.8
1. flatlistview 倒叙排列
2. 关闭 serverseed , serverSeedHash, clientSeed 设置为只读
3. 限制 betID , betRange 只能输入数字
4. 计算 按钮默认 disable, serverseed验证成功方可开启
5. 计算开始前 需要检测betID , betRange 大小关系
}
// Function to get HashSha256
function getHashSha256Value(str:string):ansiString;
var
Hash : TDCP_sha256;
Digest: array[0..64] of byte;
i: integer;
s: ansiString;
begin
s:= '';
hash := TDCP_sha256.Create(nil);
if hash<>nil then
begin
try
Hash.Init; // initialize it
Hash.UpdateStr(str); // hash the stream contents
Hash.Final(Digest); // produce the digest
for i:= 0 to length(Digest)-1 do
s:= s + IntToHex(Digest[i],2);
finally
hash.free;
end;
end;
result := LowerCase(MidStr(s, 1, 64));
end;
{$R *.dfm}
procedure TmainForm.donateButtonClick(Sender: TObject);
begin
calculateButton.Enabled := False;
serverSeedEdit.Left:=38;
serverSeedEdit.Width:=300;
serverSeedEdit.Ticket.Caption:='BTC:';
serverSeedEdit.ticket.Font.Name:='微软雅黑';
serverSeedHashEdit.Left:=38;
serverSeedHashEdit.Width:=300;
serverSeedHashEdit.Ticket.Caption:='LTC:';
serverSeedHashEdit.ticket.Font.Name:='微软雅黑';
clientSeedEdit.Left:=38;
clientSeedEdit.Width:=300;
clientSeedEdit.Ticket.Caption:='Doge:';
clientSeedEdit.ticket.Font.Name:='微软雅黑';
serverSeedEdit.Text:='166W2zr9WoUx2dPB9bXXLNVHEahYBCy5uq';
serverSeedEdit.ReadOnly:=True;
serverSeedHashEdit.Text:='LR4Qm8Cc2jKRdV4MZCpXtrAE8SZ2dXuj1o';
serverSeedHashEdit.ReadOnly:=True;
clientSeedEdit.Text:='DU5zf68E7x4YtMayUaX91z6dQDouS2u5ae';
clientSeedEdit.ReadOnly:=True;
openCopyButton:='Yes';
end;
procedure TmainForm.serverSeedEditClick(Sender: TObject);
begin
if openCopyButton ='Yes' then
begin
copyBTCButton.Visible:=True;
copyLTCButton.Visible:=False;
copyDOGEButton.Visible:=False;
end;
end;
procedure TmainForm.serverSeedHashEditClick(Sender: TObject);
begin
if openCopyButton ='Yes' then
begin
copyBTCButton.Visible:=False;
copyLTCButton.Visible:=True;
copyDOGEButton.Visible:=False;
end;
end;
procedure TmainForm.clientSeedEditClick(Sender: TObject);
begin
if openCopyButton ='Yes' then
begin
copyBTCButton.Visible:=False;
copyLTCButton.Visible:=False;
copyDOGEButton.Visible:=True;
end;
end;
procedure TmainForm.queryButtonClick(Sender: TObject);
var
List: TStrings;
reg: TPerlRegEx;
num: Integer;
begin
serverSeedEdit.Left:=8;
serverSeedEdit.Width:=435;
serverSeedEdit.Ticket.Caption:='';
serverSeedHashEdit.Left:=8;
serverSeedHashEdit.Width:=435;
serverSeedHashEdit.Ticket.Caption:='';
clientSeedEdit.Left:=8;
clientSeedEdit.Width:=435;
clientSeedEdit.Ticket.Caption:='';
serverSeedEdit.Clear;
serverSeedHashEdit.Clear;
clientSeedEdit.Clear;
betIDEdit.Clear;
betRangeEdit.Clear;
List := TStringList.Create;
reg := TPerlRegEx.Create;
reg.Subject := informationMemo.Text;
reg.RegEx := '" "';{分割}
num:=0;
while reg.MatchAgain do
begin
Inc(num);
end;
reg.Split(List,MaxInt);
if num = 3 then
begin
if getHashSha256Value(MidStr(List.Strings[0],2,64)) = List.Strings[1] then
begin
ShowMessage('服务器种子验证成功');
calculateButton.Enabled:= True;
ReadyToCalculate := 'Yes';
serverSeedEdit.Text := MidStr(List.Strings[0],2,64);
serverSeedHashEdit.Text := List.Strings[1];
clientSeedEdit.Text := List.Strings[2];
betIDEdit.Text := LeftStr(List.Strings[3], (Length(List.Strings[3]) - 1));
betRangeEdit.Text := InttoStr(StrToIntDef(betIDEdit.Text, 0) + 10);
FreeAndNil(reg);
List.Free;
end
else
begin
MessageBox(MainForm.Handle,'服务器种子验证失败,Hash不匹配','BD提醒您',MB_ICONWARNING+MB_OK);
{ Reset }
serverSeedEdit.Clear;
serverSeedHashEdit.Clear;
clientSeedEdit.Clear;
betIDEdit.Clear;
betRangeEdit.Clear;
informationMemo.Clear;
informationMemo.SetFocus;
calculateButton.Enabled := False;
end;
end
else
begin
MessageBox(MainForm.Handle,'复制的信息有误,格式不正确','BD提醒您',MB_ICONWARNING+MB_OK);
informationMemo.Clear;
informationMemo.SetFocus;
calculateButton.Enabled := False;
end;
end;
procedure TmainForm.copyDOGEButtonClick(Sender: TObject);
begin
clientSeedEdit.SelectAll;
clientSeedEdit.CopyToClipboard;
ShowMessage('已经成功复制Doge【狗狗】地址,谢谢支持');
begin
serverSeedEdit.Left:=8;
serverSeedEdit.Width:=435;
serverSeedEdit.Ticket.Caption:='';
serverSeedHashEdit.Left:=8;
serverSeedHashEdit.Width:=435;
serverSeedHashEdit.Ticket.Caption:='';
clientSeedEdit.Left:=8;
clientSeedEdit.Width:=435;
clientSeedEdit.Ticket.Caption:='';
serverSeedEdit.Clear;
serverSeedHashEdit.Clear;
clientSeedEdit.Clear;
betIDEdit.Clear;
betRangeEdit.Clear;
informationMemo.Clear;
informationMemo.SetFocus;
calculateButton.Enabled := False;
openCopyButton:='No';
copyDOGEButton.Visible:=False;
end;
end;
procedure TmainForm.copyLTCButtonClick(Sender: TObject);
begin
serverSeedHashEdit.SelectAll;
serverSeedHashEdit.CopyToClipboard;
ShowMessage('已经成功复制LTC【辣条】地址,谢谢支持');
begin
serverSeedEdit.Left:=8;
serverSeedEdit.Width:=435;
serverSeedEdit.Ticket.Caption:='';
serverSeedHashEdit.Left:=8;
serverSeedHashEdit.Width:=435;
serverSeedHashEdit.Ticket.Caption:='';
clientSeedEdit.Left:=8;
clientSeedEdit.Width:=435;
clientSeedEdit.Ticket.Caption:='';
serverSeedEdit.Clear;
serverSeedHashEdit.Clear;
clientSeedEdit.Clear;
betIDEdit.Clear;
betRangeEdit.Clear;
informationMemo.Clear;
informationMemo.SetFocus;
openCopyButton:='No';
calculateButton.Enabled := False;
copyLTCButton.Visible:=False;
end;
end;
procedure TmainForm.copyBTCButtonClick(Sender: TObject);
begin
serverSeedEdit.SelectAll;
serverSeedEdit.CopyToClipboard;
ShowMessage('已经成功复制BTC【比特币】地址,谢谢支持');
begin
serverSeedEdit.Left:=8;
serverSeedEdit.Width:=435;
serverSeedEdit.Ticket.Caption:='';
serverSeedHashEdit.Left:=8;
serverSeedHashEdit.Width:=435;
serverSeedHashEdit.Ticket.Caption:='';
clientSeedEdit.Left:=8;
clientSeedEdit.Width:=435;
clientSeedEdit.Ticket.Caption:='';
serverSeedEdit.Clear;
serverSeedHashEdit.Clear;
clientSeedEdit.Clear;
betIDEdit.Clear;
betRangeEdit.Clear;
informationMemo.Clear;
informationMemo.SetFocus;
openCopyButton:='No';
calculateButton.Enabled := False;
copyBTCButton.Visible:=False;
end;
end;
procedure TmainForm.calculateButtonClick(Sender: TObject);
var
hmacSha512Value: String;
hmacHashKey: String;
betStart : Integer;
listitem: TlistItem;
serverSeedI,rollStart : Integer;
serverSeedRollDefault: String;
serverSeedRoll : Double;
begin
if StrToInt(betIDEdit.Text) < StrToInt(betRangeEdit.Text) then
begin
flatlistview1.Clear;
flatlistview1.Items.Clear;
flatlistview1.Columns.Clear;
flatlistview1.Columns.add;
flatlistview1.Columns.add;
flatlistview1.Columns.Items[1].Width:=65;
flatlistview1.Columns.Items[0].Caption:='BetID';
flatlistview1.Columns.Items[1].Caption:='Result';
flatlistview1.ViewStyle:=vsreport;
flatlistview1.GridLines:=True;
for betStart:=StrToInt(betRangeEdit.Text) downto StrToInt(betIDEdit.Text) do
begin
hmacHashKey := clientSeedEdit.Text + ':' + IntToStr(betStart);
hmacSha512Value := SHA512DigestToHexA(CalcHMAC_SHA512(serverSeedEdit.Text,hmacHashKey));
serverSeedI := 0;
serverSeedRoll := -1;
while (serverSeedRoll = -1) do
if serverSeedI = 25 then
begin
serverSeedRollDefault := IntToStr( StrToInt('$'+copy(hmacSha512Value,126,3)));
serverSeedRoll := StrToInt(serverSeedRollDefault) / 10000;
end // End for if
else
begin
if serverSeedI >= 1 then
rollStart := 5 * serverSeedI + 1
else
rollStart := 5 * serverSeedI;
serverSeedRollDefault := IntToStr( StrToInt('$'+copy(hmacSha512Value,rollStart,5)));
if StrToInt(serverSeedRollDefault) < 1000000 then
serverSeedRoll := StrToInt(serverSeedRollDefault) / 10000;
serverSeedI := serverSeedI + 1;
end; //end if - else
with flatListView1 do
begin
ListItem:=Items.Add;
ListItem.Caption:= IntToStr(BetStart);
ListItem.SubItems.Add(FloatToStr(serverSeedRoll));
end; // End for with
end; // End for
calculateButton.Enabled := False;
end
else
begin
MessageBox(MainForm.Handle,'投注期数需大于初始值','BD提醒您',MB_ICONWARNING+MB_OK);
betRangeEdit.Clear;
betRangeEdit.SetFocus;
end;
end; // End procedure
procedure TmainForm.FormCreate(Sender: TObject);
begin
MessageBox(MainForm.Handle,'此工具用于验证BD投注的公平性,点击账户-换手气,然后复制信息到主界面点击验证即可。注意如有出入请到网站公平下面的第三方验证加以佐证,若觉得好用请打赏一点,谢谢支持!祝旗开得胜,逢赌必赢','',MB_ICONINFORMATION+MB_OK);
calculateButton.Enabled := False;
end;
procedure TmainForm.betIDEditKeyPress(Sender: TObject; var Key: Char);
begin
If not (key in [#48..#57,#8]) then
begin
showmessage('只能输入数字!');
key:= #0;
end;
end;
procedure TmainForm.betRangeEditKeyPress(Sender: TObject; var Key: Char);
begin
If not (key in [#48..#57,#8]) then
begin
showmessage('只能输入数字!');
key:= #0;
end;
end;
end.