我正试图在安卓系统上使用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上工作的CryptoPP,所以现在我求助于SpongyCastle。
主要问题是,这需要与已经在使用iOS实现的CryptoPP应用程序一起工作,所以我需要弄清楚如何与该版本保持一致,如果可能的话。
基本上,我需要一个与下面的SpongyCastle加密实现相一致的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;第一步是,我需要弄清楚如何从SpongyCastle实现中提取49字节和48字节的压缩密钥。
在此之后,使用这些密钥提取共享秘密将是优先事项。总的来说,我对加密和使用这些库非常陌生,所以这里的任何帮助都是非常感谢的。
发布于 2016-03-01 18:56:23
我想出了答案。下面的代码将给我的钥匙与我正在寻找的大小。
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++实现兼容。
https://stackoverflow.com/questions/35713800
复制相似问题