第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在X25519中為PrivateKey生成PublicKey?

如何在X25519中為PrivateKey生成PublicKey?

狐的傳說 2024-01-05 15:10:12
我目前正在使用基于 X25519 密鑰的加密。我的問題基本上是如何PublicKey從現(xiàn)有的 X25519派生PrivateKey?我在以下位置找到了代碼XDHKeyPairGenerator:BigInteger publicKey = ops.computePublic(privateKey.clone());但這個包是特定于平臺的,因此無法訪問。我找不到通過可公開訪問的接口來完成此操作的方法。
查看完整描述

3 回答

?
HUH函數(shù)

TA貢獻1836條經(jīng)驗 獲得超4個贊

到目前為止,我只發(fā)現(xiàn)了一種通過 JDK 提供的接口來完成此操作的方法(不使用任何其他庫,如 Bouncy Castle 或 Google Tink):


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);

    }


}

    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();

    }

這不是一個非常優(yōu)雅的解決方案,但它無需任何第三方庫即可工作,而且我找不到任何其他方法。


查看完整回答
反對 回復 2024-01-05
?
有只小跳蛙

TA貢獻1824條經(jīng)驗 獲得超8個贊

您必須將私鑰(這只是一個很大的數(shù)字)乘以25519 曲線生成點。


下面是一些Python代碼來說明:


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 庫,我將盡力提供進一步幫助。


查看完整回答
反對 回復 2024-01-05
?
DIEA

TA貢獻1820條經(jīng)驗 獲得超2個贊

BouncyCastle有Ed25519KeyPairGenerator、X25519KeyPairGenerator、PrivateKeyInfoFactory和SubjectPublicKeyInfoFactory可以幫助制作密鑰。這是 C# 中的示例。將 ECKeyPairGenerator 替換為 X25519KeyPairGenerator。此示例使用標準密鑰和 NIST 曲線,因為我無法讓 Curve25519 使用 X25519 生成的密鑰,因為當前實現(xiàn)不支持 oid。


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);

    }


查看完整回答
反對 回復 2024-01-05
  • 3 回答
  • 0 關注
  • 323 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號