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
谢谢


在这里插入图片描述

博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


下面是 Java 实现 ECDH 算法的示例代码: ```java import java.security.*; import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; public class ECDHDemo { public static void main(String[] args) throws Exception { // 创建椭圆曲线密钥对生成器 KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC"); // 使用 secp256r1 椭圆曲线 kpg.initialize(new ECGenParameterSpec("secp256r1")); // 生成密钥对 KeyPair kp1 = kpg.generateKeyPair(); KeyPair kp2 = kpg.generateKeyPair(); // 获取公钥和私钥 PublicKey pubKey1 = kp1.getPublic(); PrivateKey priKey1 = kp1.getPrivate(); PublicKey pubKey2 = kp2.getPublic(); PrivateKey priKey2 = kp2.getPrivate(); // ECDH 密钥协商 KeyAgreement ka1 = KeyAgreement.getInstance("ECDH"); ka1.init(priKey1); ka1.doPhase(pubKey2, true); byte[] secret1 = ka1.generateSecret(); KeyAgreement ka2 = KeyAgreement.getInstance("ECDH"); ka2.init(priKey2); ka2.doPhase(pubKey1, true); byte[] secret2 = ka2.generateSecret(); // 验证协商的密钥是否相同 if (MessageDigest.isEqual(secret1, secret2)) { System.out.println("ECDH 密钥协商成功!"); } else { System.out.println("ECDH 密钥协商失败!"); } } } ``` 在上面的示例代码中,我们使用 `secp256r1` 椭圆曲线生成密钥对,并使用 ECDH 算法进行密钥协商。具体步骤如下: 1. 通过 `KeyPairGenerator` 生成密钥对。 2. 获取公钥和私钥。 3. 创建 `KeyAgreement` 实例,初始化为自己的私钥。 4. 使用 `doPhase` 方法将对方的公钥作为输入,并执行密钥协商。 5. 使用 `generateSecret` 方法生成协商的密钥。 6. 验证双方协商的密钥是否相同,如果相同则密钥协商成功。 值得注意的是,ECDH 密钥协商只能协商出一个共享密钥,而且这个共享密钥不是公钥或私钥,它只能用于对称加密。因此,在实际应用中,我们通常需要使用协商出的共享密钥来加密通信内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值