标签: diffie-hellman

从Diffie-Hellman输出中选择加密密钥

我在Java中使用RFC 3526中的一些大型组实现了Diffie-Hellman密钥交换.我的输出是一个相当大的字节数组.使用河豚键的输出的前448位(56字节)是否安全?我应该以任何方式转换字节,还是选择密钥的任何特定字节?

java encryption blowfish diffie-hellman

5
推荐指数
1
解决办法
2218
查看次数

适用于iOS的Diffie-Hellman实现?

这是我在此之前的第一个问题,因为之前我发现了另一个问题的所有变通方法.

问题非常简短:有没有人知道iOS上是否有任何Diffie-Hellman实现?我的意思是......我的想法是在两个设备之间共享(一个是iOS,另一个是java Web服务)一个密钥,我认为最好的想法应该是该方法.

如果没有,有人可以建议我另一种选择吗?

我不是高级开发人员,这就是为什么我要为此检查框架的原因.

在此先感谢大家!

diffie-hellman ios

5
推荐指数
1
解决办法
4772
查看次数

Java Diffie-Hellman密钥交换

我正在尝试执行代码来执行Diffie-Hellman密钥交换.我从在线示例中获取代码(忘记现在的位置).我不得不导入bouncycastle.jar,我假设它一直在执行.

stacktrace截图

我的代码:

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)

java bouncycastle diffie-hellman

5
推荐指数
2
解决办法
1万
查看次数

生成 EC Diffie-Hellman 公钥和私钥对

我需要生成 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

5
推荐指数
1
解决办法
3790
查看次数

基于带有CommonCrypto的椭圆曲线Diffie-Hellman的共享机密

我正在寻找CommonCrypto中基于ECDH(椭圆曲线Diffie-Hellman)生成共享密钥的方法。我可以找到像这样的专有实现https://github.com/surespot/surespot-ios/blob/master/surespot/encryption/EncryptionController.mm,但是这不是使用CommonCrypto。计算共享密钥的方法有时称为密钥交换,其中包括共享密钥的计算。有人可以发送链接到正确的文档,也可以发送示例到使用CommonCrypto生成基于椭圆曲线Diffie-Hellman的共享密钥的示例吗?

cryptography shared-secret diffie-hellman ios

5
推荐指数
0
解决办法
1637
查看次数

如何解密HTTPS(ECDHE)数据?

我试图了解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字节)。我想念什么吗?

php encryption https elliptic-curve diffie-hellman

5
推荐指数
1
解决办法
3862
查看次数

具有BIGNUM(OpenSSL)与BigInteger(C#)的Diffie-Hellman

我正在使用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方法的一些附加信息:>

BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret);
Run Code Online (Sandbox Code Playgroud)

BN_bin2bn设置|*ret | 到| len |的值 来自| in …

c c# openssl biginteger diffie-hellman

5
推荐指数
1
解决办法
978
查看次数

实现DH协议时出现java.security.InvalidKeyException

在我的 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)

java android cryptography diffie-hellman java-security

5
推荐指数
0
解决办法
375
查看次数

.NET ECDiffieHellmanCng 和 BouncyCastle Core 兼容协议

我必须与第三方签订 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 …

.net c# bouncycastle diffie-hellman .net-core

5
推荐指数
1
解决办法
1145
查看次数

如何检查我的服务器 Diffie-Hellman MODP 大小(位)并增加它?

再会,

我在 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)

linux openssl bit diffie-hellman redhat-openjdk

5
推荐指数
1
解决办法
2523
查看次数