Tag: 椭圆曲线

固定长度64字节EC P-256使用JCE签名

我需要一个固定长度的64字节ECDSA签名和NIST P-256曲线。 该实现有使用JCE。 以下代码示例可以生成签名并进行validation。 Provider provSign = new SunEC(); Provider provVerify = new SunEC(); // generate EC key KeyPairGenerator kg = KeyPairGenerator.getInstance(“EC”, provSign); ECGenParameterSpec ecParam = new ECGenParameterSpec(“secp256r1”); kg.initialize(ecParam); KeyPair keyPair = kg.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); try { // export public key KeyFactory kf = KeyFactory.getInstance(“EC”, provSign); ECPublicKeySpec publicKeySpec = […]

java.lang.IllegalArgumentException:string curve25519 not a OID bouncycastle 1.52

我正在尝试使用/ java bouncy castle 1.52实现为曲线25519生成一个密钥对 java.lang.IllegalArgumentException:string curve25519不是OID 这是我的代码: public KeyPair generateKeys() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(“curve25519”); KeyPairGenerator g = KeyPairGenerator.getInstance(“ECDSA”, “BC”); g.initialize(ecSpec, new SecureRandom()); return g.generateKeyPair(); } 这段代码的结果是下面的堆栈跟踪: java.lang.IllegalArgumentException:string curve25519不是org.bouncycastle.asn1.ASN1ObjectIdentifier上的OID。(未知来源)org.bouncycastle.jcajce上的org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey.getEncoded(未知来源)位于org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey。(未知来源)的.provider.asymmetric.ec.BCECPrivateKey.getPublicKeyDetails(未知来源)org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi $ EC。在com.poc.databank.encryption.BouncyCastleEncryption.generateKeys(BouncyCastleEncryption.java:22)的com.poc.databank.encryption.BouncyCastleTest.testApp(BouncyCastleTest.java:16)的sun.reflect.NativeMethodAccessorImpl上生成KeyPair(未知来源)。在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)的java.lang.reflect.Method.invoke(Method.java:)中的invoke0(本地方法) 606)在org.junit.runners.model。 FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47)org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44 )org.junit.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)org.junit.runners.BlockJUnit4ClassRunner.runChild(org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) BlockJUnit4ClassRunner.java:70)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)org.junit.runners.ParentRunner $ 1 .schedule(ParentRunner.java:63)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)org.junit.runners org.eclipse.jdt.internal.junit4.runner.JUnit4Tes上org.junit.runners.ParentRunner.run(ParentRunner.java:309)的.ParentRunner $ 2.evaluate(ParentRunner.java:229) tReference.run(JUnit4TestReference.java:50)org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:467)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 390)at […]

使用此椭圆曲线点乘法计算的点不在曲线上,并且此类带来算术exception

我使用标准投影坐标得到了我的点乘法误差。 我不知道我错过了什么,但是乘法点不在曲线上,有时它会输出类似算术exception的东西:整数不可逆。 public class ECPointArthimetic { EllipticCurve ec; private BigInteger x; private BigInteger y; private BigInteger z; private BigInteger zinv; private BigInteger one = BigInteger.ONE; private BigInteger zero = BigInteger.ZERO; private boolean infinity; public ECPointArthimetic(EllipticCurve ec, BigInteger x, BigInteger y, BigInteger z) { this.ec = ec; this.x = x; this.y = y; // Projective coordinates: […]

使用给定私钥在椭圆曲线算法中生成公钥的代码

我需要使用jdk 1.7实现ECC(椭圆曲线加密)算法。 我尝试使用充气城堡,sunEC,但他们都给出了错误和错误。 我的目标是使用私钥生成椭圆曲线,我将被赋予系统。 因此,我需要使用jdk1.7获取使用给定私钥生成公钥的准确代码。 我使用的IDE是ecllipse。 我需要知道,除私钥外,我应该给出的其他参数是什么? 提供曲线点和私钥是否足够? 有人可以帮我从私钥生成公钥吗? 我可以管理其余的实现。 任何知道使用java实现Elliptic Curve Cryptography键的人,请告诉我这段代码是否正确? public class ECCrypt { private ECPoint curve_point; public ECCrypt(ECPoint curve_point) { this.curve_point = curve_point; } public BigInteger makePublicKey(BigInteger privateKey) { ECPoint ecPublicKey = new ECPoint(curve_point); ecPublicKey.mult(privateKey); return ecPublicKey.pack(); } public static void main(String[] argv) throws Exception { java.util.Random rnd = new java.util.Random(); […]

在Java安全性中使用openssh公钥(ecdsa-sha2-nistp256)

是否有一个Java库/示例来读取Java中JCE PublicKey的openssh格式ecdsa PublicKey ? 我想将EC用于JWT 。 我试图读取的格式是按authorized_keys中,或Github的API(如https://api.github.com/users/davidcarboni/keys ): ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK8hPtB72/sfYgNw1WTska2DNOJFx+QhUxuV6OLINSD2ty+6gxcM8yZrvMqWdMePGRb2cGh8L/0bGOk+64IQ/pM= 我找到了这个答案,这对RSA和DSS来说很好: 使用来自使用Java安全性的authorized_keys的公钥 ,以及对ECDSA的openssh格式的讨论: https : //security.stackexchange.com/questions/129910/ecdsa-为什么-DO-SSH-凯基和Java的生成公共密钥具备的,不同的,大小 然而,我迷失了尝试调整ECDSA的RSS / DSA代码 – 我不知道如何设置ECPublicKeySpec 。 它需要ECPoint , EllipticCurve , ECParameterSpec , ECField 。 openssh格式只包含两个整数,这对ECPoint ,但我不知道如何设置其余的。 我一直在寻找一堆库,包括jsch , sshj , ssh-tools和古老的Bouncycastle 。 我最接近的是: com.jcraft.jsch.KeyPair load = com.jcraft.jsch.KeyPair.load(jsch, null, bytes[openSshKey]); 哪个加载密钥很好,但不会让我去JCE PublicKey – 只是一个byte[] getPublicKeyBlob()方法。 我错过了一些明显的东西吗

如何将PEM编码的椭圆曲线公钥加载到Bouncy Castle?

我有一个PEM编码的Elliptic Curve公钥,我正在尝试加载到Bouncy Castle中,到目前为止我尝试的所有内容都失败了。 这是我正在尝试加载的密钥的示例: —–BEGIN PUBLIC KEY—– MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBhsFCcWY2GaiN1BjPEd1v+ESKO6/0 D0sUR4y1amHnOr3FZx6TdqdoSBqxownQrnAKGCwagGxUb7BWwPFgHqKQJHgBq+J7 F+6m5SKAEL1wS5pqya91N7oudF3yFW8oZRE4RQRdSLl3fV2aVXKwGDXciwhUhw8k x5OS4iZpMAY+LI4WVGU= —–END PUBLIC KEY—– 它由NodeJS Crypto模块生成,曲线名称为secp521r1。 它稍后由npm包密钥编码器编码到PEM中。 我已经在JavaScript(实际上是ClojureScript)中使用它来validation签名,现在我需要使用Javavalidation服务器上的签名(实际上是Clojure)。 我尝试从密钥中删除守卫,转换为byte []并创建X509EncodedKeySpec。 那没用。 它崩溃了: InvalidKeySpecException encoded key spec not recognised org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic (:-1) 我用来加载密钥的代码: KeyFactory. getInstance(“ECDSA”, “BC”). generatePublic(new X509EncodedKeySpec(publicKey.getBytes())) 以防万一,这是我的Clojure代码: (-> (KeyFactory/getInstance “ECDSA”) (.generatePublic (X509EncodedKeySpec. (.getBytes public-key)))) 我也尝试过PKCS8EncodedKeySpec,但是我收到了错误: InvalidKeySpecException key spec not recognised org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic (:-1) 我也在这里试过这个方法: https ://gist.github.com/wuyongzheng/0e2ed6d8a075153efcd3#file-ecdh_bc-java-L47-L50但是在运行decodePoint时我收到错误: […]

ECC PublicKey的Java紧凑表示

java.security.PublicKey#getEncoded()返回密钥的X509表示,在ECC的情况下,与原始ECC值相比增加了很多开销。 我希望能够在大多数紧凑的表示中将PublicKey转换为字节数组(反之亦然)(即尽可能小的字节块)。 KeyType(ECC)和具体曲线类型是预先已知的,因此不需要对它们的信息进行编码。 解决方案可以使用Java API,BouncyCastle或任何其他自定义代码/库(只要许可证并不意味着需要使用它的开源专有代码)。

椭圆曲线上点的标量乘法

我正在NIST指定的曲线“p192”上实现Elliptic Curve Point算术运算。 出于测试目的,我已经在NIST例程文档中针对曲线p192采用了示例点。 我得到正确的答案,增加点和加倍点,但对于标量乘法,我的答案是不正确的。 由于这个原因,我无法达到 $ k^{-1}(kP) = P $ 哪里 $ k^{-1}.k = 1 mod p $ 请帮我理解我犯错误的地方。 package a; import java.math.BigInteger; import java.security.spec.ECPoint; public class ScalarMultiply { private static final BigInteger ONE = new BigInteger(“1”);; static BigInteger TWO = new BigInteger(“2”); static BigInteger p = new BigInteger(“6277101735386680763835789423207666416083908700390324961279”); public static ECPoint scalmult(ECPoint P, […]

如何将公共EC代码点和曲线名称转换为PublicKey?

我有两个32字节长字节数组,表示EC公钥的X和Y值。 我知道曲线是命名曲线“prime256v1”。 如何将其转换为Java PublicKey对象? JCE似乎没有提供使用命名曲线的任何设施。 Bouncycastle的示例代码似乎没有使用我能找到的任何版本的bouncycastle进行编译。 WTF?