java–Android SpongyCastle ECDH secp384r1密钥大小不正确

java–Android SpongyCastle ECDH secp384r1密钥大小不正确,第1张

概述我试图在Android上使用SpongyCastle进行ECDHsecp384r1公钥/私钥对的生成.我遇到的问题是,我生成的密钥太大了.公钥是120字节,私钥是194字节.显然有一些编码在这里.我不想要所有这些额外的信息,我正在寻找49字节和48字节压缩的公钥/私钥.以下是我生成密钥的方法:ECGenParameterS

我试图在Android上使用spongycastle进行ECDH secp384r1公钥/私钥对的生成.我遇到的问题是,我生成的密钥太大了.

公钥是120字节,私钥是194字节.显然有一些编码在这里.我不想要所有这些额外的信息,我正在寻找49字节和48字节压缩的公钥/私钥.

以下是我生成密钥的方法:

ECGenParameterSpec ecParamSpec = new ECGenParameterSpec("secp384r1");KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDH", "SC");kpg.initialize(ecParamSpec);KeyPair kpA = kpg.generateKeyPair();byte[] publicKeyBytes = kpA.getPublic().getEncoded();byte[] privateKeyBytes = kpA.getPrivate().getEncoded();

我正在沿着这条路走下去,因为我以前使用CryptopP和NDK生成密钥对并提取共享密钥,你可以看到here的一个例子.

但是我遇到了issue让CryptopP在AndroID Marshmallow上运行,所以现在我正在使用spongycastle.

主要问题是,这需要与已经使用CryptopP实现的iOS应用程序一起使用,因此我需要弄清楚如何使用该版本,如果可能的话.

基本上我需要一个Java spongycastle实现,它与以下C cryptopp实现一致:

   // Generate a public private key pair using ECDH (Elliptic Curve DiffIE Hellman)   OID CURVE = secp384r1(); // the key is 384 bits (48 bytes) long   autoSeededRandomPool rng;   // Because we are using point compression   // Private Key 48 bytes   // Public Key 49 bytes   // If compression was not used the public key would be 65 bytes long   ECDH < ECP >::Domain dhA( CURVE );   dhA.AccessGroupParameters().SetPointCompression(true);   SecByteBlock privA(dhA.PrivateKeyLength()), pubA(dhA.PublicKeyLength());   dhA.GenerateKeyPair(rng, privA, pubA);   jobject publicKeyByteBuffer = (*env).NewDirectByteBuffer(pubA.BytePtr(), pubA.SizeInBytes());   jobject privateKeyByteBuffer = (*env).NewDirectByteBuffer(privA.BytePtr(), privA.SizeInBytes());   // Return the ECDH Key Pair back as a Java ECDHKeyPair object   jclass keyPairClass = (*env).FindClass("com/tcolligan/ecdhtest/ECDHKeyPair");   jmethodID mIDConstructor = (*env).getmethodID(keyPairClass, "<init>", "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V");   jobject keyPairObject = (*env).NewObject(keyPairClass, mIDConstructor, publicKeyByteBuffer, privateKeyByteBuffer);   return keyPairObject;

第一步是我需要弄清楚如何从spongycastle实现中提取49和48字节的压缩密钥.

之后,使用这些密钥提取共享密钥将是优先级.我是加密整体和使用这些库的新手,所以在这里任何帮助将不胜感激.

解决方法:

我能够找到答案.以下代码将为我提供我正在寻找的尺寸的键.

ECGenParameterSpec ecParamSpec = new ECGenParameterSpec("secp384r1");KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDH", "SC");kpg.initialize(ecParamSpec);KeyPair kpA = kpg.generateKeyPair();BCEcpublicKey publicKey = (BCEcpublicKey)kpA.getPublic();BCECPrivateKey privateKey = (BCECPrivateKey)kpA.getPrivate();byte[] publicKeyBytes = publicKey.getQ().getEncoded(true);byte[] privateKeyBytes = privateKey.getD().toByteArray();

好消息是,它似乎也与cryptopp C实现兼容.

总结

以上是内存溢出为你收集整理的java – Android SpongyCastle ECDH secp384r1密钥大小不正确全部内容,希望文章能够帮你解决java – Android SpongyCastle ECDH secp384r1密钥大小不正确所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1118268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存