Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android SpongyCastle ECDH secp384r1密钥大小不正确_Java_Android_Bouncycastle_Crypto++_Spongycastle - Fatal编程技术网

Java Android SpongyCastle ECDH secp384r1密钥大小不正确

Java Android SpongyCastle ECDH secp384r1密钥大小不正确,java,android,bouncycastle,crypto++,spongycastle,Java,Android,Bouncycastle,Crypto++,Spongycastle,我正在尝试使用Android上的SpongyCastle生成ECDH secp384r1公钥/私钥对。我遇到的问题是,我生成的密钥太大了 公钥为120字节,私钥为194字节。很明显,这里正在进行某种编码。我不想要所有这些额外的信息,我正在寻找49字节和48字节压缩的公钥/私钥 以下是我生成密钥的方式: ECGenParameterSpec ecParamSpec = new ECGenParameterSpec("secp384r1"); KeyPairGenerator kpg = KeyPa

我正在尝试使用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在Android棉花糖上工作的问题,所以现在我求助于SpongyCastle

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

基本上我需要一个java SpunyCube实现,它符合C++ C++密码实现:

   // 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;
//使用ECDH(椭圆曲线Diffie-Hellman)生成公私密钥对
OID曲线=secp384r1();//密钥长度为384位(48字节)
自动进料器随机工具rng;
//因为我们使用的是点压缩
//私钥48字节
//公钥49字节
//如果不使用压缩,公钥的长度将为65字节
ECDH:结构域dhA(曲线);
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());
//将ECDH密钥对作为Java ECDHKeyPair对象返回
jclass keyPairClass=(*env.FindClass(“com/tcolligan/ecdhtest/ECDHKeyPair”);
jmethodID midConstructor=(*env).GetMethodID(keyPairClass,“,”(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V);
jobject-keyPairObject=(*env).NewObject(keyPairClass、midConstructor、publicKeyByteBuffer、privateKeyByteBuffer);
返回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();

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

使用代码>私有密钥.GETD().ToBytErayLe()/Cux>可能会给结果带来不一致的长度,如果您想要固定的48字节私钥(不确定是否是这样的话),这可能是个问题。更喜欢大整数。asUnsignedByteArray(48,privateKey.getD())。哦,有意思,我明白你的意思了。我认为我的实现不会有问题,但我会仔细检查。谢谢你的提醒!试图实现这个答案,但kpg.initialize(ecParamSpec);给了我一条红色的曲线