F2K加密锁介绍

YT699加密锁介绍

YT699加密锁是一款简单易用的加密锁。可以用于软件防盗版及身份认证。

1、加密原理及硬件构成

2、Syunew3D动态库函数

3、SYUNEW3A控件方法及属性


加密原理及硬件构成

1、加密锁内部结构

2、加密原理概述

3、身份认证原理


加密锁内部结构

1、锁ID是每一把都是唯一的，每一把是唯一的，是指每一把锁的ID都不相同

2、数据储存区可以用来储存开发商自定义数据，这些数据掉电不会丢失，写为10万次，读没有限制

3、蓝色部分为SM2国密算法部分，只支持扩展版本或版本大于或等于33的锁


加密原理概述

防盗版加密原理概述

软件防盗版的作用是防止软件被非法拷贝，主要的加密方法，总的来说有如下几种

1、使用储存器进行加密，就是将自定义的数据写到锁中，然后程序在运行时，读取这些数据，如果可以读取出相应的数据，就可以判断存在对应的加密锁，与储存器有关的函数是YReadEx函数、YWriteEx函数、YRead函数、YWrite函数、YReadString函数、YWriteString函数、SetReadPassword函数、SetWritePasswor函数等

2、使用增强TEA算法(强烈推荐)，开发商可以设置不同的增强算法密钥，对于同一数据，不同的算法密钥，加密的结果不相同。开发商可以送一个数据给加密锁，让加密锁加密后返回，然后判断是否是预期的值。也可以让锁进行加密运算的同时，让程序也做同样的运算，然后进行比较。与增强算法有关的函数是：SetCal_2函数、Cal函数 、 EncString函数等。

3、使用SM2国密算法(强烈推荐)，开发商可以设置不同的SM2算法密钥对，对于同一数据，不同的算法密钥对，加密的结果不相同。开发商可以送一个数据给加密锁，让加密锁加密后返回，然后判断是否是预期的值。开发商可以将随机数送给加密锁用私钥进行加密，让加密锁返回加密后的数据，然后再让让程序用公钥进行解密，比较解密后的数据是否与原来加密的随机数相同。与SM2国密算法有关的函数是：SM2_EncBuf函数、SM2_DecBuf函数、SM2_EncString函数、SM2_DecString函数等。

提示1：增强算法为TEA算法，相关的算法不同的开发语言版本可以在网上及我们的源码中找到

提示2：开发商可以根据自已的需要，选择不同的加密方案，也可以几种加密方案结合使用。

提示3：推荐如下加密方案：生成随机数，让锁做加密运算，同时在程序中做同样的运算(指的是软件使用TEA算法)，然后进行比较判断，注意，在软件中作加密或解密时一定要对密钥进行变换，而不要直接出现在程序中。

提示4：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


身份认证的原理概述

身份认证的作用是用于网络的身份认证，即有锁可以登录网络，没有不能登录，身份认证的原理总的来说有如下几种

1、在客户端检查锁的信息，并将用户锁的信息提交给服务端，服务端检查是否合法。

  A、检查锁的信息可以是锁的ID或事先写入到锁的用户名及密码

  B、使用这种验证的方式一般是用来替换原来的用户名及密码输入，安全性一般

2、使用增强算法的方式，进行两端验证，

  A、第一种方法只是简单地从客户端读取锁的唯一ID或从锁中读取用户的用户名及密码，这样就容易被一些黑客编写一些程序对这些进行模仿，从而绕过从客户端读取加密锁。

  B、方法二则是先从服务器端生产一个随机数，然后将该随机数发给客户端，同时服务器端使用与锁对应的增强算法对该随机数进行加密，生成一服务器端验证码；

  C、而在客户端，在获得服务器商发过来的随机数后，客户端使用对应的算法同样对该随机数进行加密，生成一客户端验证码，返回给服务器端，

  D、如果相同，则为合法用户，如果不相同，则为非法用户。

  E、只有在服务器的加密密钥与设置在锁中的加密密钥一致时，两边加密的结果才能相符，才能被合法验证。锁中的加密密钥可以由开发商自行设置。

3、使用SM2国密算法数字签名的方式，进行客户端登录验证，

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）

A、方法三先从服务器端生产一个随机数，然后将该随机数发给客户端；

  B、而在客户端，在获得服务器商发过来的随机数后，客户端使用设置在锁中的SM2密钥对及设置在锁中的用户身份在锁中对随机数进行签名，然后将签名后的数据返回给服务器端，

  C、服务端收到要验证的签名及提交的用户身份后，使用与锁对应的SM2公钥及用户身份对对签名进行验证，如果验证通过，则为合法用户；否则，则为非法用户。

  D、只有在服务器的公钥与设置在锁中的私钥相对应时，签名才能验证通过。锁中的SM2密钥对及用户身份可以由开发商自行设置。

提示：要进行身份验证，必须要在客户端安装锁的驱动程序，它其实不是真正的驱动程序，而是安装必要的客户端控件，有几种安装方式：

    A、提供连接让用户下载安装（推荐)

    B、制作CAB，让浏览器自动安装，这种方式一般会被拦截掉，所以不容易安装成功，且需要微软进行签名，所以一般不推荐。

    C、派发锁时，发行光盘让用户安装


Syunew6D动态库函数

Syunew3D动态库函数

1、查找锁函数

2、获取锁基本信息函数

3、读写储存器函数

4、增强算法函数

5、SM2国密算法函数

6、初始化函数


查找锁函数

在操作加密锁之前，必须要先调用查找锁函数来查找指定的加密锁，如果系统中有多个加密锁，可以使用一个循环来枚举系统上的所有加密锁，

1、FindPort函数


FindPort函数

int FindPort( int start,char *OutPath);

功能：查找系统中是否存在第N个加密锁，如果存在，则返回该加密锁所在的设备路径

参数1－－start(in)； 要查找的第N个加密锁，例：当start=0时，指的是要查找第一个加密锁所在的设备路径，当start=1时，指的是要查找系统中的第二个加密锁所在的设备路径。

参数2――OutPath(out)；如果系统中存在第N个加密锁，则该参数中包含有该加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，系统中存在着第N个加密锁，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义


获取锁基本信息函数

1、GetID 函数

2、NT_GetIDVersion函数

3、NT_GetVersionEx函数

4、GetChipID 函数


GetID 函数

int GetID( DWORD *ID_1,DWORD *ID_2,char*InPath);

功能：返回指定设备路径的加密锁的 ID号，加密锁的ID号由8 个字节组成，

参数１－－ID_1 (out)； 当函数执行成功后，该参数包含有指定设备路径的加密锁的前4个字节的ID号

参数 2－－ID_2 (out)； 当函数执行成功后，该参数包含有指定设备路径的加密锁的后4个字节的ID号

参数 3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义

提示：锁ID都是唯一的，每一把是唯一的，是指每一把锁的ID都不相同

提示2：ID唯一是指两个ID转化为16进制字符串后并连接起来后是唯一的


GetChipID函数

int GetChipID( char *OutChipID,char *InPath);

功能：返回指定设备路径的加密锁的硬件芯片唯一ID

参数１－－OutChipID (out)； 当函数执行成功后，该参数包含有指定设备路径的加密锁的硬件芯片唯一ID，长度为33个字符，包含结束字符串

参数 2――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义

提示1：该函数只支持版本大于或等于33的智能卡芯片锁

提示2：硬件芯片唯一ID为字符串的形式，长度为33个字符，包含结束字符串

提示3：硬件芯片唯一ID是指芯片出厂自带的ID


NT_GetIDVersion函数

int NT_GetIDVersion(int *Version,char *InPath);

功能：返回指定加密锁的版本号

参数1－－Version(out)； 当函数执行成功后，该参数包含有加密锁的版本号

参数2――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示函数执行成功，若返回其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：版本大于或等于8的支持增强算法，版本大于或等于9的支持初始化功能


NT_GetVersionEx函数

int NT_GetIDVersion(int *Version,char *InPath);

功能：返回指定加密锁的扩展版本号

参数1－－Version(out)； 当函数执行成功后，该参数包含有加密锁的扩展版本号

参数2――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示函数执行成功，若返回其它值，则表示方法失败，错误原因可以参见错误代码含义

提示，扩展版本号大于或等于10的锁为2代锁，支持SM国密算法及可以获得锁的硬件芯片唯一ID


读写储存器函数

网络授权型加密锁有494字节的储存器可以读写，其中读的次数没有限制，写的次数为10万次

1、YReadEx函数

2、YWriteEx函数

3、YRead函数

4、YWrite函数

5、YReadString函数

6、YWriteString函数

7、SetReadPassword函数

8、SetWritePasswor函数


YRead函数

YReadEx函数

int YReadEx(BYTE *OutBuf,short address,short len,char *Hkey,char *Lkey,char *Path );

功能：从加密锁内部的储存器中读出数据到数据缓冲区中，该函数用于读取一批数据

参数 1――OutBuf(out)；用来储存读出数据的数据缓冲区，长度由参数len指定。该函数操作成功后，该缓冲区中包含有储存器中读出的数据。

参数 2――address(in)；用户要读取的数据在加密锁中的起始地址。

参数 3――len(in)；要读入的字节的个数

参数 4――HKey(in)；读密码的高八位密码

参数 5――Lkey(in)；读密码的低八位密码

参数 6――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义

提示：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据


YRead函数

int YRead(BYTE *OutData,short address,char *Hkey,char *Lkey,char *Path );

功能：从加密锁内部的储存器中读取一个字节的数据,该函数用于保留兼容旧的函数，建议用YReadEx函数代替

参数 1――OutData(out)；若函数正确返回时，从加密锁的相应地址中读取一个字节的数据到OutData中。

参数 2――address(in)；用户要读取的数据在加密锁中的地址。

参数 3――HKey(in)；读密码的高八位密码

参数 4――Lkey(in)；读密码的低八位密码

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义

提示：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据


YWrite函数

YWriteEx函数

int YWriteEx(BYTE *buf,short address, short len,char *Hkey,char *Lkey,char *Path );

功能：将数据缓冲区中的数据写入加密锁内部的储存器中,该函数用于写入一批数据

参数1—buf(in)；要写入的数据，长度由参数len指定。

参数2――address(in)；要写入到加密锁储存器中的起始位置。

参数3――len(in)；要写入的字节的个数

参数 4――HKey(in)；写密码的高八位密码

参数5――Lkey(in)；写密码的低八位密码

参数6――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

备注：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中


YWrite函数

int YWrite(BYTE InData,short address, char *Hkey,char *Lkey,char *Path );

功能：将一个字节的数据写入加密锁内部的储存器中，该函数用于保留兼容旧的函数，建议用YWriteEx函数代替

参数1—InData(in)；要写入的数据。

参数2――address(in)；数据要写入到加密锁储存器中的地址。

参数 3――HKey(in)；写密码的高八位密码

参数4――Lkey(in)；写密码的低八位密码

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

备注：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中


YReadString函数

int YReadString(char *outstring ,short Address,int Len,char * HKey,char *LKey,char *Path );

功能：从加密锁中的指定起始位置读出字符串。

参数１－－out string(out)；若函数正确返回时，从加密锁address的储存空间中读出字符串到outstring中。

参数 2――address(in)；用户指定的加密锁内部地址空间。即字符串在加密锁中储存的的起始位置。

参数 3――Len(in)； 要读取的字符串的长度。

参数 4――HKey(in)；读密码的高八位密码

参数 5――Lkey(in)；读密码的低八位密码

参数 6――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

备注：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据。


YWriteString函数

int YWriteString(char *InString,short Address,char * HKey,char *LKey,char *Path );

功能：将字符串写入到加密锁的储存器中。

参数1－－InString(in)；要写入到加密锁储存空间的字符串。

参数 2――address(in)；字符串要写入加密锁内部地址的起始位置

参数 3――HKey(in)；写密码的高八位密码

参数 4――Lkey(in)；写密码的低八位密码

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

备注：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中


SetReadPassword函数

int SetReadPassword(char *W_Hkey,char *W_Lkey, char *new_Hkey,char *new_Lkey,char *Path );

功能：设置读加密锁储存器空间的读密码

参数1－－W_Hkey(in)；写密码的高八位。

参数 2――W_Lkey(in)；写密码的低八位。

参数 3――new_Hkey(in)；要设置的新的读密码的高八位

参数 4――new_Lkey(in)；要设置的新的读密码的低八位

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义

注意：设置读密码是用“写”密码设置，而不原来的“读”密码

备注：所有加密锁出厂时的写密码及读密码均为“FFFFFFFF”――“FFFFFFF”


SetWritePassword函数

int SetWritePassword(char *W_Hkey,char *W_Lkey, char *new_Hkey,char *new_Lkey,char *Path );

功能：设置写加密锁储存器空间的写密码

参数1－－W_Hkey(in)；写密码的高八位。

参数2――W_Lkey(in)；写密码的低八位。

参数 3――new_Hkey(in)；要设置的新的写密码的高八位

参数4――new_Lkey(in)；要设置的新的写密码的低八位

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

备注：所有加密锁出厂时的写密码及读密码均为“FFFFFFFF”――“FFFFFFF”


增强算法函数

增强算法函数是在硬件部分增加了一个标准的TEA算法，开发商可以自定义加密密钥，对数据进行加密运算

1、算法相关函数

2、其它相关函数


算法相关函数

1、SetCal_2函数

2、Cal函数

3、EncString函数

4、DecString函数

5、EncBySoft函数

6、DecBySoft函数


SetCal_2函数

int SetCal_2(char *Key,char *InPath);

功能：设置增强算法密钥

参数1—Key(in)；要设置的算法密钥

参数2――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

注意：密钥为不超过32个的0-F字符，例如：1234567890ABCDEF1234567890ABCDEF,不足32个字符的，系统会自动在后面补0


Cal函数

int Cal( BYTE *InBuf,BYTE *OutBuf,char *Path);

功能：使用增强算法对数据进行加密

参数1－－InBuf(in)；要加密的数据缓冲区。

参数 2――OutBuf(out)；返回加密后的数据缓冲区。

参数 3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义

提示1：增强算法是一个标准的TEA算法，Cal函数与TEA算法的加密过程相对应

提示2：Cal函数一次只能对8个字节进行加密，且必须为8的字节


EncString函数

int EncString( char *InString,char *OutString,char *Path);

功能：使用增强算法对字符串进行加密

参数1－－InString(in)；要加密的字符串。

参数 2――OutString(out)；加密后字符串。

参数 3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义

提示1：增强算法是一个标准的TEA算法,EcnString函数与TEA算法的加密过程相对应

提示2：要加密字符串以8个字节为一个分组；要加密的字符串少于8个字节时，不足的字节补数据0；要加密的字符串大于8个字节，但不是8的倍数时，多余的数据不作加密处理

提示3：字符串的加密过程，是先将字符串转化为字节数组，然后调用CAL函数对数据进行加密，加密后的数据将会以16进制字符串的形式返回，所以加密后的字符串的长度是原来要加密字符串的长度(含结束字符)的两倍，且至少不少于16个字符串，


DecString

DecString函数

void DecString( char *InString,char *OutString,char *Key);(重要，这个函数一般不要使用 )

功能：使用Tea算法对加密后的字符串进行解密，解密过程在Dll中进行，而非硬件中进行

参数1－－InString(in)；要解密的字符串，这里的字符串必须是使用EncSring函数加密得到的字符串

参数 2――OutString(out)；解密后字符串。

参数 3――Key(in)；解密密钥

注意：这个函数一般不要使用，因为我们的DLL是固定的，且解密时要提供对应的解密密钥，所以容易被黑客捕获其加密密钥；如实际需要解密，可以在程序中直接使用TEA算法的解密代码，而不要使用这个DLL中提供的函数

提示1：这里的解密过程是在我们的Dll中进行，而非是硬件中进行

提示2：解密后的字符串的长度是原来字符串长度的2分之一

提示3：解密密钥必须要与加密密钥相对应

提示4、解密过程如下：先将16进制字符串转换成字节数组，然后调用CAL函数对数据进行解密，并将结果返回。


EncBySoft

EncBySoft函数

void EncBySoft( BYTE * aData, BYTE * aKey ); 一般不使用这个函数

功能：在DLL中使用软件对字符串进行加密，注意，并非硬件

参数1－－aData(in，out)；要加密的数据缓冲区，函数执行后，返回加密后的数据。

参数 2――aKey(in)；密钥

注意：这个函数一般不要使用，因为我们的DLL是固定的，且函数运行时要提供对应的密钥，所以容易被黑客捕获这个密钥；


DecBySoft

DecBySoft函数

void _stdcall DecBySoft( BYTE * aData, BYTE * aKey ) ;一般不使用这个函数

功能：在DLL中使用软件对字符串进行解密，注意，并非硬件

参数1－－aData(in，out)；要解密的数据缓冲区，函数执行后，返回解密后的数据。

参数 2――aKey(in)；密钥

注意：这个函数一般不要使用，因为我们的DLL是固定的，且函数运行时要提供对应的密钥，所以容易被黑客捕获这个密钥；


其它相关函数

1、HexStringToByteArray函数

2、ByteArrayToHexString函数

3、GetLen函数


HexStringToByteArray函数

VOID HexStringToByteArray(char * InString,BYTE *out_data);

功能：将16进制字符转换为字节数组

参数1—InString(in)；要进行转换的字符串

参数2――out_data(out)；转换后的字节数组

提示：字节数组的长度必须大于2分之1的字符串长度


ByteArrayToHexString

ByteArrayToHexString函数

void ByteArrayToHexString(BYTE *in_data,char * OutString,int len);

功能：将字节数组转换为16进制字符

参数1—in_data(in)；要进行转换的字节数组

参数2――out_data(out)；转换后的16进制字符串

参数3--len(in)；要转换的字节数组的长度

提示：转换后的字符串的长度是参数len的2倍+1(含结束字符串)


GetLen

GetLen函数

int GetLen(char *InString);

功能：返回字符串的长度(含结束字符串)

参数1—InString(in)；输入的字符串

返回结果--字符串的长度(含结束字符串)


SM2算法相关函数

SM2国密算法是在硬件部分增加了一个标准的SM2国密算法，开发商可以自定义密钥对，对数据进行加密运算或进行数据的签名及认证。

1、密钥相关函数

2、加解密相关函数

3、签名及验证相关函数

4、PIN码相关函数

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


密钥相关函数

1、YT_GenKeyPair函数

2、Set_SM2_KeyPair函数

3、Get_SM2_PubKey函数

提示：SM2算法只支持版本或扩展大于或等于33的锁


YT_GenKeyPair函数

int YT_GenKeyPair(char* PriKey,char *PubKeyX,char *PubKeyY,char *InPath);

功能：使用锁生成密钥对

参数1－－PriKey(out)；返回密钥对中的私钥。

参数2――PubKeyX(out)；返回密钥对中的公钥部分的X坐标。

参数 3――PubKeyY(out)；返回密钥对中的公钥部分的Y坐标

参数4――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，将返回相应的密钥对；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。


Set_SM2_KeyPair

Set_SM2_KeyPair函数

int Set_SM2_KeyPair(char *PriKey,char *PubKeyX,char *PubKeyY,char *sm2UserName,char *InPath )；

功能：将密钥对及用户身份设置到锁中

参数1－－PriKey(in)；要设置的密钥对中的私钥。

参数2――PubKeyX(in)；要设置的密钥对中的公钥部分的X坐标。

参数 3――PubKeyY(in)；要设置的密钥对中的公钥部分的Y坐标

参数 4――sm2UserName(in)；要设置到锁中的用户身份，主要是用于数字签名，以确定签名者的身份。

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示：sm2UserName用户身份主要是用于数字签名，当使用锁对信息进行签名时，设置在锁中的签名会参与到签名中，以便识别签名者的身份


Get_SM2_PubKey函数

int Get_SM2_PubKey(char *PubKeyX,char *PubKeyY,char *sm2UserName,char *InPath);

功能：返回设置在锁中的公钥对及用户身份

参数1――PubKeyX(out)；返回设置在锁中的公钥部分的X坐标。

参数 2――PubKeyY(out)；返回设置在锁中的公钥部分的Y坐标

参数 3――sm2UserName(out)；返回设置在锁中的用户身份

参数4――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，将返回相应的公密X,Y；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示：sm2UserName用户身份主要是用于数字签名，验证者可以从锁中取出该身份，对签名后的信息进行验证是否该身份


加解密相关函数

1、SM2_EncBuf函数

2、SM2_DecBuf函数

3、SM2_EncString函数

4、SM2_DecString函数

提示：SM2算法只支持版本或扩展大于或等于33的锁（即智能卡芯片）


SM2_EncBuf函数

int SM2_EncBuf(BYTE *InBuf,BYTE *OutBuf,int inlen,char *InPath);

功能：使用锁中的SM2密钥对输入的二进制数据进行加密

参数1－－InBuf(in)；要加密的二进制数据。

参数2――OutBuf(out)；返回加密后的二进制数据。

参数 3――inlen(in)；要加密的二进制数据的长度

参数4――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，OutBuf中包含有加密后的二进制数据；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

重要提示1：加密后的数据长度要大于要加密的数据长度，所以一定要分配足够的空间给OutBuf

重要提示2：加密后的数据长度的计算方式是：outlen=(inlen/128+1)*97+inlen，


SM2_DecBuf函数

int SM2_DecBuf(BYTE *InBuf,BYTE *OutBuf,int inlen,char* pin,char *InPath)

功能：使用锁中的SM2密钥对输入的二进制数据进行解密

参数1－－InBuf(in)；要解密的二进制数据。

参数2――OutBuf(out)；返回解密后的二进制数据。

参数 3――inlen(in)；要解密的二进制数据的长度

参数 4――pin(in)；Pin码，只有Pin码正确才能进行解密

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，OutBuf中包含有解密后的二进制数据；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

重要提示1：解密后的数据长度要小于加密后的数据长度

重要提示2：解密后的数据长度的计算方式是：outlen=inlen-(inlen/225+1)*97


SM2_EncString函数

int SM2_EncString(char *InString,char *OutString,char *InPath);

功能：使用锁中的SM2密钥对输入的字符串进行加密

参数1－－InString(in)；要加密的字符串。

参数2――OutString(out)；返回加密后的数据，加密后的数据将会以16进制字符串的形式返回。

参数3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，OutString中包含有加密后的字符串；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

重要提示1：加密后的数据将会以16进制字符串的形式返回

重要提示2：加密后的字符串长度要大于要加密的字符串长度，所以一定要分配足够的空间给OutString

重要提示3：加密后的字符串长度的计算方式是：outlen=((inlen/128+1)*97+inlen)*2+1,返回的长度与SM2_EncBuf并不相同，因为它是以16进制的字符形式返回，并含结束字符串


SM2_DecString函数

int SM2_DecString(char *InString,char *OutString,char* pin,char *InPath)

功能：使用锁中的SM2密钥对输入的字符串进行解密

参数1－－InString(in)；要解密的字符串。

参数2――OutString(out)；返回解密后的字符串。

参数3――pin(in)；Pin码，只有Pin码正确才能进行解密

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，OutString中包含有解密后的字符串；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

重要提示1：解密后的字符串长度要小于加密后的字符串长度

重要提示2：解密后的字符串长度的计算方式是：outlen=inlen-(inlen/225+1)*97 其中inlen为要解密的字符串长度，不含结束字符串


签名及验证相关函数

1、 YtSign函数

2、 YtVerfiy函数

3、 YtSign_2函数

提示：SM2算法只支持版本或扩展大于或等于33的锁（即智能卡芯片）


YtSign函数

int YtSign(char *msg,char *OutSign,char* pin,char *InPath );

功能：使用锁对身份及信息进行数字签名

参数1――msg(in)；要签名的信息。

参数2――OutSign(out)；签名成功后，返回签名后的数据

参数3――pin(in)；Pin码，只有Pin码正确才能进行签名

参数4――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，OutSign中包含有签名后的数据；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示：使用设置在锁中的SM2密钥对及设置在锁中的用户身份对信息msg进行签名，返回签名后的数据

签名的流程如下：

1、对信息msg进行SM3国密HASH，得出HS值

2、然后将hash(msg)的结果送入到锁中进行数字签名。

3、在锁中先对设置在锁中的用户身份及设置在锁中的公钥进行hash，得出Z值

4、然后再在锁中对HS及Z值进行hash，得出E值

5，接着，再在锁中使用私钥对E值进行签名，并将签名后的结果返回。

提示：YtSign_2函数与YtSign函数不同之处在于前者是使用硬件芯片唯一ID作为签名唯一标志，后者是使用开发商设置在锁中的用户身份作为签名唯一标志


YtVerfiy函数

int YtVerfiy(char *id,char *msg,char *PubKeyX,char *PubKeyY,char *VerfiySign,BOOL *IsVailSign,char *InPath );

功能：使用锁校验身份与信息的签名值是否相符

参数1－－id(in)；签名人的身份。

参数2――msg(in)；要签名的信息。

参数 3――PubKeyX(in)；公钥X

参数4――PubKeyY(in)；公钥Y

参数5――VerfiySign(in)；待校验的签名

参数6――IsVailSign(out)；返回签名是否有效，如果签名有效，返回值；否则返回假

参数7――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，IsVailSi返回签名是否有效；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。


YtSign_2函数

int YtSign_2(char *msg,char *OutSign,char* pin,char *InPath );

功能：使用锁对锁的硬件芯片唯一ID及信息进行数字签名

参数1――msg(in)；要签名的信息。

参数2――OutSign(out)；签名成功后，返回签名后的数据

参数3――pin(in)；Pin码，只有Pin码正确才能进行签名

参数4――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，OutSign中包含有签名后的数据；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示：使用设置在锁中的SM2密钥对及锁的硬件芯片唯一ID对信息msg进行签名，返回签名后的数据

签名的流程如下：

1、对信息msg进行SM3国密HASH，得出HS值

2、然后将hash(msg)的结果送入到锁中进行数字签名。

3、在锁中先对锁的硬件芯片唯一ID及设置在锁中的公钥进行hash，得出Z值

4、然后再在锁中对HS及Z值进行hash，得出E值

5，接着，再在锁中使用私钥对E值进行签名，并将签名后的结果返回。

提示：YtSign_2函数与YtSign函数不同之处在于前者是使用硬件芯片唯一ID作为签名唯一标志，后者是使用开发商设置在锁中的用户身份作为签名唯一标志


Pin码相关函数

1、YtSetPin函数

提示：SM2算法只支持版本或扩展大于或等于33的锁（即智能卡芯片）


YtSetPin函数

int YtSetPin(char *old_pin,char *new_pin,char *InPath );

功能：设置加密锁的PIN码

参数1－－old_pin(in)；原PIN码。

参数2――new_pin(in)；新的PIN码，PIN码长度不能超过16个字符串，含结束字符串。

参数3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示1：进行私钥加密及数字签名时需要输入PIN码

提示2：初始PIN码为123

提示3：PIN码长度不能超过16个字符串，含结束字符串


初始化函数

1、ReSet函数


ReSet函数

int ReSet(char *InPath);

功能：用于对锁进行初始化工作
参数1――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示函数执行成功，若返回其它值，则表示方法失败，错误原因可以参见错误代码含义

提示1：只有锁的版本大于或等于9的才支持初始化功能

提示2：初始化成功后，所有的数据及读写密码均为0，注意，读写密码也均为00000000-0000000，而不出厂时的FFFFFFF-FFFFFFF

提示3：初始化函数并不能初始化增强算法


SYUNEW6A控件函数

SYUNEW3A控件方法及属性

使用我们提供的控件开发时，需要先添加控件：

VB、VC++：
在VB或VC++的部件库中选中Syunew3A1.0 type library，将其添加到控件箱中。

VFP：
运行vfp,单击“工具”--“选项”--“控件”，然后再单击Active控件，然后再在选定框中选取“S_simnew3 class”,然后再单击“设置为默认值”按钮，最后再单击“确定”。就可以使用Syunew3A控件了。在添加控件后，就可以在表单控件中将Syunew3A控件添加到工程中了。单击表单控件中的“查看类”，选取“Active控件”，找到“S_simnew3 class”控件 ,就可以将S_simnew3 class控件添加到工程中去。

DEPHI：
运行delphi,单击“component”--“import activex control”，然后列表框中找到Syunew3A 1.0 type library，然后再单击安装,选择包名,填写包名,控件就会被加到指定的包中,经编译后,。就可以使用Syunew3A控件了。在添加控件后，就可以在activex中找到, S_simnew3 class控件,并将其添加到工程中去。

1、查找锁方法

2、获取锁基本信息方法

3、读写储存器方法

4、增强算法方法

5、SM2国密算法

6、属性

7、初始化方法


查找锁函数

查找锁方法

在操作加密锁之前，必须要先调用查找锁方法来查找指定的加密锁，如果系统中有多个加密锁，可以使用一个循环来枚举系统上的所有加密锁，

1、FindPort方法


FindPort方法

功能：查找系统中是否存在第N 个加密锁，如果存在，则返回该加密锁所在的设备路径

参数1－－start； 要查找的第N个加密锁，例：当start=0时，指的是要查找第一个加密锁所在的设备路径，当start=1时，指的是要查找系统中的第二个加密锁所在的设备路径。

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁所在的设备路径。如果 LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义


获取锁基本信息方法

1、GetVersion方法

2、GetID_1方法

3、GetID_2方法

2、GetVersionEx方法

3、GetChipID方法


GetVersion方法

Integer GetVersion (InPath As String)

功能：返回指定加密锁的版本号

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁的版本号。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：版本大于或等于8的支持增强算法，版本大于或等于9的支持初始化功能


GetID_1方法

Long GetID_1(InPath As String)

功能：返回指定加密锁的 ID号的前4个字节；加密锁的ID号由8个字节组成，

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁的ID号的前4个字节。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：锁ID都是唯一的，每一把是唯一的，是指每一把锁的ID都不相同

提示2：ID唯一是指两个ID转化为16进制字符串后并连接起来后是唯一的


GetID_2方法

Long GetID_2(InPath As String)

功能：返回指定设备路径的加密锁的 ID号的后4个字节；加密锁的ID号由8个字节组成，

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁的ID号的后4个字节。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：锁ID都是唯一的，每一把是唯一的，是指每一把锁的ID都不相同

提示2：ID唯一是指两个ID转化为16进制字符串后并连接起来后是唯一的


GetVersionEx方法

Integer GetVersionEx (InPath As String)
功能：返回指定加密锁的扩展版本号

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁的扩展版本号。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示，扩展版本号大于或等于10的锁为2代锁，支持SM国密算法及可以获得锁的硬件芯片唯一ID


GetChipID方法

String GetID_1(InPath As String)

功能：返回指定设备路径的加密锁的硬件芯片唯一ID,

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为该加密锁的硬件芯片唯一ID。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示1：该函数只支持版本大于或等于33的智能卡芯片锁

提示2：硬件芯片唯一ID为字符串的形式，长度为33个字符，包含结束字符串

提示3：硬件芯片唯一ID是指芯片出厂自带的ID


读写储存器函数

读写储存器方法

网络授权型加密锁有494字节的储存器可以读写，其中读的次数没有限制，写的次数为10万次

1、YReadEx方法

2、YRead方法

3、YwriteEx方法

4、YWrite方法

5、GetBuf方法

6、SetBuf方法

7、YreadString方法

8、YWriteStirng方法

9、SetReadPassword方法

10、SetWritePassword方法


YReadEx方法

方法原型：YReadEx ( Address As Integer，m_len As Integer, Hkey As String, Lkey As String, InPath As String)As Integer

功能：从加密锁的指定储存空间地址读出数据，该函数用于读取一批数据

参数 1――Address；要读取的加密锁内部地址空间。

参数 2――m_len：要读取数据的长度

参数 3――HKey；读密码的高八位密码

参数 4――Lkey；读密码的低八位密码

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－如果返回结果为0，则表示方法执行成功，开发商可以调用GetBuf方法从数据缓冲区中取回数据。如果为其它值，则表示方法失败，错误原因可以参见错误代码含义。

提示1：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据。

提示2：开发商在调用 YReadEx方法后,应立即调用GetBuf方法从数据缓冲区中取回数据


YRead方法

方法原型：YRead ( Address As Integer， Hkey As String, Lkey As String, InPath As String)As Integer

功能：从加密锁的指定储存地址读取一个字节的数据。

参数 1――Address；要读取的加密锁内部地址。

参数 2――HKey；读密码的高八位密码

参数 3――Lkey；读密码的低八位密码

参数 4――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示函数执行成功，则返回结果为加密锁address的储存空间中储存的数据。如果LastError值为其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示1：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据。


YWriteEx方法

方法原形：YWriteEx(Address As Integer，m_len As Integer,　Hkey As String, Lkey As String, InPath As String)

功能：向加密锁内部的储存空间写入指定的数据，该函数用于写入一批数据

参数1――address；用户指定的加密锁内部地址空间的起始地址。

参数2――m_len：要写入的数据的长度

参数 3――HKey；写密码的高八位密码

参数4――Lkey；写密码的低八位密码

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

提示1：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中。

提示2：在调用YwriteEx前，需要要先调用SetBuf方法，将要写入到储存器的数据放置在该数据缓冲区中，然后调用 YwriteEx方法将数据缓冲区中的数据写入到储存器中。


YWrite方法

方法原形：YWrite(InData As Integer, Address As Integer,Hkey As String, Lkey As String, InPath As String)

功能：向加密锁内部的储存空间写入一个字节的数据

参数1――InData ；要写入到加密锁中的数据。

参数2――address；用户指定的加密锁内部地址空间的起始地址。

参数 3――HKey；写密码的高八位密码

参数4――Lkey；写密码的低八位密码

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

提示1：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中。


GetBuf方法

方法原形：GetBuf(pos As Integer) As Integer

功能：从数据缓冲区的指定位置取回数据，开发商在调用 YReadEx方法,应立即调用该方法从数据缓冲区中取回数据

参数1――要取出的数据在数据缓冲区的位置

返回结果－－若方法返回0，则表示方法执行成功，返回的对应的缓冲区的数据，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。


SetBuf方法

方法原形：SetBuf( Data As Integer, pos As Integer) As Integer

功能：设置数据缓冲区，开发商可以使用此方法将要写入到储存器的数据放置在该数据缓冲区中，然后调用 YWriteEx方法将数据缓冲区中的数据写入到储存器中。

参数1――要放置到数据缓冲区中的数据，会自动将整形转化为字节，

参数2――要放置到数据缓冲区中的位置

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义


YreadString方法

方法原型：YreadString ( Address As Integer，len As Integer, Hkey As String, Lkey As String, InPath As String) As String

功能：从加密锁的指定起始位置读取字符串。

参数 1――Address；要读出的字符串储存在加密锁的起始位置

参数 2――Len； 要读取的字符串的长度。

参数 3――HKey；读密码的高八位密码

参数 4――Lkey；读密码的低八位密码

参数 5――InPath (in)；加密锁所在的设备路径

返回结果－－如果 LastError的值为0，则表示方法执行成功，则返回结果为加密锁address的储存空间中储存的字符串。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义。

提示：在读加密锁的储存器空间时，需要输入读密码，所有加密锁出厂时的读密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确从储存器中读出数据。


YWriteStirng方法

方法原形：YWriteString(InString As integer, Address As Integer，Hkey As String, Lkey As String, InPath As String) AS Integer

功能：往加密锁内部的储存空间写入指定的数据。

参数１－－InString；要写入到加密锁储存空间的字符串。

参数2――address；用户指定的要写入加密锁内部地址的起始位置

参数 3――HKey；写密码的高八位密码

参数4――Lkey；写密码的低八位密码

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回写入到储存器的字符串的长度，在使用YreadStirng方法读字符串时，可以以此作为长度的参数。若返回其它值，则表示方法失败，错误原因可以参见错误代码含义。

提示：在写加密锁的储存器空间时，需要输入写密码，所有加密锁出厂时的写密码均为“FFFFFFFF”――“FFFFFFF”，如果密码错误，将不能正确地写数据到储存器中。


SetReadPassword

SetReadPassword方法

方法原形：SetReadPassword (W_Hkey As String, W_Lkey As String，new_Hkey As String, new_Lkey As String, InPath As String) As Integer

功能：设置加密锁的读密码

参数1－－W_Hkey；写密码的高八位。

参数2――W_Lkey；写密码的低八位。

参数 3――new_Hkey；要设置的新的读密码的高八位

参数4――new_Lkey；要设置的新的读密码的低八位

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。


SetWritePassword

SetWritePassword方法

方法原形：SetWritePassword (W_Hkey As String, W_Lkey As String，new_Hkey As String, new_Lkey As String, InPath As String) As Integer

功能：设置加密锁的写密码
参数１－－W_Hkey；写密码的高八位。

参数2――W_Lkey；写密码的低八位。

参数 3――new_Hkey；要设置的新的写密码的高八位

参数4――new_Lkey；要设置的新的写密码的低八位

参数5――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

注意：设置读密码是用“写”密码设置，而不原来的“读”密码


增强算法方法

1、SetCal_2方法

2、Cal方法

3、EncString方法

4、DecString方法

5、SetEncBuf方法

6、GetEncBuf方法


SetCal_2方法

方法原形： SetCal_2(Key As String, InPath As String) As Integer

功能：设置增强算法密钥

参数1—Key(in)；要设置的算法密钥

参数2――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

注意：密钥为不超过32个的0-F字符，例如：1234567890ABCDEF1234567890ABCDEF,不足32个字符的，系统会自动在后面补0


Cal方法

方法原形： Cal(InPath As String) As Integer

功能：对数据缓冲区的数据进行加密运算，并将其返回到数据缓冲区中

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－若方法返回 0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

提示1：在调用Cal函数之前，要先调用SetEncBuf,设置要加密的数据

提示2：调用Cal函数之后，要立即调用GetEncBuf将加密后的数据读出

提示3：增强算法是一个标准的TEA算法，Cal函数与TEA算法的加密过程相对应

提示4：Cal函数一次只能对8个字节进行加密，且必须为8的字节


EncString方法

方法原型： EncString(InString As String, InPath As String) As String

功能：使用增强算法对字符串进行加密

参数 1――InString；要加密的字符串

参数 2――InPath (in)；加密锁所在的设备路径

返回结果－－如果 LastError的值为0，则表示方法执行成功，则返回结果加密后的字符串。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义。

提示1：增强算法是一个标准的TEA算法,EcnString函数与TEA算法的加密过程相对应

提示2：要加密字符串以8个字节为一个分组；要加密的字符串少于8个字节时，不足的字节补数据0；要加密的字符串大于8个字节，但不是8的倍数时，多余的数据不作加密处理

提示3：字符串的加密过程，是先将字符串转化为字节数组，然后调用CAL函数对数据进行加密，加密后的数据将会以16进制字符串的形式返回，所以加密后的字符串的长度是原来要加密字符串的长度(含结束字符)的两倍，且至少不少于16个字符串，


DecString

DecString方法

方法原型： DecString(InString As String, Key As String) As String(重要，这个函数一般不要使用 )

功能：使用Tea算法对加密后的字符串进行解密，解密过程在Dll中进行，而非硬件中进行

参数 1――InString；要解密的字符串，这里的字符串必须是使用EncSring函数加密得到的字符串

参数 2――Key (in)；解密密钥

返回结果－－如果 LastError的值为0，则表示方法执行成功，则返回解密后的字符串。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义。

注意：这个函数一般不要使用，因为我们的DLL是固定的，且解密时要提供对应的解密密钥，所以容易被黑客捕获其加密密钥；如实际需要解密，可以在程序中直接使用TEA算法的解密代码，而不要使用这个DLL中提供的函数

提示1：这里的解密过程是在我们的Dll中进行，而非是硬件中进行

提示2：解密后的字符串的长度是原来字符串长度的2分之一

提示3：解密密钥必须要与加密密钥相对应

提示4、解密过程如下：先将16进制字符串转换成字节数组，然后调用CAL函数对数据进行解密，并将结果返回。


SetEncBuf方法

方法原形：SetEncBuf( Data As Integer, pos As Integer) As Integer

功能：设置要加密的数据，开发商可以使用此方法将要加密的数据设置在数据缓冲区中，然后调用 Cal方法对数据缓冲区中的数据进行加密。

参数1――要放置到数据缓冲区中的数据，会自动将整形转化为字节，

参数2――要放置到数据缓冲区中的位置

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义

提示：要设置的数据长度不能大于8，即pos不能大于7，pos起始位置为0


GetEncBuf方法

方法原形：GetEncBuf(pos As Integer) As Integer

功能：从数据缓冲区的指定位置取回加密后的数据，开发商在调用 Cal方法后,应立即调用该方法从数据缓冲区中取回加密后的数据

参数1――要取出的数据在数据缓冲区的位置

返回结果－－若方法返回0，则表示方法执行成功，返回的对应的缓冲区的数据，若返回其它值， 则表示方法失败，错误原因可以参见错误代码含义。

提示：要获取的数据长度不能大于8，即pos不能大于7，pos起始位置为0


SM2算法相关方法

SM2国密算法是在硬件部分增加了一个标准的SM2国密算法，开发商可以自定义密钥对，对数据进行加密运算或进行数据的签名及认证。

1、密钥相关方法

2、加解密相关方法

3、签名及验证相关方法

4、PIN码相关方法

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


密钥相关方法

1、StarGenKeyPair方法

2、GenPriKey属性

3、GenPubKeyX属性

4、GenPubKeyY属性

5、Set_SM2_KeyPair方法

6、GetPubKeyX方法

7、GetPubKeyY方法

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


StarGenKeyPair方法

方法原型： StarGenKeyPair(InPath As String) As Integer

功能：使用锁生成密钥对,在获取密钥对时，先要调用这个函数

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，开发商就可以通过GenPubKeyY属性，GenPubKeyX属性，GenPubKeyY属性来取得相应的私钥及公钥X、公钥Y；若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示1：在获取密钥对时，先要调用这个函数，然后就可以通过GenPubKeyY属性，GenPubKeyX属性，GenPubKeyY属性来取得相应的私钥及公钥X、公钥Y


Set_SM2_KeyPair方法

方法原型： Set_SM2_KeyPair(PriKey As String,PubKeyX As String,PubKeyY As String,sm2UserName As String,InPath As String) As Integer

功能：将密钥对设置到锁中

参数1－－PriKey(string)；要设置的密钥对中的私钥。

参数2――PubKeyX(string)；要设置的密钥对中的公钥部分的X坐标。

参数 3――PubKeyY(string)；要设置的密钥对中的公钥部分的Y坐标

参数 4――sm2UserName(string)；要设置到锁中的用户身份，主要是用于数字签名，以确定签名者的身份。

参数5――InPath (string)；加密锁所在的设备路径

返回结果－－若函数返回0或LastError属性为0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示：sm2UserName用户身份主要是用于数字签名，当使用锁对信息进行签名时，设置在锁中的签名会参与到签名中，以便识别签名者的身份


GetPubKeyX方法

方法原型： GetPubKeyX(InPath As String) As String

功能：返回设置在锁中的公钥X

参数 1――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回设置在锁中的公钥X；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。


GetPubKeyY方法

方法原型： GetPubKeyY(InPath As String) As String

功能：返回设置在锁中的公钥Y

参数 1――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回设置在锁中的公钥Y；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。


GetSm2UserName

GetSm2UserName方法

方法原型：GetSm2UserName(InPath As String) As String

功能：返回设置在锁中的用户身份

参数 1――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回设置在锁中的用户身份；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。

提示：sm2UserName用户身份主要是用于数字签名，验证者可以从锁中取出该身份，对签名后的信息进行验证是否该身份


加解密相关方法

1、SM2_EncString方法

2、SM2_DecString方法

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


SM2_EncString方法

方法原型： SM2_EncString(InString As String,InPath As String) As String

功能：使用锁中的SM2密钥对输入的字符串进行加密

参数1－－InString(string)；要加密的字符串。

参数2――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回加密后的字符串；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。

重要提示1：加密后的数据将会以16进制字符串的形式返回


SM2_DecString方法

方法原型： SM2_DecString(InString As String,Pin As String,InPath As String) As String

功能：使用锁中的SM2密钥对输入的字符串进行解密

参数1－－InString(string)；要解密的字符串。

参数2――pin(string)；Pin码，只有Pin码正确才能进行解密

参数 3――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回解密后的字符串；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。


签名及验证相关方法

1、 YtSign方法

2、 YtVerfiy方法

3、 YtSign_2方法

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


YtSign方法

方法原型： YtSign(msg As String,Pin As String,InPath As String) As String

功能：使用锁对身份及信息的进行数字签名

参数1――msg(string)；要签名的信息。

参数2――Pin(string)；Pin码，只有Pin码正确才能进行签名

参数3――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回签名后的字符串；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。

提示：使用设置在锁中的SM2密钥对设置在锁中的用户身份对信息msg进行签名，返回签名后的数据

签名的流程如下：

1、对信息msg进行SM3国密HASH，得出HS值

2、然后将hash(msg)的结果送入到锁中进行数字签名。

3、在锁中先对设置在锁中的用户身份及设置在锁中的公钥进行hash，得出Z值

4、然后再在锁中对HS及Z值进行hash，得出E值

5，接着，再在锁中使用私钥对E值进行签名，并将签名后的结果返回。

提示：YtSign_2方法与YtSign方法不同之处在于前者是使用硬件芯片唯一ID作为签名唯一标志，后者是使用开发商设置在锁中的用户身份作为签名唯一标志


YtVerfiy方法

方法原型： YtVerfiy(id As String,msg As String,PubKeyX As String,PubKeyY As String,VerfiySign As String,InPath As String) As Boolean

功能：使用锁校验身份与信息的签名值是否相符

参数1－－id(string)；签名人的身份。

参数2――msg(string)；要签名的信息。

参数 3――PubKeyX(string)；公钥X

参数4――PubKeyY(string)；公钥Y

参数5――VerfiySign(string)；待校验的签名

参数6――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回真表示签名有效；返回假表示签名无效。


YtSign方法

YtSign_2方法

方法原型： YtSign_2(msg As String,Pin As String,InPath As String) As String

功能：使用锁对锁的硬件芯片唯一ID及信息的进行数字签名

参数1――msg(string)；要签名的信息。

参数2――Pin(string)；Pin码，只有Pin码正确才能进行签名

参数3――InPath (string)；加密锁所在的设备路径

返回结果－－若LastError属性为0，则表示函数执行成功，函数返回签名后的字符串；若LastError属性不为0， 则表示函数失败，错误原因可以参见错误代码含义。

提示：使用设置在锁中的SM2密钥对及锁的硬件芯片唯一ID对信息msg进行签名，返回签名后的数据

签名的流程如下：

1、对信息msg进行SM3国密HASH，得出HS值

2、然后将hash(msg)的结果送入到锁中进行数字签名。

3、在锁中先对锁的硬件芯片唯一ID及设置在锁中的公钥进行hash，得出Z值

4、然后再在锁中对HS及Z值进行hash，得出E值

5，接着，再在锁中使用私钥对E值进行签名，并将签名后的结果返回。

提示：YtSign_2方法与YtSign方法不同之处在于前者是使用硬件芯片唯一ID作为签名唯一标志，后者是使用开发商设置在锁中的用户身份作为签名唯一标志


Pin码相关方法

1、YtSetPin方法

提示：SM2算法只支持版本或扩展版本大于或等于33的锁（即智能卡芯片）


YtSetPin方法

方法原型：YtSetPin(OldPin As String,NewPin As String,InPath As String) As Integer

功能：设置加密锁的PIN码

参数1－－OldPin(string)；原PIN码。

参数2――NewPin(string)；新的PIN码，PIN码长度不能超过16个字符串，含结束字符串。

参数3――InPath (string)；加密锁所在的设备路径

返回结果－－若函数返回0或LastError属性为0，则表示函数执行成功，若返回其它值， 则表示函数失败，错误原因可以参见错误代码含义。

提示1：进行私钥加密及数字签名时需要输入PIN码

提示2：初始PIN码为123

提示3：PIN码长度不能超过16个字符串，含结束字符串


属性

1、LastError属性

2、GenPriKey属性

3、GenPubKeyX属性

4、GenPubKeyY属性


LastError属性

LastError属性：返回最近的错误代码，如果为0，则表示方法执行成功。如果LastError值为其它值，则表示方法失败，错误代码含义如下：

-21 表示不能生成密钥对

-22 表示加密失败

-23 表示解密失败

-24 表示PIN码错误

-82 表示写数据到加密锁储存器时错误，可能是写密码错误；

-81 代表输入的地址空间超出

-47 代表进行读写字符串时，地址空间超出

-88 代表输入的地址空间超出

-92 代表不存在指定的加密锁

-93 代表操作加密锁时错误

-94 代表操作加密锁时错误

-83 表示从加密锁读取数据时错误，可能是读密码错误

-46 使用控件时，输入的字符不能是空字符串

-198 调用GetEncBuf或GetBuf时，长度超出

-199 调用SetEncBuf或SetBuf时，长度超出

-3000 代表分配内存失败


GenPriKey属性

GenPriKey 属性：返回从锁中生成的密钥对中的私钥，

提示：在之前要先调用StarGenKeyPair方法生成密钥对，


GenPubKeyX属性

GenPubKeyX 属性：返回从锁中生成的密钥对中的公钥X，

提示：在之前要先调用StarGenKeyPair方法生成密钥对，


GenPubKeyY属性

GenPubKeyY 属性：返回从锁中生成的密钥对中的公钥Y，

提示：在之前要先调用StarGenKeyPair方法生成密钥对，


初始化函数

初始化方法

1、ReSet方法


ReSet函数

ReSet方法

Integer ReSet(InPath As String)

功能：返回指定加密锁的版本号

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示1：锁的版本大于或等于8的支持增强算法

提示1：只有锁的版本大于或等于9的才支持初始化功能

提示2：初始化成功后，所有的数据及读写密码均为0，注意，读写密码也均为00000000-0000000，而不出厂时的FFFFFFF-FFFFFFF

提示3：初始化函数并不能初始化增强算法


错误码

-82 表示写数据到加密锁储存器时错误，可能是写密码错误；

-81 代表输入的地址空间超出

-47 代表进行读写字符串时，地址空间超出

-88 代表输入的地址空间超出

-92 代表不存在指定的加密锁

-93 代表操作加密锁时错误

-94 代表操作加密锁时错误

-83 表示从加密锁读取数据时错误，可能是读密码错误

-46 使用控件时，输入的字符不能是空字符串


固化算法函数

固化算法方法

加密锁内置固化的硬件加密算法：该算法一般是开发商唯一的，开发商唯一是指同一开发商相同，不同的开发商不相同，不同的加密算法，对于同一数据，加密的结果不相同。(算法也可以是每一把都是唯一的，这个需要在订货时告知我们)

1、sWriteEx方法

2、sWrite_2Ex方法

3、sWrite方法

4、sWrite_2方法

5、sRead方法


固化算法函数

加密锁内置固化的硬件加密算法：该算法一般是开发商唯一的，开发商唯一是指同一开发商相同，不同的开发商不相同，不同的加密算法，对于同一数据，加密的结果不相同。(算法也可以是每一把都是唯一的，这个需要在订货时告知我们)

1、sWriteEx函数

2、sWrite_2Ex函数

3、sWrite函数

4、sWrite_2函数

5、sRead函数


增强算法函数


FindPort_2函数

int FindPort_2( int start,DWORD in_data,DWORD verf_data,char *OutPath);

功能：查找系统中是否存在符合指定条件的第N个加密锁，如果存在，则返回该加密锁所在的设备路径，符合指定条件指的是：送入一个要加密的数据（in_data）让该加密进行加密运算，返回的结果与我们期待的加密结果相符(verf_data)

参数1－－start(in)； 要查找的第N个符合指定条件的加密锁，例：当start=0时，指的是要查找第一个符合指定条件的加密锁所在的设备路径，当start=1时，指的是要查找系统中的第二个符合指定条件的加密锁所在的设备路径。

参数 2――in_data(in)； 要送入到加密锁进行加密运算的数据，

参数 3――verf_data (in)； 要进行比较校验的数据，

参数 4――OutPath(out)；如果系统中存在第N个符合指定条件的加密锁，则该参数中包含有该加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，系统中存在着第N个符合指定条件的加密锁，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：如何确定in_data及verf_data参数呢？in_data可以随意输入，verf_data可以使用我们提供的开发工具获得，方法是在开发工具中输入in_data,然后，然后插入加密锁，然后单击进行加密运算，verf_data将会以十进制的形式返回到输出框中(提示，返回的数据有可能是负数)

如图：


FindPort_2方法

String FindPort_2( start AS Integer, in_data As Long, verf_data As Long)

功能：查找系统中是否存在符合指定条件的第N个加密锁，如果存在，则返回该加密锁所在的设备路径，符合指定条件指的是：当送入一个数据（in_data）让该加密进行加密运算后，返回的结果与我们期待的加密结果相符(verf_data)

参数1－－start； 要查找的第N个符合指定条件的加密锁，例：当start=0时，指的是要查找第一个符合指定条件的加密锁所在的设备路径，当start=1时，指的是要查找系统中的第二个符合指定条件的加密锁所在的设备路径。

参数2――in_data； 要送入到加密锁进行加密运算的数据，

参数3――verf_data ； 要进行比较校验的数据，

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为符合指定条件的加密锁所在的设备路径。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：如何确定in_data及verf_data参数呢？in_data可以随意输入，verf_data可以使用我们提供的开发工具获得，方法是在开发工具中输入in_data,然后，然后插入加密锁，然后单击进行加密运算，verf_data将会以十进制的形式返回到输出框中(提示，返回的数据有可能是负数)

如图：


Get_SM2_PubKey方法


sRead函数

int sRead( DWORD *out_data,char *Path);

功能：从指定的加密锁中读出加密或解密后的数据，
参数1－－out_data (out)；若函数成功执行，该参数中包含有加密或解密后的数据

参数2――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：sRead一般只是在调用swrite或swrite_2后才调用，且一般是立即调用。


sRead方法

Long sRead(Path As String)

功能：从指定的加密锁中读出加密或解密后的数据，

参数1――InPath (in)；加密锁所在的设备路径

返回结果－－如果LastError的值为0，则表示方法执行成功，则返回结果为加密或解密后的数据。如果LastError值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：sRead一般只是在调用swrite或swrite_2后才调用，且一般是立即调用。


sWrite函数

int sWrite( DWORD in_data,char *Path);

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行加密运算

参数1－－in_data (in)； 要进行加密运算的in_data

参数 2――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：调用swrite函数将数据送入到锁中进行加密后，一般要立即调用sread函数将加密后的数据取出，中间不要插入任何操作锁的函数，如果是多线程的话，可以使用我们另一个函数，sWriteEx，在加密的同时将结果返回。


sWrite_2函数

int sWrite_2( DWORD in_data,char *Path);

功能：将指定的数据送入到指定加密锁中，然后让该加密锁对该数据进行解密运算

参数1－－in_data (in)； 要进行加密运算的in_data

参数 2――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：调用swrite_2函数将数据送入到锁中进行解密后，一般要立即调用sread函数将解密后的数据取出，中间不要插入任何操作锁的函数，如果是多线程的话，可以使用我们另一个函数：sWrite_2Ex，在解密的同时将结果返回。


sWrite_2方法

Integer sWrite_2( in_data As Long, Path As String)

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行解密运算

参数１－－in_data ； 要进行加密运算的in_data

参数2――InPath ；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：调用swrite函数将数据送入到锁中进行加密后，一般要立即调用sread函数将加密后的数据取出，中间不要插入任何操作锁的函数，如果是多线程的话，可以使用我们另一个函数，sWriteEx，在加密的同时将结果返回。


sWrite_2Ex函数

int sWrite_2Ex( DWORD in_data,DWORD *out_data,char *Path);

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行解密运算,并返回解密后的结果

参数1－－in_data (in)； 要进行解密运算的in_data

参数1－－out_data (out)； 解密后的结果的out_data

参数 3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：sWrite_2Ex与sWrite_2最大的不同，是sWrite_2Ex立即将解密后的数据返回，而sWrite_2则只是将数据送到加密锁中解密，并不立即返回，要用sRead将解密的结果返回


sWrite_2Ex方法

Long sWrite_2Ex( in_data As Long, Path As String)

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行解密运算,并将结果返回

参数１－－in_data ； 要进行解密运算的in_data

参数2――InPath ；加密锁所在的设备路径

返回结果－－如果LastError的值为0，表示方法执行成功，返回结果是加密后结果，如果LastError的值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：sWrite_2Ex与sWrite_2最大的不同，是sWrite_2Ex立即将解密后的数据返回，而sWrite_2则只是将数据送到加密锁中解密，并不立即返回，要用sRead将解密的结果返回


sWrite方法

Integer sWrite( in_data As Long, Path As String)

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行加密运算

参数１－－in_data ； 要进行加密运算的in_data

参数2――InPath ；加密锁所在的设备路径

返回结果－－若方法返回0，则表示方法执行成功，若返回其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：调用swrite函数将数据送入到锁中进行加密后，一般要立即调用sread函数将加密后的数据取出，中间不要插入任何操作锁的函数，如果是多线程的话，可以使用我们另一个函数，sWriteEx，在加密的同时将结果返回。


sWriteEx函数

int sWriteEx( DWORD in_data,DWORD *out_data,char *Path);

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行加密运算,并返回加密后的结果

参数1－－in_data (in)； 要进行加密运算的in_data

参数1－－out_data (out)； 加密后的结果的out_data

参数 3――InPath (in)；加密锁所在的设备路径

返回结果－－若函数返回 0，则表示函数执行成功，若返回其它值，则表示函数失败，错误原因可以参见错误代码含义。

提示：sWriteEx与sWrite最大的不同，是sWriteEx立即将加密后的数据返回，而sWrite则只是将数据送到加密锁中加密，并不立即返回，要用sRead将加密的结果返回


sWriteEx方法

Long sWriteEx( in_data As Long, Path As String)

功能：将指定的数据送入到加密锁中，然后让该加密锁对该数据进行加密运算,并将结果返回

参数１－－in_data ； 要进行加密运算的in_data

参数2――InPath ；加密锁所在的设备路径

返回结果－－如果LastError的值为0，表示方法执行成功，返回结果是加密后结果，如果LastError的值为其它值，则表示方法失败，错误原因可以参见错误代码含义

提示：sWriteEx与sWrite最大的不同，是sWriteEx立即将加密后的数据返回，而sWrite则只是将数据送到加密锁中加密，并不立即返回，要用sRead将加密的结果返回


YT_GenKeyPair方法