目录
AATECC508A芯片开发笔记(八):ECDH算法配置方法、过程原理及示例代码
- 1、ECDH介绍及原理
- 2、ECDH执行过程
- 3、508A某一slot执行Ecdh需要配置的参数
- 4、示例代码
508A芯片硬件可以实现ECDH算法,大大提高了算法执行效率,实际使用中,需要配置好508A使其能够执行ECDH,之后才可以调用库函数的API正确执行该算法。
1、ECDH介绍及原理
ECC Diffie-Hellman (ECDH) 是实现密钥协商的一种算法,或者说一种协议。关于详细原理,具体可以参考:http://blog.csdn.net/mrpre/article/details/72850644
或 https://msdn.microsoft.com/zh-cn/library/cc488016(v=vs.90).aspx
个人理解,Ecdh算法是通过ECC(椭圆曲线)非对称加密算法的数学关系和 Diffie-Hellman协议,生成一个共同的Session key。
例如有两个节点A和B,他们都有公私钥对:PrivateKeyA和PublicKeyA,PrivateKeyB和PublicKeyB,(简称PriB PubB)
如果利用对方的公钥和自己的私钥,进行ECDH数学运算,由于其存在的数学关系(椭圆曲线),一定会算出一个共同的数值,既密钥。(纯数学关系角度,虽然不好理解,但是合理的)。
因此PriA 与PubB,及PriB与PubA总会生成一个唯一共同的密钥。
2、ECDH执行过程
ECDH开始时,会有一个发起方,假定为A,则发起方A会产生一个Random,并混合发起方A的PublickeyA发送给接收方B,然后B向A发送B的公钥PublickeyB,最终B通过A的PublicKeyA+Random,A通过自己产生的Random和PublickeyB生成该次密钥协商的唯一SessionKey。
该过程结果都是数学运算的结果,因为ECC算法的公私钥之间存在着一定的数学关系。
3、508A某一slot执行Ecdh需要配置的参数
3.1、将该Slot配置成可以执行ecdh,既如图中所示,Bit2 配置为1,其中可以通过Bit3灵活的配置ECDH算法结果的输出形式(明文返回或者输出到指定Slot中存储),方便开发。
3.2、将该Slot配置成可以二次产生密钥(可以执行Genkey命令))如下图,既Bit13配置为1;这是因为ECDH过程中需要使用GenKey命令。
4、示例代码
如下示例代码,是使用一个508模仿两个节点进行ecdh密钥协商。
其中前提是使用的两个slot都需要有公私钥(由508A生成),因此代码首先调用atcab_genkey( int slot, uint8_t *pubkey )得到公钥数据,然后分别将bob和alice的公钥 使用ecdh算法,既调用API atcab_ecdh(uint16_t key_id, const uint8_t pubkey, uint8_t ret_ecdh),产生的pms**就是两者相同的ecdh结果密钥。
ATCA_STATUS Atecc508_Ecdh_Test()
{
ATCA_STATUS status;
uint8_t pub_alice[ATCA_PUB_KEY_SIZE] = {0}, pub_bob[ATCA_PUB_KEY_SIZE]= {0};
uint8_t pms_alice[ECDH_KEY_SIZE]= {0}, pms_bob[ECDH_KEY_SIZE]= {0};
uint8_t key_id_alice = 0, key_id_bob = 4;
status = atcab_genkey( key_id_alice, pub_alice );
status = atcab_genkey( key_id_bob, pub_bob );
// slot 0 is a non-clear response - "Write Slot N+1" is in slot config for W25 config
// generate premaster secret from alice's key and bob's pubkey
status = atcab_ecdh( key_id_alice, pub_bob, pms_alice );
status = atcab_ecdh( key_id_bob, pub_alice, pms_bob );
// memcmp it to bob's premaster secret - they should be identical
status = memcmp(pms_bob, pms_alice, sizeof(pms_alice));
if(status != 0)
{
printf("ecdh failed!");
}
else
{
printf("ecdh Success!");
}
return status;
}
欢迎转载,Howie原创作品,本文地址:
http://blog.csdn.net/howiexue/article/details/78649559
谢谢
博主热门文章推荐:
一篇读懂系列:
LoRa Mesh系列:
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)