首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓SpongyCastle电子ECDH secp384r1密钥大小不正确

安卓SpongyCastle电子ECDH secp384r1密钥大小不正确
EN

Stack Overflow用户
提问于 2016-03-01 02:53:06
回答 1查看 1.7K关注 0票数 4

我正试图在安卓系统上使用SpongyCastle来生成ECDH secp384r1公钥/私钥对。我遇到的问题是,我正在产生的钥匙太大了。

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

下面是我如何生成我的密钥:

代码语言:javascript
复制
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来生成密钥对并提取共享的秘密,您可以看到这里的一个例子。

然而,我遇到了一个让CryptoPP在Android上工作的CryptoPP,所以现在我求助于SpongyCastle。

主要问题是,这需要与已经在使用iOS实现的CryptoPP应用程序一起工作,所以我需要弄清楚如何与该版本保持一致,如果可能的话。

基本上,我需要一个与下面的SpongyCastle加密实现相一致的C++实现:

代码语言:javascript
复制
   // 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字节的压缩密钥。

在此之后,使用这些密钥提取共享秘密将是优先事项。总的来说,我对加密和使用这些库非常陌生,所以这里的任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 18:56:23

我想出了答案。下面的代码将给我的钥匙与我正在寻找的大小。

代码语言:javascript
复制
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();

好消息是,它似乎也与加密C++实现兼容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35713800

复制
相关文章

相似问题

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