标签: x25519

为什么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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
                A = new byte[] …
Run Code Online (Sandbox Code Playgroud)

elliptic-curve diffie-hellman curve-25519 .net-core x25519

7
推荐指数
1
解决办法
1505
查看次数

如何将 openssl 创建的 44 字节 x25519 公钥传递给需要 32 字节密钥长度的 CryptoKit

假设我使用 openssl 创建一个 x25519 密钥对,它将输出一个 64 字节私钥和相应的 44 字节 Base64 编码公钥,如下所示

-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VuBCIEIMBF8S7zUco4bRrMiIuyTcSYU/rAVlNtE8SMYWphUatw
-----END PRIVATE KEY-----


-----BEGIN PUBLIC KEY-----
MCowBQYDK2VuAyEAE0eiiP0PKjy9AVM/0z2ZIZn453WSJNemrQ58HAXDaX0=
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

Swift CryptoKit 仅接受私钥和公钥初始化各 32 个字节。

如果我理解正确的话,64 字节私钥是种子,其中前 32 字节是实际私钥。

尽管如此,对公钥使用相同的原理是行不通的(这并不令人惊讶)

现在的问题是:如何将公钥转换为 Swift CryptoKit 所需的 32 字节?

这是使用 Base64 解码公钥的前 32 个字节的无效示例

let base64PublicKey = Data(base64Encoded: "MCowBQYDK2VuAyEAE0eiiP0PKjy9AVM/0z2ZIZn453WSJNemrQ58HAXDaX0=")!.dropLast(12)

let publicKey = try! Curve25519.KeyAgreement.PublicKey(rawRepresentation: rawPublicKey) 
Run Code Online (Sandbox Code Playgroud)

openssl swift apple-cryptokit x25519

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