标签: diffie-hellman

C#中的1024位Diffie-Hellman

所以我正在开发一个项目,将C#客户端与现有的服务器技术连接起来.其中一个要求是使用Diffie-Hellman进行密钥交换.

我们已知公共P和G,我需要生成一个1024位的公钥才能发送到服务器.

以下是在C++中使用OpenSSL在服务器端使用的.目前我在通过P/Invoke调用的本机DLL中使用相同的代码,它也可以工作.如果可能的话,我宁愿消除本机DLL依赖.

char publicKey[128];
char P[128]; //this is set to a static 128-byte value, omitting for brevity
unsigned long G = 2;

DH* dh = DH_new();
dh->p = BN_new();
dh->g = BN_new();

BN_set_word(dh->g, G);
BN_bin2bn(P, 128, dh->p);
if(DH_generate_key(dh))
{
   BN_bn2bin(dh->pub_key, publicKey);
}
Run Code Online (Sandbox Code Playgroud)

这会生成一个1024位的公钥.

我已经尝试过在BouncyCastle中使用DH类,但无论出于什么原因我无法给它一个1024位密钥,它想给我一个960位密钥.可能是因为我真的不知道自己在做什么.我找不到关于如何使用类的实际解释方式.

是否可以使用BouncyCastle DH类与上面发布的OpenSSL DH代码一样工作?如果没有,是否有另一个更好的C#实现?

c# bouncycastle diffie-hellman

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

SSL密钥交换加密技术

三个密钥交换算法有什么区别,即Anonymous DH,Ephermal DH和固定DH?

security encryption ssl diffie-hellman

4
推荐指数
1
解决办法
3910
查看次数

如何利用Diffie-hellman在中间攻击中执行一个人

我正在做一个项目,其中Alice和Bob使用Diffie-Hellman密钥交换发送彼此的消息.抛弃我的循环是如何合并他们正在使用的证书,这样我就可以获得他们的秘密消息.

根据我对MIM attakcs的理解,MIM可以作为冒名顶替者,如图所示:

在此输入图像描述

以下是我的项目的详细信息.我知道他们在沟通之前都有g和p达成一致意见,但我怎么能用他们都有证书验证他们的签名来实现呢?

Alice准备⟨signA(NA,Bob),pkA,certA⟩,其中signA是Alice使用的数字签名算法,"Bob"是Bob的名字,pkA是Alice的公钥,等于根据X编码的gx mod p. 509表示固定g,p表示在Diffie-Hellman密钥交换中,certA是Alice的证书,包含验证签名的Alice公钥.最后,NA是一个8字节长的随机数(随机字符串).

Bob检查Alice的签名,并使用⟨signB{NA,NB,Alice},pkB,certB⟩进行响应.Alice根据Diffie-Hellman密钥交换获取她检查其nonce NA并根据pkA,pkB计算联合密钥的消息.然后Alice将消息⟨signA{NA,NB,Bob},EK(MA),certA⟩提交给Bob并且Bobrespondswith⟨SignB{NA,NB,Alice},EK(MB),certB⟩.

其中MA和MB是相应的秘密消息.

man-in-the-middle diffie-hellman

4
推荐指数
1
解决办法
9753
查看次数

如何为ECDiffieHellmanCng导出私钥

我正在尝试从ECDiffieHellmanCng对象的新实例导出密钥,以便稍后可以使用相同的密钥创建它的实例.但是我在尝试导出它时遇到错误.

//Create new ECDiffieHellmanCng which automatically creates new keys
var ecdh = new ECDiffieHellmanCng();
//Export the keys
var privateKey = ecdh.Key.Export(CngKeyBlobFormat.EccPrivateBlob);
Run Code Online (Sandbox Code Playgroud)

当我使用消息" 不支持请求的操作 " 调用Export方法时,我收到CryptographicException .在代码中放入一些断点之后,它甚至在执行方法之前抛出了异常.查看Export方法的定义,它使用SecuritySafeCriticalAttribute进行装饰,因此我怀疑此属性实际上是在抛出异常.导致此异常的原因是什么?如何保存密钥以便以后可以创建相同ECDiffieHellmanCng对象的实例?

c# security public-key-encryption diffie-hellman cng

4
推荐指数
1
解决办法
4713
查看次数

如何在C#中使用BouncyCastle的Diffie-Hellman?

我正在编写一个应用程序,它将在手机和Windows PC之间交换数据,我想保护使用Diffie-Hellman交换生成的密钥发送的数据.

我正在尝试使用BouncyCastle,但C#实现的几乎不存在的文档让我感到难过.

我想知道的是:当收到对方的密钥时,生成DH密钥和计算共享密钥的工作流程是什么?(我假设我可以将我的密钥作为字符串发送,我可以将另一方的密钥作为字符串使用.)我在C#中使用哪些对象/方法?

c# bouncycastle diffie-hellman

4
推荐指数
1
解决办法
2122
查看次数

DHGEX 在 Java 8 下使用 2048 位密钥失败,但使用 1024 位密钥成功

我使用 JSCH 0.1.53 连接到使用 1024 位 RSA 密钥的远程 SSH 服务器。当我们还使用 1024 位 RSA 密钥时,我们能够成功连接到远程服务器,但是当我们生成更强的 2048 位密钥时,我们就无法连接了。我们收到一条错误消息,内容为“素数大小必须是 64 的倍数,并且范围只能从 512 到 2048”,并且源自对 DHGEX.java (Diffie-Hellman Group EXchange) 的调用。

我们正在运行 Java 1.8,并且错误消息正确指定了 2048 的最大位大小,所以问题不在于 Java 1.6 和 1.7 中 1024 位的 JCE 密钥限制。我们已经通过 openssl rsa -text -noout -in id_rsa 和 ssh-keygen -lf id_rsa.pub 确认我们的私钥和公钥实际上都是 2048 位。

由于一切看起来都很好,我开始在 JSCH 代码中添加调试行并重新编译 JAR,我最终能够确定在密钥交换期间传递给我们的模数实际上是 2047 位长。现在,2047 位的长度本质上并不意味着您没有生成 2048 位的密钥,或者它的强度不如实际包含 2048 位的密钥,它只是意味着您碰巧得到了相乘的两个素数到第一位是 0 的东西。所以这是预期的行为(有时),JCE 检查可能应该是 (n % 64 == 0 || n % 64 == 63)。但是 JCE 在这一点上是一个坚持者,因此它拒绝了这个密钥,因为它不是它认为有效的长度。 …

java jsch public-key-encryption diffie-hellman

4
推荐指数
1
解决办法
6103
查看次数

使用 crypto 模块从 node.js 中的 Curve25519(或 X25519)非对称密钥对生成共享密钥

我正在尝试使用密钥交换算法(如Diffie Hellman密钥交换)在Curve25519 (或 X25519)非对称密钥对之间创建共享密钥。Diffie Hellman密钥交换可以在 node.js 中使用以下代码中的加密模块完成:

const crypto = require('crypto');

// Generate Alice's keys...
const alice = crypto.createDiffieHellman(2048);
const aliceKey = alice.generateKeys(); // Returns public key

// Generate Bob's keys...
const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys(); // Returns public key

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

// Should be equal
console.log(aliceSecret === bobSecret)
Run Code Online (Sandbox Code Playgroud)

X25519非对称密钥可以使用以下代码生成:

const crypto = require('crypto'); …
Run Code Online (Sandbox Code Playgroud)

encryption cryptography node.js diffie-hellman curve-25519

4
推荐指数
1
解决办法
4382
查看次数

Android上的DH Keypair生成时间

这是我用来生成DH密钥对的代码:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(1024, new SecureRandom());
KeyPair ackp = keyGen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

(当然没有必要的尝试/捕获).

我已经做了一些测试,迭代地运行这些代码并改变密钥大小(特别是从128步增加到128步到1024. 1024将是所需的大小.

首先,运行每个大小生成10次以使结果具有一些最小的std偏差会导致结果的高波动,平均而言,创建密钥(1024位)所需的时间是:683027ms,其向上舍入到周围创建密钥需要11分钟.

问题是:

  1. 有没有人得到相同的结果?
  2. 为了实现更低的时间,是否需要进行一些优化?
  3. 什么是高波动依赖?(即生成1024位密钥,可能需要18秒到30分钟...)

测试已在Nexus-One手机上进行

提前感谢您对"问题"有所了解

问候

time android nexus-one diffie-hellman

3
推荐指数
1
解决办法
3266
查看次数

Diffie-Hellman密码学的椭圆曲线版本如何工作?

椭圆曲线diffie hellman计算是否与此处定义的标准曲线有任何不同:

            /*
             * The basic Diffie-Hellman Key Agreement Equation 
             * 
             * The client initiates
             * A = g^a mod p
             * 
             * Sends (g p A) to the server
             * 
             * The server calculates B
             * B = g^b mod p
             * 
             * Sends B back to client
             * 
             * The client calculates K
             * K = B^a mod p
             * 
             * The server calucaltes K
             * K = A^b mod p
             * 
             */
Run Code Online (Sandbox Code Playgroud)

或者它只是选择g,a,p和b的特定方式?无论如何选择g,a,p和b?

elliptic-curve diffie-hellman

3
推荐指数
1
解决办法
3969
查看次数

如何使用nodejs中的Diffie-Hellman api实际加密某些内容?

我在这里看一下nodejs crypto文档中非常简单的演示:https://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name

他们很容易演示如何获得共享秘密...现在怎样?

如何使用所述共享密钥加密和解密数据?

cryptography node.js diffie-hellman

3
推荐指数
1
解决办法
3293
查看次数