- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在 ARM cortex M3 和 PC 之间使用椭圆曲线 Diffie Hellman。在 ARM 上,我使用 mbed TLS .在 PC 端,我想使用 C# 和 ECDiffieHellman(Cng)类。
我可以在 ARM 和 ARM 上做 ECDH,但是当我尝试用 PC 替换一侧时我确实遇到了麻烦。
<LEN><0x04><X><Y>
.因此,在 C# 中,我使用
导入公钥私有(private)静态EC
DiffieHellmanPublicKey ToPublicKey(byte[] publicKey)
{
var keyLength = 32;
if (publicKey[0] != (2 + 2 * keyLength) - 1)
throw new ArgumentException("Invalid key length", nameof(publicKey));
if (publicKey[1] != 0x04)
throw new ArgumentException("Invalid key format", nameof(publicKey));
var parameters = new ECParameters()
{
Curve = ECCurve.NamedCurves.brainpoolP256r1,
Q = new ECPoint()
{
X = publicKey.Skip(2).Take(keyLength).ToArray(),
Y = publicKey.Skip(2 + keyLength).Take(keyLength).ToArray()
}
};
using (var tmp = ECDiffieHellman.Create(parameters))
{
return tmp.PublicKey;
}
}
var ecdh = new ECDiffieHellmanCng(ECCurve.NamedCurves.brainpoolP256r1);
ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Tls;
ecdh.Seed = new byte[32];
ecdh.Label = Encoding.ASCII.GetBytes("ECDiffieHellman");
new RNGCryptoServiceProvider().GetBytes(ecdh.Seed);
// ...
var sharedSecret = ecdh.DeriveKeyMaterial(peersPublicKey);
我的问题是生成的共享 key 与 mbed TLS 生成的共享 key 的长度不同并且不匹配。
有人已经解决了这个问题吗?
谢谢!
编辑 1:
我忘了说,我在 ARM 上使用裸 ECDH。所以我认为没有任何 key 派生函数在执行。对结果进行散列 (SHA256) 以匹配 C# 端是否足够(在此处将 SHA256 配置为 KDF 时)?
最佳答案
我解决了这个问题。简而言之:只需散列 ECDH 结果。
C/C++ 端:
mbedtls_ecdh_init(...);
mbedtls_ecdh_setup(...);
mbedtls_ecdh_make_public(...); //make own public key and send it to peer
mbedtls_ecdh_read_public(...); //reed peers public key
mbedtls_ecdh_calc_secret(...); //note: i pass in my own RND func because of no OS
mbedtls_ecdh_free(...);
mbedtls_sha256_init(...);
mbedtls_sha256_starts_ret(...);
mbedtls_sha256_update_ret(...);
mbedtls_sha256_finish_ret(...);
mbedtls_sha256_free(...);
C# 端:
private void EllipticCurveDiffieHellman()
{
var ecdh = new ECDiffieHellmanCng(ECCurve.NamedCurves.brainpoolP256r1);
ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
ecdh.HashAlgorithm = CngAlgorithm.Sha256;
//get relevant point from own public key
var ownPublicKey = ecdh.PublicKey.ExportExplicitParameters().Q;
var peersPublicKey = SendPublicKey(ownPublicKey); //key exchange
var sharedSecret = ecdh.DeriveKeyMaterial(peersPublicKey);
Console.WriteLine("Key: " + HexValue.Parse(sharedSecret.ToArray()));
}
DiffieHellmanPublicKey ToPublicKey(byte[] publicKey)
{
var keyLength = 32;
if (publicKey[0] != (2 + 2 * keyLength) - 1)
throw new ArgumentException("Invalid key length", nameof(publicKey));
if (publicKey[1] != 0x04)
throw new ArgumentException("Invalid key format", nameof(publicKey));
var parameters = new ECParameters()
{
Curve = ECCurve.NamedCurves.brainpoolP256r1,
Q = new ECPoint()
{
X = publicKey.Skip(2).Take(keyLength).ToArray(),
Y = publicKey.Skip(2 + keyLength).Take(keyLength).ToArray()
}
};
using (var tmp = ECDiffieHellman.Create(parameters))
{
return tmp.PublicKey;
}
}
关于c# - ECDiffieHellman - mbedTLS 与 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167034/
我有一个 x509 证书加载到 mbedtls 中,我可以通过以下方式获取整个主题字段: mbedtls_x509_dn_gets(p, n, cert.subject); 可以对输出进行字符串标记以
我目前正在一个项目中使用 mbedtls。我想知道是否有错误查找功能可以获取错误代码并返回某种错误消息? 最佳答案 是的,您可以查看引用应用程序: strerror查看需要调用什么 API 来将错误读
尝试将 mbedtls 添加到我的项目中,我使用 apt-get install 安装 libmbedtls-dev这些进口不正确吗?对于 Ubuntu 16.04。在 18.04 上工作正常 fil
有人可以解释如何使用 Mbedtls 库从服务器下载文件吗?他们提供了一些使用来自本地主机的 GET 请求的示例。我已经使用它并进行了修改以使用 POST。这很好用但是看起来当我发送一个 GET 请求
我使用 mbedtls 库编写了以下简单的加密解密程序。加密工作正常(根据 http://aes.online-domain-tools.com/ 检查)。但是,当解密回来时,我得到了不正确的结果(o
谁能帮我找出为什么我在尝试从 unsigned char* 解析公钥/私钥时得到 -16000(错误的输入数据)? 这是我的代码(为简洁起见进行了编辑): DataPoint* GetPublicKe
目前我在 stm32f7 nucleo 板上测试 mbedTLS 的 sha256 性能。我用 cycle counter register 测量 stm32 板的运行周期。测量公式看起来像这样: D
我正在尝试将一些为在 Mac 上运行而编写的 C 代码转换为没有任何加密库的嵌入式设备。 Mac 的代码使用 libcrypto。我尝试从嵌入式设备的 openssl 源构建 libcrypto,但由
我正在使用 mbedtls 来运行 SSL 服务器。mbedtls_ctr_drbg_seed 函数返回 -34。我的代码如下: const char *pers = "ssl_server2";
我需要在 ARM cortex M3 和 PC 之间使用椭圆曲线 Diffie Hellman。在 ARM 上,我使用 mbed TLS .在 PC 端,我想使用 C# 和 ECDiffieHellm
Mbedtls 可以使用其 mbedtls_x509_crt_verify(...) 函数 ( link ) 验证 x509 证书。 但是,我有: 公钥/私钥对(保存在 mbedtls_pk_cont
我正在尝试在我的 IoT 项目中实现 SSL 客户端。我已将在 STM32Cube_FW_F7_V1.15.0 中找到的 SSL_Client 示例复制到我的项目中,并且能够成功编译。但是 SSL 握
您好,提前致谢。 我是 mbedtls 的新手。以下使用 openssl 将非常简单,但是我不知道从哪里开始。 我需要从像 https://example.com 这样的服务器捕获证书链作为类似于下面
我们都知道mbedtls库是一个非常轻量级的c库。我想使用该库来加密字符串。所以我有一个这样的函数: aes_加密.h: #ifndef AES_ENCRYPT_H #define AES_ENCRY
我想为我的项目添加 TLS 支持。我正在使用 mbedTLS 和 LWIP。由于我对两者都不熟悉,我想知道我是否可以直接使用 LWIP 中的 mbedTLS API,或者我需要进行一些更改。为了 LW
首先,让我首先声明我不是密码学家,我也不是很擅长编写 C 代码,所以如果这个问题的答案很明显或已经回答,请原谅。我正在开发消息程序,无法在目标平台上使用 TLS。因此,我需要找到一种使用对称预共享 k
我正在尝试在我的 IoT 项目中实现 SSL 客户端。我已将在 STM32Cube_FW_F7_V1.15.0 中找到的 SSL_Client 示例复制到我的项目中,并且能够成功编译。但是 SSL 握
我正在研究用于嵌入式设备的不同 SSL/TLS 库。 我想知道人们认为这些库中的每一个的优缺点是什么,以及这些库中的任何一个是否有特定的用例。 最佳答案 首先,所有三个库都将完成相同的事情,只有一个可
编辑:更改代码以提供更简单的测试用例 我正在创建一个简单的客户端/服务器应用程序,它使用 Curve25519 进行 key 交换。客户端使用 mbedtls 在 C 中实现,服务器使用 Bouncy
我尝试使用 mbedTLS 实现 AES-CMAC。我收到一些错误: undefined reference to mbedtls_cipher_cmac_starts, undefined refe
我是一名优秀的程序员,十分优秀!