📄 unit1.pas
字号:
2 : Edit14.Text :='3表示PBOC卡算法!';
3 : Edit14.Text :='4表示银联算法!';
end;
end;
procedure TForm1.Button2Click(Sender: TObject); //下载主密钥按键
var
Ret,MKeyNo,iMKMode : Integer;
MKeyAsc,cpAuth : array [0..100] of char;
edtStr : String;
Lstr,i : integer;
begin
fillchar(MKeyAsc,sizeof(MKeyAsc),0);
MKeyNo := HexToDec(CB1.Items[CB1.ItemIndex]);
edtStr := trim(edit5.Text);
Lstr := length(edtStr);
for i :=0 to Lstr-1 do
begin
MKeyAsc[i] := edtStr[i+1];
end;
if CheckBox1.Checked then //验证下载
begin
iMKMode := CB2.ItemIndex+1;
Ret := ZT_EPP_PinLoadMasterKey(iMKMode,MKeyNo,MKeyAsc,cpAuth);
if Ret=0 then
begin
sb.Panels[2].Text := '下载主密钥成功';
end;
end
else
begin
Ret := ZT_EPP_PinLoadMasterKey(0,MKeyNo,MKeyAsc,cpAuth);
if Ret=0 then
begin
sb.Panels[2].Text := '下载主密钥成功';
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject); //下载工作按键
var
Ret,MKeyNo,WKeyNo,iMKMode : Integer;
MKeyAsc,cpAuth,key,DataOutput : array [0..100] of char;
edtStr,Edit8Str : String;
Lstr,i,iLen : integer;
begin
fillchar(MKeyAsc,sizeof(MKeyAsc),0);
fillchar(cpAuth,sizeof(cpAuth),0);
fillchar(key,sizeof(key),0);
fillchar(DataOutput,sizeof(DataOutput),0);
iMKMode := ComboBox6.ItemIndex+1; // 原主密钥长度
MKeyNo := HexToDec(ComboBox1.Items[ComboBox1.ItemIndex]); //主密钥号
WKeyNo := HexToDec(ComboBox2.Items[ComboBox2.ItemIndex]); //工作密钥号
edtStr := trim(edit5.Text);// 主密钥
Lstr := length(edtStr);
for i :=0 to Lstr-1 do
begin
key[i] := edtStr[i+1];
end;
Edit8Str := Trim(Edit8.Text);
iLen := length(Edit8Str);
if( (iLen Mod 16 <> 0) or (iLen = 0) ) then
begin
// 这个条件是:当长度不为16的倍数,或是长度为0时
edtStr := trim(Edit7.Text); //工作密钥明文
Lstr := length(edtStr);
if( (Lstr Mod 16 <> 0) or (Lstr = 0) ) then
begin
ShowMessage( '工作密钥的长度出错,请输入的长度为16的整数倍');
exit;
end;
for i :=0 to Lstr-1 do
begin
MKeyAsc[i] := edtStr[i+1];
end;
ZT_EPP_Des(MKeyAsc,key,DataOutput ); //与主密钥加密,工作密钥密文 DataOutput
Edit8.Text :=DataOutput;
end
else // 工作密钥密文
begin
for i :=0 to iLen-1 do
begin
DataOutput[i] := Edit8Str[i+1];
end;
end;
ret :=1;
if CheckBox3.Checked then
begin
Ret := ZT_EPP_PinLoadWorkKey(0,MKeyNo,WKeyNo,DataOutput,cpAuth); //0是SAM
// SAM卡的时候工作密钥所以的密钥号是0x40~0x7F
end
else
begin
Ret := ZT_EPP_PinLoadWorkKey(iMKMode,MKeyNo,WKeyNo,DataOutput,cpAuth); //iMKMode,1,2,3是键盘
end;
if Ret=0 then
begin
sb.Panels[2].Text := '下载工作密钥成功';
end;
end;
procedure TForm1.Button4Click(Sender: TObject); //键盘初始化按键
var
Ret,MKeyNo,WKeyNo,iMKMode : Integer;
begin
if ComboBox7.ItemIndex = 0 then
begin
Ret := ZT_EPP_PinInitialization(0);
if Ret=0 then
begin
sb.Panels[2].Text := '初始化成功';
end;
end
else
if ComboBox7.ItemIndex = 1 then
begin
Ret := ZT_EPP_PinInitialization(1);
if Ret=0 then
begin
sb.Panels[2].Text := '初始化成功';
end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject); //密码加密按键
var
MKeyNo,WKeyNo,ii,iRet,Ret : integer;
//cardNostr : array [0..100] of char;
DispMode,AddMode,PromMode,TimeOut : integer;
chKey : char;
chBuf : array [0..3] of char;
chpin : array [0..20] of char;
cardNostr :String;
PinLen,Addi : integer;
begin
edit10.text :='';
fillchar(chpin,20,0);
fillchar(chBuf,3,0);
//设置算法参数
//----------------------------------------------------------
// ZT_EPP_SetDesPara(2,255); //02 ff 键盘输入PIN短时,用<F>值填充PIN右边直至8字节*
//--------------------------------------
If ComboBox14.ItemIndex = 0 then //ASCLL方式
begin
AddMode :=2;
end
else if ComboBox14.ItemIndex = 1 then //ISO9564_0
begin
AddMode :=1;
cardNostr :=trim(CardNo.text);
ZT_EPP_PinLoadCardNo(Pchar(cardNostr)); //下载卡号
end;
//主密钥号
MKeyNo := HexToDec(ComboBox8.Items[ComboBox8.ItemIndex]);
WKeyNo := HexToDec(ComboBox13.Items[ComboBox13.ItemIndex]);
ret := ZT_EPP_ActivWorkPin(MKeyNo,WKeyNo);//激活工作密钥
if Ret = 0 then
begin
PinLen := StrToInt(ComboBox15.Items[ComboBox15.ItemIndex]);
TimeOut := StrToInt(Trim(EdtTimeOut.Text));
//启动密码键盘加密
ZT_EPP_OpenKeyVoic(2);
iRet := ZT_EPP_PinStartAdd(PinLen,1,AddMode,0,TimeOut);
//iRet := ZT_EPP_PinStartAdd(6,1,2,0,TimeOut);
Addi :=0;
PassFlag := true;
if iRet = 0 then
begin
while (PassFlag) do
begin
Ret := ZT_EPP_PinReportPressed(chBuf,500);
if Ret <> 11 then
begin
if(char(13)=chBuf[0] ) and (Addi>0) then //“确认”键返回0x0D;
begin
chpin[Addi] :=chBuf[0];
break;
end
else if (char(8) = chBuf[0]) then //更正键 0x08
begin
//memset(chpin,'\0',20);
fillchar(chpin,20,0);
Addi :=0;
continue;
end
else if (char(27) = chBuf[0]) then //取消”键返回0x1B
begin
Addi :=0;
break;
end
else if(char(42) = chBuf[0]) then // 2A 0---9
begin
chpin[Addi] :=chBuf[0];
edit10.text :=chpin;
Inc(Addi);
if Addi>=PinLen then break;
end;
end;
end;
end;
//ZT_EPP_OpenKeyVoic(0);
end;
//showmessage(chpin);
end;
procedure TForm1.Button8Click(Sender: TObject); //读取密文按键
var
iRet,Lstr,i : Integer;
cpOut,DataOutput,MKeyAsc,CharAsc,chOutData : array [0..100] of char;
edtStr,cardNostr,str1 :String;
begin
fillchar(cpOut,sizeof(cpOut),0);
fillchar(DataOutput,sizeof(DataOutput),0);
fillchar(MKeyAsc,sizeof(MKeyAsc),0);
fillchar(CharAsc,sizeof(CharAsc),0);
fillchar(chOutData,sizeof(chOutData),0);
iRet :=1;
cardNostr :='0000'+trim(CardNo.text);
{If ComboBox9.ItemIndex = 0 then
begin
iRet :=ZT_EPP_PinReadPin(1,cpOut); // 工作密钥长度8字节 ,cpOut传给银联
end
else
If ComboBox9.ItemIndex = 1 then
begin
iRet :=ZT_EPP_PinReadPin(2,cpOut); // 01 30 工作密钥长度16字节 ,cpOut传给银联
end
else
If ComboBox9.ItemIndex = 2 then
begin
iRet :=ZT_EPP_PinReadPin(3,cpOut); // 01 33 工作密钥长度24字节
end; }
iRet :=ZT_EPP_PinReadPin(0,cpOut); // 0前加密 ,cpOut传给银联
ZT_EPP_DllSplitBcd(cpOut,CharAsc,8); // 拆分字符。 CharAsc输出参数
if iRet =0 then
begin
edit11.text := CharAsc;
sb.Panels[2].Text := '读取密文成功';
//解密
{ZT_EPP_PinUnAdd这个是键盘根据它内部的工作密钥进行解密,
而ZT_EPP_Undes是我们自己软件解密的,必须知道工作明文是多少
}
edtStr := trim(Edit7.Text); //工作密钥明文
Lstr := length(edtStr);
for i :=0 to Lstr-1 do
begin
MKeyAsc[i] := edtStr[i+1];
end;
ZT_EPP_Undes(CharAsc,MKeyAsc,DataOutput);
//一参是得到的密文,中间是工作密钥明文,后边是解密后的结果
edit16.text := DataOutput;
{ZT_EPP_PinUnAdd(1,0,CharAsc, chOutData); //这个解密不需要工作密钥明文
edit16.text := chOutData; }
//ISO 解密
// edit16.text := IntToStr(StrToInt(chOutData) Xor StrToIntLnt(cardNostr));
{str1 := '';
for i :=0 to 15 do
begin
str1 := str1 + IntToStr(StrToInt(chOutData[i]) xor StrToInt(cardNostr[i+1]));
end; }
end;
end;
procedure TForm1.Button6Click(Sender: TObject); //取消输入按键
begin
PassFlag := false;
ZT_EPP_OpenKeyVoic(0);
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
edit10.Text := '';
edit11.Text := '';
edit16.Text := '';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -