提问者:小点点

用椭圆曲线Diffie-Hellman和辅因子密钥生成对称密钥


我是ECDH的新手,想在Java中生成密钥。我想使用椭圆曲线Diffie-Hellman和辅因子密钥推导。我正在使用P-256曲线进行椭圆曲线操作。我计划使用生成的秘密作为我的分组密码的对称密钥。

我一直在研究这个,并且有下面的工作示例。这会生成密钥。

Provider BC = new org.bouncycastle.jce.provider.BouncyCastleProvider();
ProviderList.newList(BC);
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("P-256");   
KeyPairGenerator g = (KeyPairGenerator) KeyPairGenerator.getInstance(
            "ECDH",BC);
g.initialize(ecSpec, new SecureRandom());

KeyPair aKeyPair = g.generateKeyPair();

KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", BC);

aKeyAgree.init(aKeyPair.getPrivate());

KeyPair bKeyPair = g.generateKeyPair();

KeyAgreement bKeyAgree = KeyAgreement.getInstance("ECDH", BC);

bKeyAgree.init(bKeyPair.getPrivate());

aKeyAgree.doPhase(bKeyPair.getPublic(), true);
bKeyAgree.doPhase(aKeyPair.getPublic(), true);

byte[] aSecret = aKeyAgree.generateSecret();
byte[] bSecret = bKeyAgree.generateSecret();

System.out.println(new String(aSecret));
System.out.println(new String(bSecret));

恐怕我使用的是临时私钥和公钥而不是静态密钥。请告诉我如何使用静态私钥和公钥生成密钥。


共1个答案

匿名用户

您可以通过简单地存储静态键而不是每次生成它们来生成静态键。您可能必须使用ECDHCBasicProtocol(注意附加的C)来执行辅因子乘法。

请注意,您应该对密钥执行KBKDF以生成对称密钥。