【问题标题】:How to generate OpenPGP KeyPair without passphrase using BouncyCastle?如何使用 BouncyCastle 生成没有密码的 OpenPGP KeyPair?
【发布时间】:2011-04-09 20:29:45
【问题描述】:

我正在开发一个需要为公钥加密生成 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
  }
}

【问题讨论】:

  • 这确实是一个 gpg 问题,因为无论你在 Java 端做什么,你仍然需要 gpg 来做你的投标。
  • 对安全性不利,但由于您没有给出上下文,我无法判断这是一个坏建议还是一个好建议......如果您只想能够生成密钥并且不要'不在乎密码,然后使用硬编码。
  • 我想要没有密码的钥匙。我正在使用它们对文件进行一次性解密。您为公钥加密文件,稍后获取私钥再次解密。不需要密码,而且硬编码对用户来说很烦人。

标签: java scala bouncycastle pgp openpgp


【解决方案1】:

您可以尝试对 PGPKeyRingGenerator 构造函数的 encAlgorithm 参数使用 SymmetricKeyAlgorithmTags.NULL(即不加密)。可能 API 仍然需要占位符“passPhrase”,但我相信在这种情况下它会被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2015-06-18
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多