java ecdh_ECDHCrypt.java

/*

* Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

*

* This code is free software; you can redistribute it and/or modify it

* under the terms of the GNU General Public License version 2 only, as

* published by the Free Software Foundation. Oracle designates this

* particular file as subject to the "Classpath" exception as provided

* by Oracle in the LICENSE file that accompanied this code.

*

* This code is distributed in the hope that it will be useful, but WITHOUT

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

* version 2 for more details (a copy is included in the LICENSE file that

* accompanied this code).

*

* You should have received a copy of the GNU General Public License version

* 2 along with this work; if not, write to the Free Software Foundation,

* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

*

* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

* or visit www.oracle.com if you need additional information or have any

* questions.

*/

package sun.security.ssl;

import java.security.*;

import java.security.interfaces.ECPublicKey;

import java.security.spec.*;

import javax.crypto.SecretKey;

import javax.crypto.KeyAgreement;

import javax.crypto.spec.*;

/**

* Helper class for the ECDH key exchange. It generates the appropriate

* ephemeral keys as necessary and performs the actual shared secret derivation.

*

* @since 1.6

* @author Andreas Sterbenz

*/

final class ECDHCrypt {

// our private key

private PrivateKey privateKey;

// our public key

private ECPublicKey publicKey;

// Called by ServerHandshaker for static ECDH

ECDHCrypt(PrivateKey privateKey, PublicKey publicKey) {

this.privateKey = privateKey;

this.publicKey = (ECPublicKey)publicKey;

}

// Called by ServerHandshaker for ephemeral ECDH

ECDHCrypt(String curveName, SecureRandom random) {

try {

KeyPairGenerator kpg = JsseJce.getKeyPairGenerator("EC");

ECGenParameterSpec params = new ECGenParameterSpec(curveName);

kpg.initialize(params, random);

KeyPair kp = kpg.generateKeyPair();

privateKey = kp.getPrivate();

publicKey = (ECPublicKey)kp.getPublic();

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate DH keypair", e);

}

}

// Called by ClientHandshaker with params it received from the server

ECDHCrypt(ECParameterSpec params, SecureRandom random) {

try {

KeyPairGenerator kpg = JsseJce.getKeyPairGenerator("EC");

kpg.initialize(params, random);

KeyPair kp = kpg.generateKeyPair();

privateKey = kp.getPrivate();

publicKey = (ECPublicKey)kp.getPublic();

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate DH keypair", e);

}

}

/**

* Gets the public key of this end of the key exchange.

*/

PublicKey getPublicKey() {

return publicKey;

}

// called by ClientHandshaker with either the server's static or ephemeral public key

SecretKey getAgreedSecret(PublicKey peerPublicKey) {

try {

KeyAgreement ka = JsseJce.getKeyAgreement("ECDH");

ka.init(privateKey);

ka.doPhase(peerPublicKey, true);

return ka.generateSecret("TlsPremasterSecret");

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate secret", e);

}

}

// called by ServerHandshaker

SecretKey getAgreedSecret(byte[] encodedPoint) {

try {

ECParameterSpec params = publicKey.getParams();

ECPoint point = JsseJce.decodePoint(encodedPoint, params.getCurve());

KeyFactory kf = JsseJce.getKeyFactory("EC");

ECPublicKeySpec spec = new ECPublicKeySpec(point, params);

PublicKey peerPublicKey = kf.generatePublic(spec);

return getAgreedSecret(peerPublicKey);

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate secret", e);

} catch (java.io.IOException e) {

throw new RuntimeException("Could not generate secret", e);

}

}

}

Java程序

|

120行

|

4.4 KB

/*

* Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

*

* This code is free software; you can redistribute it and/or modify it

* under the terms of the GNU General Public License version 2 only, as

* published by the Free Software Foundation. Oracle designates this

* particular file as subject to the "Classpath" exception as provided

* by Oracle in the LICENSE file that accompanied this code.

*

* This code is distributed in the hope that it will be useful, but WITHOUT

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

* version 2 for more details (a copy is included in the LICENSE file that

* accompanied this code).

*

* You should have received a copy of the GNU General Public License version

* 2 along with this work; if not, write to the Free Software Foundation,

* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

*

* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

* or visit www.oracle.com if you need additional information or have any

* questions.

*/

package sun.security.ssl;

import java.security.*;

import java.security.interfaces.ECPublicKey;

import java.security.spec.*;

import javax.crypto.SecretKey;

import javax.crypto.KeyAgreement;

import javax.crypto.spec.*;

/**

* Helper class for the ECDH key exchange. It generates the appropriate

* ephemeral keys as necessary and performs the actual shared secret derivation.

*

* @since 1.6

* @author Andreas Sterbenz

*/

final class ECDHCrypt {

// our private key

private PrivateKey privateKey;

// our public key

private ECPublicKey publicKey;

// Called by ServerHandshaker for static ECDH

ECDHCrypt(PrivateKey privateKey, PublicKey publicKey) {

this.privateKey = privateKey;

this.publicKey = (ECPublicKey)publicKey;

}

// Called by ServerHandshaker for ephemeral ECDH

ECDHCrypt(String curveName, SecureRandom random) {

try {

KeyPairGenerator kpg = JsseJce.getKeyPairGenerator("EC");

ECGenParameterSpec params = new ECGenParameterSpec(curveName);

kpg.initialize(params, random);

KeyPair kp = kpg.generateKeyPair();

privateKey = kp.getPrivate();

publicKey = (ECPublicKey)kp.getPublic();

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate DH keypair", e);

}

}

// Called by ClientHandshaker with params it received from the server

ECDHCrypt(ECParameterSpec params, SecureRandom random) {

try {

KeyPairGenerator kpg = JsseJce.getKeyPairGenerator("EC");

kpg.initialize(params, random);

KeyPair kp = kpg.generateKeyPair();

privateKey = kp.getPrivate();

publicKey = (ECPublicKey)kp.getPublic();

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate DH keypair", e);

}

}

/**

* Gets the public key of this end of the key exchange.

*/

PublicKey getPublicKey() {

return publicKey;

}

// called by ClientHandshaker with either the server's static or ephemeral public key

SecretKey getAgreedSecret(PublicKey peerPublicKey) {

try {

KeyAgreement ka = JsseJce.getKeyAgreement("ECDH");

ka.init(privateKey);

ka.doPhase(peerPublicKey, true);

return ka.generateSecret("TlsPremasterSecret");

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate secret", e);

}

}

// called by ServerHandshaker

SecretKey getAgreedSecret(byte[] encodedPoint) {

try {

ECParameterSpec params = publicKey.getParams();

ECPoint point = JsseJce.decodePoint(encodedPoint, params.getCurve());

KeyFactory kf = JsseJce.getKeyFactory("EC");

ECPublicKeySpec spec = new ECPublicKeySpec(point, params);

PublicKey peerPublicKey = kf.generatePublic(spec);

return getAgreedSecret(peerPublicKey);

} catch (GeneralSecurityException e) {

throw new RuntimeException("Could not generate secret", e);

} catch (java.io.IOException e) {

throw new RuntimeException("Could not generate secret", e);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值