微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Curve25519公钥是309字节,私钥是587,不应该是32字节吗?

如何解决Curve25519公钥是309字节,私钥是587,不应该是32字节吗?

我正在尝试使用 bouncycastle 在我的 java 程序中实现 curve25519,这是我想出的代码

SELECT * {
    ?package a :package .
     FILTER NOT EXISTS {
         ?package :requires* ?requires .
         ?package :platform ?platform . 
         FILTER (?platform NOT IN(:Platform_1))
     }
}

还有我的主要方法

:requires

这是我从我的程序中得到的输出

package crypto;

import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;

public class Curve {

    public KeyPair generateKeyPair() throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {
        X9ECParameters ecP = CustomNamedCurves.getByName("curve25519");
        ECParameterSpec ecSpec = new ECParameterSpec(ecP.getCurve(),ecP.getG(),ecP.getN(),ecP.getH(),ecP.getSeed());
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC",new BouncyCastleProvider());
        keyGen.initialize(ecSpec);
        return keyGen.generateKeyPair();
    }

}

然而,这对我来说似乎不对。我读到 curve25519 公钥应该是 32 个字节,而这显然不是。我已经完成了尽职调查并从谷歌中提取了几个示例并进行了尝试,但仍然遇到了同样的问题。非常感谢任何帮助。

解决方法

Curve25519 不是 X9/Weierstrass 曲线。您所做的将与其他实现不兼容,这些实现都使用 Bernstein 的规范,用于称为 X25519 的 X-only Montgomery-form Diffie-Hellman 或称为 Ed25519 的 Edwards-form 签名(通常没有预散列)。 Java 用于所有非对称密钥(公共和私有)的密钥编码绝不仅仅是密钥本身,而是 a generic encoding that includes metadata,either X.509 SPKI or PKCS8 并通过强制此曲线首先为 Weierstrass 形式(对于 X9)然后为 unnamed em> 通过使用 ECParameterSpec 的显式且早已过时的 X9 形式,您会极大地膨胀该元数据。

改为分别在 "X25519" 和后续 "ED25519"KeyPairGenerator 中使用 算法 KeyAgreementSignature。标准编码仍会比原始密钥长,但要少得多。为了获得原始密钥,在 Oracle/Open 中适当地使用由算法相关的实现(提供者)类实现的接口 {XEC,EdEC}{Public,Private}Key。 (edit) Recent Bouncy (1.65 up) 在足够新的 Java 上运行也能做到这一点;否则 AFAICS 你必须获得通用 (ASN.1) 编码并解析它——Bouncy 确实单独公开了 (ASN.1) 功能(通过它的“轻量级”API 而不是 JCA)(并且从那时起大致如此)。

,

我正在尝试使用 bouncycastle 在我的 java 程序中实现 curve25519

我的哀悼。

您的问题是您输出的是 Base64 编码的 ASN.1,而不仅仅是公钥或私钥。 This decoder applied to your second output 显示实际的私钥。请注意,该点未压缩,因此 X 和 Y 坐标都存在(两个 32 字节的八位字节字符串)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。