我在Java中使用RFC 3526中的一些大型组实现了Diffie-Hellman密钥交换.我的输出是一个相当大的字节数组.使用河豚键的输出的前448位(56字节)是否安全?我应该以任何方式转换字节,还是选择密钥的任何特定字节?
这是我在此之前的第一个问题,因为之前我发现了另一个问题的所有变通方法.
问题非常简短:有没有人知道iOS上是否有任何Diffie-Hellman实现?我的意思是......我的想法是在两个设备之间共享(一个是iOS,另一个是java Web服务)一个密钥,我认为最好的想法应该是该方法.
如果没有,有人可以建议我另一种选择吗?
我不是高级开发人员,这就是为什么我要为此检查框架的原因.
在此先感谢大家!
我正在尝试执行代码来执行Diffie-Hellman密钥交换.我从在线示例中获取代码(忘记现在的位置).我不得不导入bouncycastle.jar,我假设它一直在执行.

我的代码:
package testproject;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.KeyAgreement;
import javax.crypto.spec.DHParameterSpec;
public class KeyGen {
private static BigInteger g512 = new BigInteger("1234567890", 16);
//generates a random, non-negative integer for Base
private static BigInteger p512 = new BigInteger("1234567890", 16);
//generates a random, non-negative integer for Prime
public static void main(String[] args) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
DHParameterSpec dhParams = new DHParameterSpec(p512, g512);
//Specify parameters to use for the algorithm
KeyPairGenerator keyGen = …Run Code Online (Sandbox Code Playgroud) 我需要生成 EC Diffie Hellman 密钥对。我正在使用名为 curve 的 secp256r1 和 OpenSSL。到目前为止,这是我所拥有的:
unsigned char *ecdh(size_t *secret_len)
{
EVP_PKEY_CTX *pctx, *kctx;
EVP_PKEY_CTX *ctx;
unsigned char *secret;
EVP_PKEY *pkey = NULL, *peerkey, *params = NULL;
/* NB: assumes pkey, peerkey have been already set up */
/* Create the context for parameter generation */
if(NULL == (pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)))
printf("Error in EC key generation\n");
/* Initialise the parameter generation */
if(1 != EVP_PKEY_paramgen_init(pctx))
printf("Error in EC key generation\n");
/* We're going to use …Run Code Online (Sandbox Code Playgroud) c openssl encryption-asymmetric elliptic-curve diffie-hellman
我正在寻找CommonCrypto中基于ECDH(椭圆曲线Diffie-Hellman)生成共享密钥的方法。我可以找到像这样的专有实现https://github.com/surespot/surespot-ios/blob/master/surespot/encryption/EncryptionController.mm,但是这不是使用CommonCrypto。计算共享密钥的方法有时称为密钥交换,其中包括共享密钥的计算。有人可以发送链接到正确的文档,也可以发送示例到使用CommonCrypto生成基于椭圆曲线Diffie-Hellman的共享密钥的示例吗?
我试图了解HTTPS的工作原理,并进行一些实际测试。
我有一个通过TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA加密的HTTPS通信捕获的数据。
如果我理解正确,客户端将在TLS握手期间创建一个主密钥,然后使用服务器的公钥对该主密钥进行加密并将其发送到服务器。然后将此主密钥(作为纯文本)用作对称密钥,用于加密正在进行的通信。它是否正确?
如果是,如果知道主密钥,如何解密数据?
一开始听起来很容易,所以我只写了这个脚本
$masterKey = '8ef36f0eb2c10ea6142693374f6c5c7ae65eee5f6bd45bd1990b08e6c144227382726496b795d62284bd8c6c0cadbbdb';
$someRandomEncryptedData = '170303001D314A69C7DF95E07AAF51FBDA01C178D45330BC902308DF8C418FA5B02B';
$sDecrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, pack('H*', $masterKey), pack('H*', $someRandomEncryptedData), MCRYPT_MODE_CBC);
echo $sDecrypted;
Run Code Online (Sandbox Code Playgroud)
然后,我注意到主密钥的长度为96字节(二进制字符串为48),这导致PHP警告,因为密钥的长度应为256位(32字节)。我想念什么吗?
我正在使用OpenSSL库进行操作的嵌入式设备和使用方法计算秘密共享密钥生成的C#软件之间实现Diffie-Hellman密钥交换算法.BIGNUMSystem.Numerics.BigInteger
但在Alice和Bob交换密钥后,他们会计算出不同的共享秘密.
钥匙打印在每一侧(PubA, PrivA, PubB, PrivB, DHPrime, DHGenerator),我可以看到它们是相同的.
我怀疑有一个关于小/大字节序的问题,或者openssl不关心指数的负数,我不知道如何调试这些操作.我现在没有代码,但所有操作都保持简单,就像这样.
C#方面
BigInteger bintA = new BigInteger(baByteArrayReceived);
BigInteger bintb = new BigInteger(baRandomBobSecret);
BigInteger bintDHPrime = new BigInteger(baDHPrime2048);
BigInteger bintSharedSecret = bintA.ModPow(bintb,bintDHPrime);
Run Code Online (Sandbox Code Playgroud)
C方面
BIGNUM *bnB = BN_new();
BIGNUM *bna = BN_new();
BIGNUM *bnDHPrime = BN_new();
BIGNUM *bnResult = BN_new();
BN_CTX *bnctx = BN_CTX_new();
BN_bin2bn(baBReceived, 256,bnB);
BN_bin2bn(baRandomAliceSecret, 256,bna);
BN_bin2bn(baDHPrime2048, 256,bnDHPrime);
BN_mod_exp(bnResult,bnB,bna,bnDHPrime,bnctx);
Run Code Online (Sandbox Code Playgroud)
OpenSSL的C方法的一些附加信息:>
Run Code Online (Sandbox Code Playgroud)BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret);BN_bin2bn设置|*ret | 到| len |的值 来自| in …
在我的 Android 应用程序中,我想实现 Diffie-Hellman 协议,以便在两个用户之间生成公共秘密。
我所做的如下:当第一个用户向第二个用户发送友谊请求时,应用程序会生成一个密钥对,将公共密钥存储在远程数据库中,将私有密钥存储在本地数据库中。
这是第一部分的代码:
generateKeys();
localDB.insertPrivateKey(userId, entityId, privateKey);
remoteDB.insertFirstPublicKey(userId, entityId, publicKey);
Run Code Online (Sandbox Code Playgroud)
生成密钥方法如下:
private void generateKeys() {
try {
final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH");
keyPairGenerator.initialize(1024);
final KeyPair keyPair = keyPairGenerator.generateKeyPair();
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
当第二个用户接受请求时,会生成另一个密钥对,再次将私钥存储在本地数据库中,将公钥存储在远程数据库中。然后它从远程数据库获取第一个用户的公钥,将其转换回 PublicKey 并生成公共密钥。
这是第二部分的代码:
generateKeys();
localDB.insertPrivateKey(userId, entityId, privateKey);
remoteDB.insertSecondPublicKey(entityId, userId, publicKey);
String stringFirstPubKey = remoteDB.fetchFirstKey(entityId, userId);
PublicKey firstPubKey = stringToPublicKey(stringFirstPubKey);
byte[] commonSecret = generateCommonSecret(firstPubKey);
Run Code Online (Sandbox Code Playgroud)
stringToPublicKey 如下:
private PublicKey stringToPublicKey(String stringPubK) throws NoSuchAlgorithmException, InvalidKeySpecException { …Run Code Online (Sandbox Code Playgroud) 我必须与第三方签订 Diffie Hellman 协议,该第三方以 .NET ECDiffieHellmanCng XmlString 格式传输公钥。我无法更改他们的代码。他们发送的内容如下所示:
<ECDHKeyValue xmlns="http://www.w3.org/2001/04/xmldsig-more#">
<DomainParameters>
<NamedCurve URN="urn:oid:1.3.132.0.35" />
</DomainParameters>
<PublicKey>
<X Value="11" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
<Y Value="17" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</PublicKey>
</ECDHKeyValue>
Run Code Online (Sandbox Code Playgroud)
他们使用典型的 .NET Framework 代码生成它,如下所示:
using (ECDiffieHellmanCng dhKey = new ECDiffieHellmanCng())
{
dhKey.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
dhKey.HashAlgorithm = CngAlgorithm.Sha256;
Console.WriteLine(dhKey.PublicKey.ToXmlString());
}
Run Code Online (Sandbox Code Playgroud)
他们希望以相同的格式接收我的公钥。他们像这样使用我的公钥:
ECDiffieHellmanCngPublicKey pbkey = ECDiffieHellmanCngPublicKey.FromXmlString(xmlHere);
Run Code Online (Sandbox Code Playgroud)
我在 .NET 核心 2.1 中工作。不幸的是,ECDiffieHellmanCng 类等目前尚未在 .NET 核心中实现。我想我可以为此使用 BouncyCastle for .NET Core 包:https ://www.nuget.org/packages/BouncyCastle.NetCore/ 我假设它们都实现了相同的标准并且它们将兼容。
我知道如何与充气城堡完全达成一致,但是我不清楚如何从 .NET ECDiffieHellmanCng 中的 xml 中的 X 和 Y 值开始,以及如何确保我使用兼容的参数. 我也不清楚如何从我生成的充气城堡公钥中获取 X …
再会,
我在 Linux Redhat 中有一个 WAS 自由服务器,并且我启用了唯一的 TLSv1.2。
我输入以下命令来获取服务器信息:
openssl s_client -connect 10.7.5.65:9443 -msg
Run Code Online (Sandbox Code Playgroud)
部分结果如下:
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: DH, 1024 bits
---
SSL handshake has read 1710 bytes and written 479 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Run Code Online (Sandbox Code Playgroud)
我看到Server Temp Key值是 DH,1024 位,但也看到服务器公钥是 2048 位,请问我的 Diffie-Hellman MODP 大小(位)实际上是 1024 还是 2048?
还有那部分 ServerKeyExchange
<<< TLS 1.2 Handshake [length …Run Code Online (Sandbox Code Playgroud) diffie-hellman ×10
java ×3
openssl ×3
bouncycastle ×2
c ×2
c# ×2
cryptography ×2
encryption ×2
ios ×2
.net ×1
.net-core ×1
android ×1
biginteger ×1
bit ×1
blowfish ×1
https ×1
linux ×1
php ×1