首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PublicKey中为PrivateKey生成X25519?

如何在PublicKey中为PrivateKey生成X25519?
EN

Stack Overflow用户
提问于 2019-10-27 22:06:36
回答 3查看 4K关注 0票数 1

目前我正在使用基于X 25519密钥的加密。

我的问题基本上是,如何从现有的PublicKey PrivateKey中派生出PrivateKey

我在XDHKeyPairGenerator中找到了代码

代码语言:javascript
复制
BigInteger publicKey = ops.computePublic(privateKey.clone());

但是这个包是特定于平台的,因此无法访问。我也找不到一种方法来通过公开访问的接口来实现它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-28 14:24:53

到目前为止,我发现只有一种方法可以通过JDK提供的接口(而不使用任何额外的库,如Bouncy城堡或Google ):

代码语言:javascript
复制
public class StaticSecureRandom extends SecureRandom {

    private final byte[] privateKey;

    public StaticSecureRandom(byte[] privateKey) {
        this.privateKey = privateKey.clone();
    }

    @Override
    public void nextBytes(byte[] bytes) {
        System.arraycopy(privateKey, 0, bytes, 0, privateKey.length);
    }

}
代码语言:javascript
复制
    public PublicKey generatePublicKeyFromPrivate(PrivateKey privateKey) throws GeneralSecurityException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(X25519);
        keyPairGenerator.initialize(new NamedParameterSpec(X25519), new StaticSecureRandom(getScalar(privateKey)));
        return keyPairGenerator.generateKeyPair().getPublic();
    }

这不是一个非常优雅的解决方案,但它的工作没有任何第三方库,我找不到任何其他方式。

票数 3
EN

Stack Overflow用户

发布于 2019-10-28 11:58:31

您必须使用标量乘私钥(这只是一个很大的数字)由,即25519曲线生成器点

下面是python中的一些代码来说明:

代码语言:javascript
复制
from tinyec import registry
import secrets

curve = registry.get_curve('curve25519')

def compress_point(point):
    return hex(point.x) + hex(point.y % 2)[2:]


privKey = secrets.randbelow(curve.field.n)
pubKey = privKey * curve.g //the key step for you...


print("private key:", hex(privKey))
print("public key:", compress_point(pubKey))

如果您让我知道Java,我将尽力提供更多帮助。

票数 1
EN

Stack Overflow用户

发布于 2020-01-03 15:09:44

BouncyCastle有Ed25519KeyPairGenerator、X25519KeyPairGenerator、PrivateKeyInfoFactory和SubjectPublicKeyInfoFactory,它们可以帮助制作密钥。下面是C#中的一个例子。用ECKeyPairGenerator代替X25519KeyPairGenerator。这个例子使用一个标准键和一个NIST曲线,因为我无法让Curve25519使用X25519生成的键,因为在当前的实现中不支持oid。

代码语言:javascript
复制
public static async Task Bouncy()
    {
        var originalSecret = "X25519 example";
        var message = Encoding.UTF8.GetBytes(originalSecret);

        // Generate signing keys
        var gen = new Ed25519KeyPairGenerator();
        gen.Init(new Ed25519KeyGenerationParameters(new SecureRandom()));
        var kp = gen.GenerateKeyPair();

        // Sign data with private key
        var signer = new Ed25519Signer();
        signer.Init(true, kp.Private);
        signer.BlockUpdate(message, 0, message.Length);
        var sig = signer.GenerateSignature();

        // Verify signature with public key
        var verifier = new Ed25519Signer();
        verifier.Init(false, kp.Public);
        verifier.BlockUpdate(message, 0, message.Length);
        var sigresult = verifier.VerifySignature(sig);

        // Generate encryption keys
        var genX = new ECKeyPairGenerator();
        genX.Init(new KeyGenerationParameters(new SecureRandom(), 521));

        var p1 = genX.GenerateKeyPair();
        var p1_private = ECPrivateKeyStructure.GetInstance(PrivateKeyInfoFactory.CreatePrivateKeyInfo(p1.Private));
        var p1_x25519_priv = new X25519PrivateKeyParameters(p1_private.GetDerEncoded(), 0);

        var p2 = genX.GenerateKeyPair();
        var p2_public = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(p2.Public);
        var p2_x25519_pub = new X25519PublicKeyParameters(p2_public.GetDerEncoded(), 0);

        // Generate secret from keys
        var secret = new byte[32];
        p1_x25519_priv.GenerateSecret(p2_x25519_pub, secret, 0);

        // Setup ECIES (Elliptical Curve Integrated Encryption Scheme)
        var gcm = new GcmBlockCipher(new AesEngine());
        var ies = new IesEngine(new ECDHBasicAgreement(), new Kdf2BytesGenerator(new Sha512Digest()),
            new HMac(new Sha512Digest()), new PaddedBufferedBlockCipher(gcm.GetUnderlyingCipher()));

        // 256bit MAC, 256 key
        var p = new IesWithCipherParameters(secret, new byte[1], 256, 256);

        // Encrypt secret
        ies.Init(true, p1.Private, p2.Public, p);
        var encrypted = ies.ProcessBlock(message, 0, message.Length);

        // Decrypt secret
        ies.Init(false, p2.Private, p1.Public, p);
        var decrypted = ies.ProcessBlock(encrypted, 0, encrypted.Length);
        var decrypted_string = Encoding.UTF8.GetString(decrypted);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58583774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档