如何在C#中使用BouncyCastle's Diffie-Hellman?
我正在编写一个将在手机和Windows PC之间交换数据的应用程序,我想保护用Diffie-Hellman Exchange生成的键发送的数据. 我正在尝试为此使用Bouncycastle,但是C#实现的几乎不存在的文档使我感到困惑. 我想知道的是:当收到对方键时,生成DH键并计算共享密钥的工作流程是什么? (我假设我可以将密钥作为字符串发送,并且可以将另一侧的密钥作为字符串使用.)我在C#中使用哪些对象/方法? 解决方案 好吧,经过大量的试验,我开始了.发布答案,以防其他人需要. 我会假设读者(1)知道什么是diffie-hellman,以及它对什么有用的(读此处以获取详细信息)和(2)已经通过Nuget导入了一个.NET项目的Bouncycastle. 导入您需要: using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCa
4 2024-04-20
编程技术问答社区
.NET中的ECDiffieHellmanCng是否有执行NIST SP 800-56A第5.8.1节的密钥推导功能?
我有一个任务,需要使用NIST SP 800-56A(第5.8.1节)中描述的密钥推导函数得出关键材料.我不是密码学专家,所以如果问题是天真的,请原谅.这是我到目前为止所做的: 我有另一方的公钥和我的私钥 现在,我尝试使用ECDH 1.3.132.1.12使用C#(.NET 4)ecdiffiehellmancng类产生共享的秘密,例如: // The GetCngKey method reads the private key from a certificate in my Personal certificate store CngKey cngPrivateKey = GetCngKey(); ECDiffieHellmanCng ecDiffieHellmanCng = new ECDiffieHellmanCng(cngPrivateKey); ecDiffieHellmanCng.HashAlgorithm = CngAlgorithm.ECDiff
4 2024-04-12
编程技术问答社区
生成EC Diffie-Hellman公钥和私钥对
我需要生成一个EC Diffie Hellman密钥对.我使用的是secp256r1名为Curve和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))) prin
12 2024-04-08
编程技术问答社区
如何访问OpenSSL的EVP_PKEY结构中的原始ECDH公钥、私钥和参数?
我正在使用OpenSSL的C库来生成椭圆曲线diffie-hellman(ECDH)键对,遵循第一个代码示例在这里.它通过以下行掩盖了公共钥匙的实际交换: peerkey = get_peerkey(pkey); pkey变量和返回值均为EVP *类型. pkey包含前面生成的公共密钥,私钥和参数,而返回值仅包含同伴的公钥.因此提出了三个问题: get_peerkey()实际上将如何从pkey发送到同伴的公共密钥? 代码如何从pKey中提取私钥和参数来存储它们以备后使用? get_peerkey()将如何从对等的原始公共密钥中生成新的EVP_PKEY? 我已经看到OpenSSL函数EVP_PKEY_print_public(),EVP_PKEY_print_private()和EVP_PKEY_print_params(),但是这些是用于生成人类可读的输出.而且我还没有发现任何等效物将可读的公共密钥转换回EVP_PKEY结构. 解决方案 要回答我自己的问
20 2024-04-07
编程技术问答社区
BouncyCastle Java API和OpenSSL生成的ECDH密文是不同的
我正在尝试利用椭圆曲线加密.我需要两个实现同一件事,一个在Java中,一个在C中.我是使用使用曲线 secp256k1 生成的两个密钥对测试它们的.当我在Java中生成派生的秘密时,我总是会得到与从OpenSSL获得的不同的数字. Java代码: /* privateKey and peerPublicKey are generated with the following parameters */ ECParameterSpec paramSpec = ECNamedCurveTable.getParameterSpec("secp256k1"); /* ... */ Provider BC = new BouncyCastleProvider(); KeyAgreement agr = KeyAgreement.getInstance("ECDH", BC); agr.init(privateKey); agr.doPhase(peerPublicKey, true);
8 2024-04-03
编程技术问答社区
Diffie Hellman密钥协议每次都会产生不同的密钥。
我正在遇到Diffie Hellman实施的问题.我正在使用此代码 这实际上是我正在阅读的一本书中的一个例子.但是我不明白为什么generateSecret()为每个KeyAgreement创建一个不同的键.我已经注意到该功能会创建不同的键,即使我用相同的KeyAgreement调用它! 如果有人有建议,我真的很高兴! 感谢您的时间! 解决方案 我认为示例的一部分 private static BigInteger g512 = new BigInteger("1234567890", 16); private static BigInteger p512 = new BigInteger("1234567890", 16); 完全是虚假的. p需要是素数,g需要是生成器.当我尝试运行示例时,我会得到异常. 这个似乎是一个更合理的示例(但我没有测试过我本人). 基本上,DH Exchange的有趣输入是(p,g)对需要生成并且必须具有一些独特的属性.显
2 2024-04-03
编程技术问答社区
Java Diffie-Hellman密钥交换
我正在尝试执行代码执行Diffie-Hellman密钥交换.我从在线示例中采购代码(忘了现在). 我不得不导入Bouncycastle.jar,我认为该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 BigIntege
12 2024-04-03
编程技术问答社区
如何检查我的服务器Diffie-Hellman MODP大小(比特)并增加它?
美好的一天, 我有Linux Redhat中的自由服务器,我启用了唯一的TLSV1.2. i键入以下命令以获取服务器信息: openssl s_client -connect 10.7.5.65:9443 -msg 结果的一部分如下: 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 我看到了Server Temp Key值是DH,1024位,但也看到服务器公钥
4 2024-03-31
编程技术问答社区
处理BigInteger问题
假设以下diffie-hellman信息也可以在此 1)p string givenp = "00e655cc9e04f3bebae76ecca77143ef5c4451876615a9f8b4f712b8f3bdf47ee7f717c09bb5b2b66450831367d9dcf85f9f0528bcd5318fb1dab2f23ce77c48b6b7381eed13e80a14cca6b30b5e37ffe53db15e2d6b727a2efcee51893678d50e9a89166a359e574c4c3ca5e59fae79924fe6f186b36a2ebde9bf09fe4de50453"; BigInteger p = new BigInteger(HexToBytesv2(givenp)); 2)g BigInteger g = new BigInteger(2); 3)商人私钥 string merchantPrivateK
8 2024-03-30
编程技术问答社区
将Python的long/int转换为固定大小的字节数组
我正在尝试在Python中实现RC4和DH密钥交换.问题是我不知道如何将Python Long/INT从密钥交换转换为RC4实现所需的字节数组.是否有一种简单的方法可以将长度转换为所需长度字节数组? 更新:忘了提到我要处理的数字是768位未签名的整数. 解决方案 我没有做任何基准,但是这个食谱"对我有用". 简短版本:使用'%x' % val,然后unhexlify结果.但是,魔鬼在细节中,因为unhexlify需要均匀数量的十六进制数字,%x不能保证.有关详细信息,请参见Docstring和自由式内线评论. from binascii import unhexlify def long_to_bytes (val, endianness='big'): """ Use :ref:`string formatting` and :func:`~binascii.unhexlify` to convert ``val``, a :func
10 2024-03-04
编程技术问答社区
Java-Diffie-Hellman 加密-错误的输出
我正在尝试实施Diffie-Hellman密钥交换.我对如何使用秘密密钥有点困惑. 如输出所示,2个秘密密钥是使用与钥匙交换机中的正常基础和基础相同的素数生成的,并在生成秘密键时交易公共钥匙,但是它们并未输出与我预期的相同值. 我对如何实施这种加密方法感到非常困惑,并且对某个方向非常感激.我的总体目的是实施加密的SMS Android应用程序. (屏幕截图无法捕获A&B基础和Prime的整个长度) AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH"); paramGen.init(512); // number of bits AlgorithmParameters params = paramGen.generateParameters(); DHParameterSpec dhSpec = (DHParameterSpec)params.getP
12 2024-02-11
编程技术问答社区
确保安卓应用的安全
我已经"确保"了我的Android应用程序与提供金融交易服务的TLS服务器之间的通信. 安全凭据存储在Android APK中包含的BKS密钥库中.纯文本在应用程序来源中可见密钥库的密码: keyStore.load(is, "passwd".toCharArray()); 我担心,如果某人要逆转应用程序,他们将能够假冒另一个用户并损害服务的安全性. 我想知道我的实施是否有错,是否有人担心,确保这种可能性的最佳方法是. 解决方案 我相信 diffie-hellman键换我在找什么.我宁愿使用涉及用户的复杂过程重新实现自己的DH版本. 其他解决方案 每当您在客户端上存储安全数据时,逆向工程都可能会损害.您可以尝试在代码中掩盖它,但确定黑客无论如何都会弄清楚它.因此,使其更安全的唯一方法是不要在代码中公开使用密码.可能是您可以在应用程序开始时向用户询问一些PIN代码,然后使用它来解密密码? 其他解决方案 每个用户都存储在您的应用程序中的凭据,即
14 2024-02-05
编程技术问答社区
如何从DH密钥中获取AES密钥
我有以下代码将DH秘密密钥转换为AES秘密密钥.这曾经工作过直到PrivateKey privKey = null; PublicKey pubKey = null; PublicKey agreement = null; KeyAgreement keyAgreement = KeyAgreement.getInstance("DH"); keyAgreement.init(privKey); keyAgreement.doPhase(pubKey, false); keyAgreement.doPhase(agreement, true); SecretKey key = keyAgreement.generateSecret("AES"); 我尝试将最后一行更改为此.我可以使用新键进行加密和解密,但这与之前生成的旧密钥不起作用. byte[] encodedKey = keyAgreement.generateSecret(); SecretKey key = new
22 2024-01-19
编程技术问答社区
使用Diffie-Hellman密钥交换和AES在HTTP上进行客户端加密
在 diffie-hellman键交易我想尝试在JavaScript中尝试JavaScript,在我用以下规则在node.js上绘制了一个密码: 步骤1:客户端和服务器在共享密钥上达成一致: 客户端和服务器以512bit Prime公共密钥PK 开始 客户端生成一个512bit Prime私钥KC并发送Powmod(3,KC,PK) 服务器生成512bit Prime私有密钥KS并发送Powmod(3,KS,PK) 客户端&服务器使用Powmod(响应,PrivateKey,PK)作为共享密钥 步骤2:通信 在客户端发送数据之前,使用Stanford JavaScript加密库将其加密使用共享密钥(256bit AES,HMAC身份验证,PBKDF2密码加强和CCM身份验证.) 服务器用共享密钥解密数据后,它将生成一个新的512bit Prime Private密钥,并将其作为SJCL加密响应发送. 客户端和服务器使用powmod(
10 2024-01-19
编程技术问答社区
为什么Curve25519在参数错误的情况下仍能正确计算出密钥对?
似乎.NET(Core 3.1)支持ECC中的自定义曲线.因此,我已经定义了 curve25519 ,并通过以下代码生成密钥对: using System; using System.Security.Cryptography; namespace Curve25519 { class Program { static void Main(string[] args) { ECCurve ecCurve = new ECCurve() // Curve25519, 32 bytes, 256 bit { CurveType = ECCurve.ECCurveType.PrimeMontgomery, B = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6 2024-01-08
编程技术问答社区
获取瞬时密钥的x和y坐标
使用.net core 3.1,c#. 我对这个加密货币的东西根本不太好.有人可以帮我吗? 如何获得新生成的短暂的公共密钥X和Y字节? [编辑:让这个工作!请参阅下面的代码]. 如何生成未进行的衍生型晶型物质?也许这没有道理,但是我被要求不应用ecdh.HashAlgorithm = CngAlgorithm.Sha256;,但不是一个选择. 这是我目前要抓住X和Y字节的方法,但我认为这是错误的,因为当我在控制台中打印出来时,它与客户的生成密钥不同. public byte[] GetEphSecret(byte[] myPublicKey) { using var ecdh = new ECDiffieHellmanCng(); ecdh.ImportSubjectPublicKeyInfo(myPublicKey, out _); ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDe
10 2024-01-06
编程技术问答社区
iOS Swift 使用 Diffie-Hellman 密钥交换加密和解密信息?
如何使用Diffie-Hellman密钥交换来加密和解密消息? 我能够生成共享密钥(对于鲍勃和爱丽丝),但是SecKeyCopyKeyExchangeResult返回我的数据...我如何才能让seckey与SecKeyCreateDecryptedData和SecKeyCreateEncryptedData? 一起使用 所以我认为我应该以某种方式从共享数据中提取SECKEY,以便我可以进行符号加密/解密. 到目前为止的代码是: let bob_shared_secret: NSData = generateSharedKey_ecdh(publicKey: alicePublicKey, privateKey: bobPrivateKey)! let alice_shared_secret: NSData = generateSharedKey_ecdh(publicKey: bobPublicKey, privateKey: alicePrivateKey)!
12 2023-10-25
编程技术问答社区
使用Tomcat 7的Diffie-Hellman公钥错误
我成功地设置了两台使用Tomcat和SSL证书的Ubuntu机器. 我使用CentOS 6遵循了完全相同的过程,但是当我尝试连接到服务器(使用Opera)时,我得到了这一点: 服务器具有薄弱的短暂差异 - 赫尔曼公共密钥 连接器是以下内容,catalina.log中没有错误:
24 2023-10-23
编程技术问答社区
安卓系统上的DH密钥对生成时间
这是我用来生成DH Keypair的代码: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH"); keyGen.initialize(1024, new SecureRandom()); KeyPair ackp = keyGen.generateKeyPair(); (当然没有必要的尝试/捕捉). 我已经进行了一些测试,并在迭代地进行了此类代码,并改变了密钥的大小(特别是从128加速增加128步至1024.1024将是所需的尺寸. 首先,在结果上运行每个尺寸10次,在结果上具有一些最小的性病偏差,因此结果平均而言,结果平均而言,创建键所需的时间( 1024位) )是:683027ms,可用于创建钥匙的 11分钟. 问题是: 其他人会得到相同的结果吗? 为了达到较低的时间,是否有一些优化? 高波动取决于什么? (即,对于生成1024位键,可能需要18秒至30分钟...) 测试
16 2023-10-21
编程技术问答社区
TLS 1.2 ECDHE_RSA签名
我目前正在使用Java TLS服务器.我正在尝试使以下ciphersuite工作:tls_ecdhe_rsa_with_aes_aes_256_cbc_sha 当我使用openssl s_client对其进行测试时,我在serverkeyexchange消息之后得到以下错误: 140735242416208:错误:1414D172:SSL 例程:TLS12_CHECK_PEER_SIGALG:错误签名类型:T1_LIB.C:1130: 这是WireShark中所示的TLS消息 握手在DECODE_ERROR致命错误上失败. 所以我想客户不喜欢选择的签名算法. 但是,我现在仅使用默认的signatureandhashalgorithm,按照 如果协商的密钥交换算法是(RSA,dhe_rsa, dh_rsa,rsa_psk,ecdh_rsa,ecdhe_rsa),表现得好像客户端已发送 值{sha1,rsa}. (我仍在检查客户端是否确实提供了默认
14 2023-09-27
编程技术问答社区