搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

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

[复制链接]
107|25
 楼主 | 2020-10-23 18:43 | 显示全部楼层 |阅读模式
比特币是一个基于区块链和密码技术的应用。本文针对 STM32 客户的反馈,对那些使用 STM32 加密库开发比特币应用作了
一些补充的技术说明。

使用特权

评论回复
 楼主 | 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 得到页面链接。加密库下载需要批准,请在
线填写申请后等待邮件通知,一般很快就可以得到回复。

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
 楼主 | 2020-10-23 18:56 | 显示全部楼层
  1. /* coefficient a*/
  2. const uint8_t secp256_a[] =
  3. {
  4. 0x00
  5. };
  6. /* coefficient b */
  7. const uint8_t secp256_b[] =
  8. {
  9. 0x7
  10. };
  11. /* prime modulus p*/
  12. const uint8_t secp256_p[] =
  13. {
  14. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  15. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
  16. 0xff,0xfc,0x2f
  17. };
  18. /* order n*/
  19. const uint8_t secp256_n[] =
  20. {
  21. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  22. 0xff,0xfe,0xba,0xae,0xdc,0xe6,0xaf,0x48,0xa0,0x3b,0xbf,0xd2,0x5e,0x8c,0xd0,
  23. 0x36,0x41,0x41

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

  31. };
  32. /* base point Gy*/
  33. const uint8_t secp256_Gy[] =
  34. {
  35. 0x48,0x3a,0xda,0x77,0x26,0xa3,0xc4,0x65,0x5d,0xa4,0xfb,0xfc,
  36. 0x0e,0x11,0x08,0xa8,0xfd,0x17,0xb4,0x48,0xa6,0x85,0x54,0x19,0x9c,0x47,0xd0,
  37. 0x8f,0xfb,0x10,0xd4,0xb8
  38. };
复制代码


使用特权

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

使用特权

评论回复
 楼主 | 2020-10-23 19:24 | 显示全部楼层
为了对这个曲线做如上运行,需要在例程代码的循环处增加一个案例,条件 3,如:

使用特权

评论回复
 楼主 | 2020-10-23 19:26 | 显示全部楼层
  1. case 3:
  2. /* Initialize the ECC curve structure, with all the parameters */
  3. EC_st.pmA = secp256_a;
  4. EC_st.pmP = secp256_p;
  5. EC_st.pmN = secp256_n;
  6. EC_st.pmGx = secp256_Gx;
  7. EC_st.pmGy = secp256_Gy;
  8. EC_st.mAsize = sizeof(secp256_a);
  9. EC_st.mNsize = sizeof(secp256_n);
  10. EC_st.mPsize = sizeof(secp256_p);
  11. EC_st.mGxsize = sizeof(secp256_Gx);
  12. EC_st.mGysize = sizeof(secp256_Gy);
  13. break;
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 19:27 | 显示全部楼层
别忘了将 for 循环的条件修改成

使用特权

评论回复
 楼主 | 2020-10-23 19:29 | 显示全部楼层
  1. param_ecc_counter < 4
复制代码


使用特权

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

使用特权

评论回复
 楼主 | 2020-10-23 19:32 | 显示全部楼层
  1. ECCkeyGen(PrivKey, PubKey, &RNGstate, &EC_st, &Crypto_Buffer); // 例程原有代码
  2. // 使用这里产生的私钥,通过点乘运算得到公钥,看是否和该 API 生成的公钥一致
  3. // 调用 ECCinitPoint 为参考点分配空间
  4. ECCinitPoint(&G, &EC_st, &Crypto_Buffer);
  5. // 从参数曲线中获取该曲线的参考点
  6. ECCsetPointGenerator(G, &EC_st);
  7. // 对私钥做一个基于曲线参考点的点乘,结果就是该私钥对应的公钥
  8. ECCscalarMul(G, PrivKey, PubKey, &EC_st, &Crypto_Buffer);
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 19:32 | 显示全部楼层
其中 G 是临时变量,需要先定义后使用。

使用特权

评论回复
 楼主 | 2020-10-23 19:33 | 显示全部楼层
  1. ECCpoint_stt *G = NULL;
复制代码


使用特权

评论回复
 楼主 | 2020-10-23 19:34 | 显示全部楼层
若在求得公钥后不再需要,需要及时释放资源。

使用特权

评论回复
 楼主 | 2020-10-23 19:34 | 显示全部楼层
  1. ECCfreePoint(&G, &Crypto_Buffer);
复制代码


使用特权

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

使用特权

评论回复
 楼主 | 2020-10-23 19:35 | 显示全部楼层
  1. ECCsetPrivKeyValue(PrivKey, secp256_priv, sizeof(secp256_priv));
复制代码


使用特权

评论回复
| 2020-10-23 22:58 | 显示全部楼层
太强了 用stm32做比特币开发确实是我没想到的 不过TRMG确实很适合生成随机数

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表