提问者:小点点

使用EC主密钥和充气城堡包装-展开私钥


我想使用外部EC密钥对(主密钥)将私钥从HSM中包装出来,然后验证我是否可以恢复它。
包装如下:

  1. 在HSM中生成一个秘密AES密钥,使用EC主密钥的公共部分、内部密钥对的私有部分和派生机制CKM_ECDH1_DERIVE。该机制的派生参数是:派生函数CKD_SHA256_KDF、共享数据和公共数据(公共数据取自公共EC主密钥)。
  2. 使用秘密AES密钥和诸如CKM_AES_GCMCKM_AES_KEY_WRAP_PADCKM_AES_CBC_PAD之类的机制包装私钥。
  3. HSM返回一个字节数组。

然后我想验证包装的私有是否是预期的。

我正在尝试使用这样的东西(我不知道用什么作为算法参数规范的实例):

KeyAgreement agreement = KeyAgreement.getInstance("ECCDHwithSHA256CKDF", "BC");
AlgorithmParameterSpec someAlgorithmParamSpec;
agreement.init(externalEcMasterKey.getPrivate(), someAlgorithmParamSpec);
agreement.doPhase(internalEcKeyPair.asJavaPublic(), true);
SecretKey agreedKey = agreement.generateSecret("AES[256]");

我不知道用EC键包装,所以我知道上面描述的三个步骤是否正确。
我需要帮助使用BC来恢复已包装的内容。

提前谢谢


共1个答案

匿名用户

解密加密的私钥如下:

byte[] ivbuf = new byte[16];
new SecureRandom().nextBytes(ivbuf);
IvParameterSpec iv = new IvParameterSpec(ivbuf);
String algorithm = “AES/CBC/PKCS5Padding”; // CKM_AES_GCM, CKM_AES_KEY_WRAP_PAD or CKM_AES_CBC_PAD
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, aesSecretKey, iv);
byte[] plainText = cipher.doFinal(encryptedPrivateKeyByteArray);
return new String(plainText);

相关问题