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

时间:2014-07-18 12:34:32

标签: java cryptography bouncycastle 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 个答案:

答案 0 :(得分:1)

您只需存储静态密钥而不是每次都生成静态密钥。您可能必须使用ECDHCBasicAgreement(注意额外的C)来执行辅助因子乘法。

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