打印
[应用相关]

基于 STM32 加密库开发比特币应用的补充 说明

[复制链接]
2177|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
9dome猫|  楼主 | 2020-10-23 18:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比特币是一个基于区块链和密码技术的应用。本文针对 STM32 客户的反馈,对那些使用 STM32 加密库开发比特币应用作了
一些补充的技术说明。

使用特权

评论回复
沙发
9dome猫|  楼主 | 2020-10-23 18:47 | 只看该作者
STM32 加密库
STM32 加密库提供对称加解密,非对称加解密,以及 HASH 算法,并通过了 CAVP FIPS 认证,可使用在各类安全相关的应
用。
对称加解密算法支持 AES、DES、3DES、RC5、Chacha20、Poly1305。其中针对特定算法,如 AES,又支持多种加密模式
如 ECB、CBC、CTR、GCM、CCM、XTS、Cipher-wrap 等。 非对称加解密算法支持 RSA、ECC。Hash 算法支持 SHA1、SHA-224、SHA-256、SHA-384、SHA-512、MD5。
STM32 加密库分为硬件加速和纯固件实现两种。纯固件实现可以运行在所有的 STM32 系列上。
STM32 加密库可以通过访问 www.st.com ,在主页中的搜索框里输入 cryptolib 得到页面链接。加密库下载需要批准,请在
线填写申请后等待邮件通知,一般很快就可以得到回复。

使用特权

评论回复
板凳
9dome猫|  楼主 | 2020-10-23 18:49 | 只看该作者
STM32 TRNG 真随机数
STM32 真随机数(TRNG)基于物理噪声源生成随机数,提供了高随机性,为不少算法特别是椭圆曲线提供了坚实的基础。
随机数通过了 AIS-31 PTG.2 测试。

使用特权

评论回复
地板
9dome猫|  楼主 | 2020-10-23 18:51 | 只看该作者
比特币中的加解密算法
比特币加解密相关的算法主要是两类,椭圆曲线 ECC 以及 HASH 算法。比特币使用椭圆曲线签名和验签算法来核实比特币交
易的可靠性,以及辨别区块链中比特币的归属地址。HASH 算法除了用在椭圆曲线签名、验证,比特币地址校验,还利用该
算法的单向性,创造出比特币的挖矿机制。HASH 没有什么特别,将不在本文补充说明。

使用特权

评论回复
5
9dome猫|  楼主 | 2020-10-23 18:54 | 只看该作者
比特币的椭圆曲线
比特币的椭圆曲线是个小众曲线,不是常见的 NIST P192、P256 和 P384,而是 SECP256。根据它的规范和 STM32 加密库
的代码库的参数格式,比特币的椭圆曲线参数可以表示如下:

使用特权

评论回复
6
9dome猫|  楼主 | 2020-10-23 18:56 | 只看该作者
/* coefficient a*/
const uint8_t secp256_a[] =
{
0x00
};
/* coefficient b */
const uint8_t secp256_b[] =
{
0x7
};
/* prime modulus p*/
const uint8_t secp256_p[] =
{
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
0xff,0xfc,0x2f
};
/* order n*/
const uint8_t secp256_n[] =
{
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xfe,0xba,0xae,0xdc,0xe6,0xaf,0x48,0xa0,0x3b,0xbf,0xd2,0x5e,0x8c,0xd0,
0x36,0x41,0x41

};
/* base point Gx*/
const uint8_t secp256_Gx[] =
{
0x79,0xbe,0x66,0x7e,0xf9,0xdc,0xbb,0xac,0x55,0xa0,0x62,0x95,0xce,0x87,
0x0b,0x07,0x02,0x9b,0xfc,0xdb,0x2d,0xce,0x28,0xd9,0x59,0xf2,0x81,0x5b,0x16,
0xf8,0x17,0x98

};
/* base point Gy*/
const uint8_t secp256_Gy[] =
{
0x48,0x3a,0xda,0x77,0x26,0xa3,0xc4,0x65,0x5d,0xa4,0xfb,0xfc,
0x0e,0x11,0x08,0xa8,0xfd,0x17,0xb4,0x48,0xa6,0x85,0x54,0x19,0x9c,0x47,0xd0,
0x8f,0xfb,0x10,0xd4,0xb8
};


使用特权

评论回复
7
9dome猫|  楼主 | 2020-10-23 18:57 | 只看该作者
用户可以直接将此参数拷贝 STM32 加密库的例程,例如
STM32CubeExpansion_Crypto_V3.1.0\Fw_Crypto\STM32L4\Projects\STM32L476RGNucleo\ECC\KeyGen_Sign_Verif\Src\main.c。该例程演示的功能包括:生成
ECC 公私钥匙密钥对,使用私钥对指定消息签
名,再使用对应公钥对签名做验签。

使用特权

评论回复
8
9dome猫|  楼主 | 2020-10-23 19:24 | 只看该作者
为了对这个曲线做如上运行,需要在例程代码的循环处增加一个案例,条件 3,如:

使用特权

评论回复
9
9dome猫|  楼主 | 2020-10-23 19:26 | 只看该作者
case 3:
/* Initialize the ECC curve structure, with all the parameters */
EC_st.pmA = secp256_a;
EC_st.pmP = secp256_p;
EC_st.pmN = secp256_n;
EC_st.pmGx = secp256_Gx;
EC_st.pmGy = secp256_Gy;
EC_st.mAsize = sizeof(secp256_a);
EC_st.mNsize = sizeof(secp256_n);
EC_st.mPsize = sizeof(secp256_p);
EC_st.mGxsize = sizeof(secp256_Gx);
EC_st.mGysize = sizeof(secp256_Gy);
break;


使用特权

评论回复
10
9dome猫|  楼主 | 2020-10-23 19:27 | 只看该作者
别忘了将 for 循环的条件修改成

使用特权

评论回复
11
9dome猫|  楼主 | 2020-10-23 19:29 | 只看该作者
param_ecc_counter < 4


使用特权

评论回复
12
9dome猫|  楼主 | 2020-10-23 19:31 | 只看该作者
从私钥生成公钥
有客户提到,STM32 加密库提供了椭圆曲线相关接口调用,但并没有在文档或者代码里描述如何从椭圆曲线私钥生成公钥。
这里做一个补充说明,实现该功能关键函数就是“点乘 API:ECCscalarMul”。可以在例程已有代码的基础上,通过“点乘
API”来对“密钥对生成 API”的运算结果做一次验证。

使用特权

评论回复
13
9dome猫|  楼主 | 2020-10-23 19:32 | 只看该作者
ECCkeyGen(PrivKey, PubKey, &RNGstate, &EC_st, &Crypto_Buffer); // 例程原有代码
// 使用这里产生的私钥,通过点乘运算得到公钥,看是否和该 API 生成的公钥一致
// 调用 ECCinitPoint 为参考点分配空间
ECCinitPoint(&G, &EC_st, &Crypto_Buffer);
// 从参数曲线中获取该曲线的参考点
ECCsetPointGenerator(G, &EC_st);
// 对私钥做一个基于曲线参考点的点乘,结果就是该私钥对应的公钥
ECCscalarMul(G, PrivKey, PubKey, &EC_st, &Crypto_Buffer);


使用特权

评论回复
14
9dome猫|  楼主 | 2020-10-23 19:32 | 只看该作者
其中 G 是临时变量,需要先定义后使用。

使用特权

评论回复
15
9dome猫|  楼主 | 2020-10-23 19:33 | 只看该作者
ECCpoint_stt *G = NULL;


使用特权

评论回复
16
9dome猫|  楼主 | 2020-10-23 19:34 | 只看该作者
若在求得公钥后不再需要,需要及时释放资源。

使用特权

评论回复
17
9dome猫|  楼主 | 2020-10-23 19:34 | 只看该作者
ECCfreePoint(&G, &Crypto_Buffer);


使用特权

评论回复
18
9dome猫|  楼主 | 2020-10-23 19:35 | 只看该作者
而本来就分配的点资源,例程会在在程序结束时释放。
另外,如果从外部已经拿到私钥(大数),是用 uint8_t 类型数组表示;而为了应用在我们的加密库中,可以通过以下 API 做
表示形式的转换:

使用特权

评论回复
19
9dome猫|  楼主 | 2020-10-23 19:35 | 只看该作者
ECCsetPrivKeyValue(PrivKey, secp256_priv, sizeof(secp256_priv));


使用特权

评论回复
20
isageko| | 2020-10-23 22:58 | 只看该作者
太强了 用stm32做比特币开发确实是我没想到的 不过TRMG确实很适合生成随机数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

1407

帖子

2

粉丝