我正在开发一个需要为公钥加密生成GPG密钥的项目。我选择的语言是Scala,加密内容库是BouncyCastle
密钥生成工作正常,但我找不到生成密钥而无需密码短语的方法。在BounceyCastle中生成密钥的每个类和每种方法都需要一个密码。
使用空密码短语导致gpg在解密/签名时仍然要求我这样做,传递null会在密钥生成时抛出异常。
这是我正在使用的代码(导入剥离):
object KeyGenerator {
Security.addProvider(new BouncyCastleProvider())
val kpg = KeyPairGenerator.getInstance("RSA", "BC")
kpg.initialize(2048)
def generateKeyPair(userID: String,
expiration: Option[Date]): PGPSecretKeyRing = {
val now = new Date
val keyPair = kpg.generateKeyPair();
val secretKey = new PGPKeyPair(RSA_GENERAL,
keyPair,
now)
val keyPair2 = kpg.generateKeyPair();
val secretKey2 = new PGPKeyPair(RSA_GENERAL,
keyPair2,
now)
val subpacketGen = new PGPSignatureSubpacketGenerator
subpacketGen.setKeyFlags(true, KeyFlags.CERTIFY_OTHER | KeyFlags.SIGN_DATA
| KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)
val keyRingGen = new PGPKeyRingGenerator(PGPSignature.POSITIVE_CERTIFICATION,
secretKey,
userID,
RSA_GENERAL,
"".toCharArray,
true,
subpacketGen.generate,
null,
new SecureRandom(),
"BC");
keyRingGen.addSubKey(secretKey2)
keyRingGen.generateSecretKeyRing
}
}
答案 0 :(得分:1)
您可以尝试使用SymmetricKeyAlgorithmTags.NULL(即不加密)将encAlgorithm参数添加到PGPKeyRingGenerator构造函数。可能API仍然需要占位符'passPhrase',但我相信在这种情况下它会被忽略。