- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的场景中,Alice 和 Bob 已就使用哪条曲线达成一致。
我的问题是 Alice 的公钥实际上是一个点,因此它具有 xy 格式。
我需要将 x,y 坐标字节转换为 ECPublicKey。
这是我正在使用的源代码
// outerPublicKey is the raw bytes from x,y coordinates in hex format
KeyFactory kf = KeyFactory.getInstance("EC");
PublicKey remoteAlicePub = kf.generatePublic(new X509EncodedKeySpec(outerPublicKey));
KeyPairGenerator bobKeyGen = KeyPairGenerator.getInstance("ECDH", "BC");
bobKeyGen.initialize(new ECGenParameterSpec(properties.getCurveName()), new SecureRandom());
KeyPair bobPair = bobKeyGen.generateKeyPair();
ECPublicKey bobPub = (ECPublicKey)bobPair.getPublic();
ECPrivateKey bobPvt = (ECPrivateKey)bobPair.getPrivate();
byte[] bobPubEncoded = bobPub.getEncoded();
byte[] bobPvtEncoded = bobPvt.getEncoded();
KeyAgreement bobKeyAgree = KeyAgreement.getInstance("ECDH");
bobKeyAgree.init(bobPvt);
bobKeyAgree.doPhase(remoteAlicePub, true);
return DatatypeConverter.printHexBinary(bobKeyAgree.generateSecret());
问题是:
new X509EncodedKeySpec(outerPublicKey);
如何根据点的 xy 坐标创建公钥?因为 outerPublicKey
是 x,y 坐标的原始字节数组,我应该使用哪种格式?
最佳答案
我是这样解决的(Java服务器端)
// arrive a string like this 04456cb4ba8ee9263311485baa8562c27991f7ff22d59f3d8245b9a05661d159911b632a6f8a7a080d82f4ca77e4d12bb201b89c8ec93f61d5b4dd22df42e1b482
Map<String, Object> result = new HashMap<>();
try {
// set provider
Security.addProvider(new BouncyCastleProvider());
// transform from hex to ECPublicKey
byte[] ecRawExternalPublicKey = HexFormat.of().parseHex(clientPublicKey.getPublicKey());
ECPublicKey ecExternalPublicKey = null;
KeyFactory externalKeyFactor = null;
ECNamedCurveParameterSpec ecExternalNamedCurveParameterSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
ECCurve curve = ecExternalNamedCurveParameterSpec.getCurve();
EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, ecExternalNamedCurveParameterSpec.getSeed());
java.security.spec.ECPoint ecPoint = ECPointUtil.decodePoint(ellipticCurve, ecRawExternalPublicKey);
java.security.spec.ECParameterSpec ecParameterSpec = EC5Util.convertSpec(ellipticCurve, ecExternalNamedCurveParameterSpec);
java.security.spec.ECPublicKeySpec externalPublicKeySpec = new java.security.spec.ECPublicKeySpec(ecPoint, ecParameterSpec);
externalKeyFactor = java.security.KeyFactory.getInstance("EC");
// this is externalPubicKey
ecExternalPublicKey = (ECPublicKey) externalKeyFactor.generatePublic(externalPublicKeySpec);
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDH", "BC");
keyGen.initialize(new ECGenParameterSpec("secp256r1"), new SecureRandom());
KeyPair pair = keyGen.generateKeyPair();
ECPublicKey pub = (ECPublicKey)pair.getPublic();
ECPrivateKey pvt = (ECPrivateKey)pair.getPrivate();
byte[] pubEncoded = pub.getEncoded();
byte[] pvtEncoded = pvt.getEncoded();
KeyAgreement keyAgree = KeyAgreement.getInstance("ECDH");
keyAgree.init(pvt);
keyAgree.doPhase(ecExternalPublicKey, true);
System.out.println("sharedKey: "+ this.bytesToHex( keyAgree.generateSecret() ));
// internal public key
return "04"+ pub.getW().getAffineX().toString(16) + pub.getW().getAffineY().toString(16)
}
catch (Exception e ){
e.printStackTrace();
return null;
}
Javascript(客户端)
ecdhHandShake() {
let _this = this;
this.keyGeneration()
.then( k => {
ajax({
url: "http://localhost:5050/test/ecdh/handshake",
headers: {
"Content-Type": "application/json"
},
body: {
publickey: this.buf2Hex(this.publicKey)
},
method: 'POST',
crossDomain: true,
responseType: 'json'
})
.subscribe(
payload => {
const publicKey = _this.hex2Arr(payload.response.publicKey);
_this.serverPublicKey = _this.hex2Arr(payload.response.publicKey);
_this.importServerKey()
.then(sharedSecret => {
const sharedSecretHex = this.buf2Hex(sharedSecret);
console.log("shared key: "+ sharedSecretHex);
})
.catch( e => {
console.log(e);
})
},
error => {
console.log(error);
},
() => console.log('done')
)
;
})
.catch( e => {
console.log(e);
})
;
}
keyGeneration() {
let _this = this;
return window.crypto.subtle.generateKey(
{
name: "ECDH",
namedCurve: "P-256", // the curve name
},
true, // <== Here if you want it to be exportable !!
["deriveKey", "deriveBits"] // usage
)
.then(key => {
_this.keys = key;
return window.crypto.subtle.exportKey(
"raw", //can be "jwk" (public or private), "raw" (public only), "spki" (public only), or "pkcs8" (private only)
_this.keys.publicKey
)
.then(rawPublicKey => {
_this.publicKey = rawPublicKey;
return rawPublicKey;
})
.catch(function(err){
console.error(err);
})
;
})
.catch(function(err){
console.error(err);
})
;
}
importServerKey() {
return window.crypto.subtle.importKey(
'raw',
this.serverPublicKey,
{
name: 'ECDH',
namedCurve: 'P-256'
},
true,
[]
)
.then(aliceKeyImported => {
return window.crypto.subtle.deriveBits(
{
name: 'ECDH',
namedCurve: 'P-256',
public: aliceKeyImported
},
this.keys.privateKey,
256)
})
.catch( e => {
console.log(e);
})
}
hex2Arr( str ) {
if (!str) {
return new Uint8Array();
}
const arr = [];
for (let i = 0, len = str.length; i < len; i+=2) {
arr.push(parseInt(str.substr(i, 2), 16));
}
return new Uint8Array(arr);
}
buf2Hex( buf ) {
return Array.from(new Uint8Array(buf))
.map(x => ('00' + x.toString(16)).slice(-2))
.join('')
}
关于Javascript - Java ECDH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861056/
因此,我尝试使用椭圆曲线 DH 的 OpenSSL EVP 方法执行 key 交换,以派生共享 key 。这对于在 GCM 模式下使用 AES 为自定义协议(protocol)提供强大的安全性是必要的
在我的场景中,Alice 和 Bob 已就使用哪条曲线达成一致。 Alice 生成公钥和私钥 Alice 将公钥发送给 Bob Bob 生成他的 key ,并根据他收到的 Alice 公钥生成 ses
我在 Windows 7 系统上使用 Oracle Java 8 (8u112) 和“适用于 JDK/JRE 8 的 Java 加密扩展 (JCE) 无限强度管辖策略文件”。为了提高我对安全套接字的理
我正在寻找示例 Java 代码来实现 ECDH 加密的密码。我已经找到了获取所需 key 的方法,但仍未找到加密文本的解决方案。如果有人可以提供一些指导,我们将不胜感激。 顺便说一下,我在为 Andr
我对 OpenSSL 库中的 ECDH 有疑问。 在文件'ecdhtest.c'的第159行,我们可以确认私钥的值如下: BN_print(out, a->priv_key); 但是,当我使用 Mak
我知道 ECDH 中的 key 大小取决于椭圆曲线的大小。 如果是256位曲线(secp256k1), key 将为: Public: 32 bytes * 2 + 1 = 65 (uncompres
我正在构建一个实现 ECDSA_METHOD 的 OpenSSL 引擎,其中包括签名创建和签名验证功能。由于 ECDHE 私钥的唯一用途是与签名创建相关,因此不需要从引擎导出 key 并将其呈现在其他
Java Cryptography ArchitectureStandard Algorithm Name Documentation Java 6 的页面列出了 ECDHE 密码套件。因此,我希望它
我正在尝试了解 HTTPS 的工作原理并进行一些实际测试。 我有一个通过 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 加密的 HTTPS 通信捕获的数据。 如果我没理解错的话
我正在尝试使用 ECDH key 实现 CMS 加密。引用 openssl CMS with ECDH EnvelopedData命令行运行完美,但我的程序出现错误 - Error Encryptin
我读过这篇文章document通过ECDH-CURVE25519算法生成 key 对。但是当我在 window.crypto.subtle.generateKey 中指定 ECDH-CURVE2551
我正在将一个方法从 nodeSJ 转换为 Java,但我无法使其正常工作。我一直在尝试计算派生共享 secret 。 希望有人能发现我在将 NodeJS 移植到 Java 时做错了什么。 NodeJS
前言:我不知道这个问题在这里问更合适还是在 Crypto 网站上问更合适。请随意移动或删除或任何适当的 SE 操作。 有人要求我帮助更新一些加密软件。一般来说,该软件已经执行了以下步骤,其中没有一个是
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我目前正在研究 ECDH key 交换实现。我为此使用 P-384 曲线。其他曲线也是可能的,但我认为实现应该非常相似。 客户端(Javascript)和服务器(Java)想要找到一个共享的 secr
我正在开发一个 iOS 应用程序,我想实现 ECDH 以确保安全。我使用这个应用程序(https://github.com/DigitalLeaves/AsymmetricCrypto)生成一对 ke
我正在尝试使用本地证书颁发机构,但我不断收到“ECDH 服务器 key 交换消息上的无效签名”错误。提前为这个问题的复杂性道歉。您可以通过以下方式从 github 获取完整的源代码: git clon
根据 RFC客户端发送使用服务器的 RSA 公钥加密的预主 key 。但是当他们使用 ECDHE 作为非对称算法时,客户端 key 交换消息将包含客户端的公钥。如果是这样的话?客户端何时发送预主 ke
我正在构建一个 Web API,我需要实现 ECDH 来执行端到端加密。在服务器端我有一个 C# 应用程序,在客户端我有一个 Javascript 应用程序。 我能够交换 key 、生成私钥并加密消息
我对 ECDH(椭圆曲线 Diffie-Hellman)加密有一个小问题。我使用 BouncyCaSTLe 库。 这是我生成 key 的函数: public static KeyPair genera
我是一名优秀的程序员,十分优秀!