关于数字钱包加密技术的研究

现今,区块链技术盛行,区块链成为人们谈论的热点,既然如此精彩,我们这些技术迷怎能错过,随着慢慢学习,对分布式数据存储、共识机制、加密算法有了相应的了解,下面我们来讨论下加密算法ECC。

ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点G,并选取一个整数k,很容易求解K=kG(注意根据kG求解出来的K也是椭圆曲线上的一个点);反过来,在椭圆曲线上给定两个点K和G,若使K=kG,求整数k是一个难题。ECC就是建立在此数学难题之上,这一数学难题称为椭圆曲线离散对数问题。其中椭圆曲线上的点K则为公钥,整数k则为私钥。

现在我们描述一个利用椭圆曲线进行加密通信的过程:

1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。

2、用户A选择一个私有密钥k,并生成公开密钥K=kG。

3、用户A将Ep(a,b)和点K,G传给用户B。

4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数r。

5、用户B计算点C1=M+rK;C2=rG。

6、用户B将C1、C2传给用户A。

7、用户A接到信息后,计算C1-kC2,结果就是点M。因为 C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M

      再对点M进行解码就可以得到明文。

近来公司开发了一款数字加密钱包的硬件设备,具有生成随机数,对数据生成摘要,对数据加密、解密、签名,验签,密钥导入,密钥存储,对存储密钥备份和恢复等功能。详细sdk接口如下:

1int  fsl_sys_init();

功能:系统初始化连接到usb

参数: 无

返回值:0:返回成功  -1返回失败

 

2int  fsl_sys_close();

功能:关闭usbkey的连接

参数: 无

返回值:0:返回成功  -1返回失败

 

3int  fsl_download();

功能:让芯片进入下载模式

参数: 无

返回值:0:返回成功  -1返回失败

 

4int  fsl_connect();

功能:连接usb key的channel

参数: 无

返回值:usb channel 从0开始

5int  fsl_disconnect(uint8_t ch);

功能:断开连接usb key的channel

参数: ch  usb通道号

返回值:usb channel 从0开始

 

6int  fsl_get_random(uint8_t ch, uint8_t *buf, uint8_t len);

功能:获取随机数

参数: ch  usb通道号

       buf  存储随机数的缓冲

       len   buf的长度

返回值:0:成功 -1:失败

 

7int  fsl_get_factory_code(uint8_t ch, uint8_t *buf, uint8_t len);

功能:获取设备码

参数: ch  usb通道号

       buf  存储设备码的缓冲

       len   buf的长度

返回值:16:设备码长度   -1:失败

 

 

8int  fsl_get_version(uint8_t ch, uint8_t *buf, uint8_t len);

功能:获取sdk版本号

参数: ch  usb通道号

       buf  存储版本号的缓冲

       len   buf的长度

返回值:4:版本号长度   -1:失败

 

9int  fsl_gen_cipher_key(uint8_t ch, uint8_t len);

功能:在key内部产生对称加密密钥

参数: ch   usb通道号

       len  对称密钥的长度

返回值:0:成功   -1:失败

 

10int  fsl_des_encrypt(uint8_t ch, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:DES加密函数

参数: ch   usb通道号

       pattern_type  加密模式(EBC、CBC)

       src  加密原文

       src_len 原文长度

       dst  密文缓冲

       dst_len 密文存储长度

返回值:密文实际长度

 

11int  fsl_des_decrypt(uint8_t ch, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:DES解密函数

参数: ch   usb通道号

       pattern_type  加密模式(EBC、CBC)

       src  解密密文

       src_len 密文长度

       dst  明文缓冲

       dst_len 明文存储长度

返回值:明文实际长度

 

12int  fsl_sm1_encrypt(uint8_t ch, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:SM1加密函数

参数: ch   usb通道号

       pattern_type  加密模式(EBC、CBC)

       src  加密原文

       src_len 原文长度

       dst  密文缓冲

       dst_len 密文存储长度

返回值:密文实际长度

 

13 int  fsl_sm1_decrypt(uint8_t ch, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:SM1解密函数

参数: ch   usb通道号

       pattern_type  加密模式(EBC、CBC)

       src  解密密文

       src_len 密文长度

       dst  明文缓冲

       dst_len 明文存储长度

返回值:明文实际长度

 

14 int  fsl_aes_encrypt(uint8_t ch, fsl_aes_type_t aes_type, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:AES加密函数

参数: ch   usb通道号

       pattern_type  加密模式(EBC、CBC)

       src  加密原文

       src_len 原文长度

       dst  密文缓冲

       dst_len 密文存储长度

返回值:密文实际长度

 

15 int  fsl_aes_decrypt(uint8_t ch, fsl_aes_type_t aes_type, fsl_pattern_type_t pattern_type, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:AES解密函数

参数: ch   usb通道号

       aes_type 加密位数

       pattern_type  加密模式(EBC、CBC)

       src  解密密文

       src_len 密文长度

       dst  明文缓冲

       dst_len 明文存储长度

返回值:明文实际长度

 

16int  fsl_sha1_init(uint8_t ch);

功能:sha1初始化

参数: ch   usb通道号

返回值:0:成功

 

17int  fsl_sha1_update(uint8_t ch,  uint8_t *src, uint16_t src_len);

功能:sha1 update

参数: ch   usb通道号

       src   内容

       src_len 内容长度

返回值:0:成功

 

18int  fsl_sha1_final(uint8_t ch,  uint8_t *dst, uint16_t dst_len);

功能:sha1 final

参数: ch   usb通道号

       dst   存储sha1后的值

       _len  存储的长度

返回值:dst的实际长度

 

19int  fsl_sha256_init(uint8_t ch);

功能:sha256初始化

参数: ch   usb通道号

返回值:0:成功

 

20int  fsl_sha256_update(uint8_t ch,  uint8_t *src, uint16_t src_len);

功能:sha256 update

参数: ch   usb通道号

       src   内容

       src_len 内容长度

返回值:0:成功

 

21int  fsl_sha256_final(uint8_t ch,  uint8_t *dst, uint16_t dst_len);

功能:sha256 final

参数: ch   usb通道号

       dst   存储sha1后的值

       _len  存储的长度

返回值:dst的实际长度

 

22int  fsl_gen_rsa_key(uint8_t ch, fsl_rsa_type_t rsa_type);

功能:在key内部产生rsa密钥对

参数: ch   usb通道号

       len  对称密钥的长度

返回值:0:成功   -1:失败

 

23int  fsl_get_rsa_public_key(uint8_t ch, uint8_t *rsa_n_key, int len);

功能:获取key内存中生成的rsa密钥对的公钥

参数: ch   usb通道号

       rsa_n_key   用户存储rsa公钥的缓冲

       len  缓冲的长度

返回值:rsa公钥的长度

 

24int  fsl_rsa_encrypt(uint8_t ch, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

 

功能:RSA加密函数

参数: ch   usb通道号

       src  加密原文

       src_len 原文长度

       dst  密文缓冲

       dst_len 密文存储长度

返回值:密文实际长度

 

25int  fsl_rsa_decrypt(uint8_t ch, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:RSA解密函数

参数: ch   usb通道号

       src  解密密文

       src_len 密文长度

       dst  明文缓冲

       dst_len 明文存储长度

返回值:明文实际长度

 

26int  fsl_rsa_sign(uint8_t ch, uint8_t *digest, uint16_t digest_len, uint8_t *signature, uint16_t signature_len);

功能:RSA签名函数

参数: ch    usb通道号

       digest 摘要数据

       digest_len 摘要长度

       signature  存储签名后的数据的缓冲

       signature_len 缓冲的长度

返回值 签名数据长度

 

27int  fsl_rsa_verify(uint8_t ch, uint8_t *digest, uint16_t digest_len, uint8_t *signature, uint16_t signature_len);

功能:RSA验签函数

参数: ch    usb通道号

       digest 摘要数据

       digest_len 摘要长度

       signature  签名数据

       signature_len 签名长度

返回值 0:成功 -1:失败

 

28int  fsl_gen_ecc_key(uint8_t ch);

功能:在key内部产生ECC密钥对

参数: ch   usb通道号

返回值:0:成功   -1:失败

 

29int  fsl_get_ecc_public_key(uint8_t ch, uint8_t *ecc_g_key, int len);

功能:在key内部产生ECC密钥对

参数: ch   usb通道号

返回值:0:成功   -1:失败

 

30 int  fsl_ecc_encrypt(uint8_t ch, uint8_t *src, uint16_t src_len, uint8_t *point_x, uint8_t *point_y, uint8_t *dst, uint16_t dst_len);

功能:ECC加密函数

参数: ch   usb通道号

       src  加密原文

       src_len 原文长度

       point_x ecc曲线点x坐标

       point_y ecc曲线点y坐标

       dst  密文缓冲

       dst_len 密文存储长度

返回值:密文实际长度

*/

31int  fsl_ecc_decrypt(uint8_t ch, uint8_t *point_x, uint8_t *point_y, uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_len);

功能:ECC解密函数

参数: ch   usb通道号

       point_x ecc曲线点x坐标

       point_y ecc曲线点y坐标

       src  解密密文

       src_len 密文长度

       dst  明文缓冲

       dst_len 明文存储长度

返回值:明文实际长度

 

32int  fsl_ecc_sign(uint8_t ch, uint8_t *digest, uint16_t digest_len, uint8_t *signature, uint16_t signature_len);

功能:ECC签名函数

参数: ch    usb通道号

       digest 摘要数据

       digest_len 摘要长度

       signature  存储签名后的数据的缓冲

       signature_len 缓冲的长度

返回值 签名数据长度

 

33int  fsl_ecc_verify(uint8_t ch, uint8_t *digest, uint16_t digest_len, uint8_t *signature, uint16_t signature_len);

功能:ECC验签函数

参数: ch    usb通道号

       digest 摘要数据

       digest_len 摘要长度

       signature  签名数据

       signature_len 签名长度

返回值 0:成功 -1:失败

 

34int  fsl_login(uint8_t ch, uint8_t *auth_key);

功能:登录函数

参数: ch    usb通道号

       auth_key  6位登录密码

返回值 0:成功 -1:失败

/*!

35int  fsl_logout(uint8_t ch);

功能:签出函数

参数: ch    usb通道号

返回值 0:成功 -1:失败

 

36int  fsl_load_cipher_key(uint8_t ch, uint8_t store_idx);

功能:从存储区加载对称密钥到内存中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

37int  fsl_store_cipher_key(uint8_t ch, uint8_t store_idx);

功能:从内存中把对称密钥保存到存储中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

38int  fsl_load_rsa_key(uint8_t ch, uint8_t store_idx);

功能:从存储区加载rsa密钥到内存中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

39int  fsl_store_rsa_key(uint8_t ch, uint8_t store_idx);

功能:从内存中把rsa密钥保存到存储中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

40int  fsl_load_ecc_key(uint8_t ch, uint8_t store_idx);

功能:从存储区加载ecc密钥到内存中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

41int  fsl_store_ecc_key(uint8_t ch, uint8_t store_idx);

功能:从内存中把ecc密钥保存到存储中

参数: ch    usb通道号

       store_idx 存储序号

返回值 0:成功 -1:失败

注意:必须先登录

 

42int  fsl_import_cipher_key(uint8_t ch, uint8_t *auth_key, uint8_t *key, uint16_t key_len);

功能:导入对称密钥到内存中

参数: ch       usb通道号

       auth_key 认证密码

       key      对称密钥

       key_len   对称密钥长度

返回值 0:成功 -1:失败

注意:必须先登录

 

43int  fsl_import_rsa_key(uint8_t ch, uint8_t *auth_key, fsl_rsa_type_t rsa_type, uint8_t *rsa_n, uint16_t rsa_n_len, uint8_t *rsa_d, uint16_t rsa_d_len);

功能:导入rsa密钥到内存中

参数: ch        usb通道号

       auth_key  认证密码

       rsa_type   rsa位数

       rsa_n      rsa公钥

       rsa_n_len  rsa公钥长度

       rsa_d,     rsa私钥

       rsa_d_len  rsa私钥长度

返回值 0:成功 -1:失败

注意:必须先登录

*/

44int  fsl_import_ecc_key(uint8_t ch, uint8_t *auth_key, uint8_t *ecc_g, uint16_t ecc_g_len, uint8_t *ecc_d, uint16_t ecc_d_len);

功能:导入ecc密钥到内存中

参数: ch        usb通道号

       auth_key  认证密码

       ecc_g,     ecc公钥

       ecc_g_len  ecc公钥长度

       ecc_d,     ecc私钥

       ecc_d_len  ecc私钥长度

返回值 0:成功 -1:失败

注意:必须先登录

 

45int  fsl_import_auth_key(uint8_t ch, uint8_t *auth_key);

功能:导入认证密码到key存储中

参数: ch        usb通道号

       auth_key  认证密码

返回值 0:成功 -1:失败

注意:只有新key才能使用一次

 

46int  fsl_update_auth_key(uint8_t ch, uint8_t *auth_key, uint8_t *key, uint16_t key_len);

功能:导入认证密码到key存储中

参数: ch        usb通道号

       auth_key  原认证密码

       key       新的认证密码

       key_len    新的认证密码长度必须为6

返回值 0:成功 -1:失败

注意:必须先登录

 

47int  fsl_export_key(uint8_t ch, uint8_t *auth_key, fsl_store_type_t store_type, uint8_t idx, uint8_t *key, uint16_t key_len);

功能:从key存储中导出key到外部备份

参数: ch        usb通道号

       auth_key  认证密码

       store_type  存储类型 对称型和非对称型

       key       导出密钥缓冲

       key_len    密钥缓冲长度

返回值 0:成功 -1:失败

注意:必须先登录,导出的key是加密后的数据,对称和非对称密钥存储区各有32个

 

48int  fsl_import_key(uint8_t ch, uint8_t *auth_key, uint8_t *key, uint16_t key_len);

功能:导入从key备份出来的密钥到key存储中

参数: ch        usb通道号

       auth_key  认证密码

       key       密钥

       key_len    密钥长度

返回值 0:成功 -1:失败

注意:必须先登录

 

49int  fsl_get_init_flag();

功能:判断key是否初始化过

返回值:0:未初始化 1:已经初始化

 

50int   fsl_write_user_data(uint8_t ch, uint8_t *src, uint8_t src_len);

功能:写自定义数据到key

参数:ch   usb通道号

      src  写入数据

      src_len 写入数据长度

返回值 0:成功 -1 失败

注意:必须先登录

 

 

51、int   fsl_read_user_data(uint8_t ch, uint8_t *dst, uint8_t dst_len);

功能:从key中读取自定义数据

参数:ch   usb通道号

      dst  读出数据

      dst_len 读出数据缓冲长度

返回值: 实际读出长度

注意:必须先登录

 

52int  fsl_hex2str(char *src, int src_len, uint8_t* dst, int dst_len);

功能:16进制数据转换成2进制

返回值 2进制长度

 

53int  fsl_str2hex(uint8_t* src, int src_len, char *dst, int dst_len);

功能:2进制数据转换成16进制

返回值 16进制长度

 

54int  fsl_pkcs5_padding_encode(uint8_t *src, int src_len, uint8_t* dst, int dst_len, int block_size);

功能:pkcs5补齐

参数: src        待补齐数据

       src_len     待补齐数据长度

       dst        补齐后的数据

       dst_len    预补齐后数据的长度

       block_size  补齐模长

返回值 实际补齐后数据的长度

 

55 int fsl_pkcs5_padding_decode(uint8_t *src, int src_len, uint8_t* dst, int dst_len, int block_size);

功能:还原pkcs5补齐数据

参数: src        补齐的数据

       src_len     补齐数据长度

       dst        还原的数据

       dst_len    预还原后数据的长度

       block_size  补齐模长

返回值 实际还原后数据的长度

 

56int  fsl_rsa_pkcs1_padding_encode(uint8_t ch, fsl_rsa_type_t rsa_type, uint8_t *to, int tlen, const uint8_t *from, int flen);

功能:pkcs1补齐

参数:

       ch        usb通道号

       rsa_type    rsa位数

       to         补齐后数据

       tlen       预补齐数据长度

       from      待补齐数据

       flen       待补齐数据长度

返回值 实际补齐后数据的长度

 

57int  fsl_rsa_pkcs1_padding_decode(fsl_rsa_type_t rsa_type, uint8_t *to, int tlen, const uint8_t *from, int flen);

功能:还原pkcs1补齐数据

参数: rsa_type    rsa位数

       to         还原后数据

       tlen       预还原数据长度

       from      补齐数据

       flen       补齐数据长度

返回值 实际还原后数据的长度

 

58void  fsl_set_log_level(int level);

功能:设置日志等级

参数:level  1-7级

你可能感兴趣的:(数字钱包加密)