现今,区块链技术盛行,区块链成为人们谈论的热点,既然如此精彩,我们这些技术迷怎能错过,随着慢慢学习,对分布式数据存储、共识机制、加密算法有了相应的了解,下面我们来讨论下加密算法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接口如下:
1、int fsl_sys_init();
功能:系统初始化连接到usb
参数: 无
返回值:0:返回成功 -1返回失败
2、int fsl_sys_close();
功能:关闭usbkey的连接
参数: 无
返回值:0:返回成功 -1返回失败
3、int fsl_download();
功能:让芯片进入下载模式
参数: 无
返回值:0:返回成功 -1返回失败
4、int fsl_connect();
功能:连接usb key的channel
参数: 无
返回值:usb channel 从0开始
5、int fsl_disconnect(uint8_t ch);
功能:断开连接usb key的channel
参数: ch usb通道号
返回值:usb channel 从0开始
6、int fsl_get_random(uint8_t ch, uint8_t *buf, uint8_t len);
功能:获取随机数
参数: ch usb通道号
buf 存储随机数的缓冲
len buf的长度
返回值:0:成功 -1:失败
7、int fsl_get_factory_code(uint8_t ch, uint8_t *buf, uint8_t len);
功能:获取设备码
参数: ch usb通道号
buf 存储设备码的缓冲
len buf的长度
返回值:16:设备码长度 -1:失败
8、int fsl_get_version(uint8_t ch, uint8_t *buf, uint8_t len);
功能:获取sdk版本号
参数: ch usb通道号
buf 存储版本号的缓冲
len buf的长度
返回值:4:版本号长度 -1:失败
9、int fsl_gen_cipher_key(uint8_t ch, uint8_t len);
功能:在key内部产生对称加密密钥
参数: ch usb通道号
len 对称密钥的长度
返回值:0:成功 -1:失败
10、int 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 密文存储长度
返回值:密文实际长度
11、int 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 明文存储长度
返回值:明文实际长度
12、int 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 明文存储长度
返回值:明文实际长度
16、int fsl_sha1_init(uint8_t ch);
功能:sha1初始化
参数: ch usb通道号
返回值:0:成功
17、int fsl_sha1_update(uint8_t ch, uint8_t *src, uint16_t src_len);
功能:sha1 update
参数: ch usb通道号
src 内容
src_len 内容长度
返回值:0:成功
18、int fsl_sha1_final(uint8_t ch, uint8_t *dst, uint16_t dst_len);
功能:sha1 final
参数: ch usb通道号
dst 存储sha1后的值
_len 存储的长度
返回值:dst的实际长度
19、int fsl_sha256_init(uint8_t ch);
功能:sha256初始化
参数: ch usb通道号
返回值:0:成功
20、int fsl_sha256_update(uint8_t ch, uint8_t *src, uint16_t src_len);
功能:sha256 update
参数: ch usb通道号
src 内容
src_len 内容长度
返回值:0:成功
21、int fsl_sha256_final(uint8_t ch, uint8_t *dst, uint16_t dst_len);
功能:sha256 final
参数: ch usb通道号
dst 存储sha1后的值
_len 存储的长度
返回值:dst的实际长度
22、int fsl_gen_rsa_key(uint8_t ch, fsl_rsa_type_t rsa_type);
功能:在key内部产生rsa密钥对
参数: ch usb通道号
len 对称密钥的长度
返回值:0:成功 -1:失败
23、int 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公钥的长度
24、int 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 密文存储长度
返回值:密文实际长度
25、int 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 明文存储长度
返回值:明文实际长度
26、int 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 缓冲的长度
返回值 签名数据长度
27、int 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:失败
28、int fsl_gen_ecc_key(uint8_t ch);
功能:在key内部产生ECC密钥对
参数: ch usb通道号
返回值:0:成功 -1:失败
29、int 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 密文存储长度
返回值:密文实际长度
*/
31、int 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 明文存储长度
返回值:明文实际长度
32、int 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 缓冲的长度
返回值 签名数据长度
33、int 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:失败
34、int fsl_login(uint8_t ch, uint8_t *auth_key);
功能:登录函数
参数: ch usb通道号
auth_key 6位登录密码
返回值 0:成功 -1:失败
/*!
35、int fsl_logout(uint8_t ch);
功能:签出函数
参数: ch usb通道号
返回值 0:成功 -1:失败
36、int fsl_load_cipher_key(uint8_t ch, uint8_t store_idx);
功能:从存储区加载对称密钥到内存中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
37、int fsl_store_cipher_key(uint8_t ch, uint8_t store_idx);
功能:从内存中把对称密钥保存到存储中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
38、int fsl_load_rsa_key(uint8_t ch, uint8_t store_idx);
功能:从存储区加载rsa密钥到内存中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
39、int fsl_store_rsa_key(uint8_t ch, uint8_t store_idx);
功能:从内存中把rsa密钥保存到存储中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
40、int fsl_load_ecc_key(uint8_t ch, uint8_t store_idx);
功能:从存储区加载ecc密钥到内存中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
41、int fsl_store_ecc_key(uint8_t ch, uint8_t store_idx);
功能:从内存中把ecc密钥保存到存储中
参数: ch usb通道号
store_idx 存储序号
返回值 0:成功 -1:失败
注意:必须先登录
42、int 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:失败
注意:必须先登录
43、int 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:失败
注意:必须先登录
*/
44、int 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:失败
注意:必须先登录
45、int fsl_import_auth_key(uint8_t ch, uint8_t *auth_key);
功能:导入认证密码到key存储中
参数: ch usb通道号
auth_key 认证密码
返回值 0:成功 -1:失败
注意:只有新key才能使用一次
46、int 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:失败
注意:必须先登录
47、int 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个
48、int 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:失败
注意:必须先登录
49、int fsl_get_init_flag();
功能:判断key是否初始化过
返回值:0:未初始化 1:已经初始化
50、int 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 读出数据缓冲长度
返回值: 实际读出长度
注意:必须先登录
52、int fsl_hex2str(char *src, int src_len, uint8_t* dst, int dst_len);
功能:16进制数据转换成2进制
返回值 2进制长度
53、int fsl_str2hex(uint8_t* src, int src_len, char *dst, int dst_len);
功能:2进制数据转换成16进制
返回值 16进制长度
54、int 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 补齐模长
返回值 实际还原后数据的长度
56、int 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 待补齐数据长度
返回值 实际补齐后数据的长度
57、int 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 补齐数据长度
返回值 实际还原后数据的长度
58、void fsl_set_log_level(int level);
功能:设置日志等级
参数:level 1-7级