当前位置: 首页 > 知识库问答 >
问题:

Android SpongyCastle ECDH secp384r1密钥大小不正确

金赤岩
2023-03-14

我正在尝试在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来生成密钥对并提取共享秘密,您可以在这里看到一个示例。

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

主要问题是,这需要与一个iOS应用程序一起工作,这已经使用CryptoPP实现,所以我需要弄清楚如何使这个系列与那个版本一致,如果这甚至是可能的。

基本上,我需要一个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字节的压缩键。

之后,使用这些密钥提取共享秘密将是优先考虑的事情。总体来说,我对加密和使用这些库还很陌生,所以这里的任何帮助都将不胜感激。

共有1个答案

夏侯鹏
2023-03-14

我能够算出答案。下面的代码会给我我正在寻找的大小的钥匙。

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实现兼容。

 类似资料:
  • 也许你能帮我。非常感谢!

  • 问题内容: 我的redis实例似乎正在变得非常大,我想找出我那里的多个数据库中的哪个消耗了多少内存。Redis的命令仅向我显示了每个数据库的总大小和密钥数,这并没有给我带来太多的了解…因此,在监视Redis服务器时为我提供更多信息的任何工具/想法都将受到赞赏。 Redis文档没有显示任何可以返回某些键消耗的内存的命令,因此我想如果有错误代码会为Redis写很多“废纸t”,这可能很难找到… 问题答案

  • 问题内容: 我的测试可以在开发的MacBook Pro上很好地运行,但是无法在持续集成的TeamCity服务器中运行。 错误如下: java.security.InvalidKeyException: Illegal key size at javax.crypto.Cipher.a(DashoA13..) at javax.crypto.Cipher.init(DashoA13 ..) at j

  • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern