ATECC508A芯片开发笔记(八):ECDH算法配置方法、执行过程及实现原理

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

谢谢

猜你喜欢

转载自blog.csdn.net/howiexue/article/details/78649559