我正在尝试在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字节的压缩键。
之后,使用这些密钥提取共享秘密将是优先考虑的事情。总体来说,我对加密和使用这些库还很陌生,所以这里的任何帮助都将不胜感激。
我能够算出答案。下面的代码会给我我正在寻找的大小的钥匙。
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