открытый замок открытый ключ gpg2 - PullRequest
4 голосов
/ 16 мая 2019

Я пытался реализовать решение здесь https://stackoverflow.com/a/33216302/4727842. Мой код выглядит так

private fun readPublicKey(input: InputStream): PGPPublicKey {
    val publicKey = PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(input), BcKeyFingerprintCalculator())
    var key: PGPPublicKey? = null

    publicKey.keyRings.forEach { ring: PGPPublicKeyRing ->
        ring.publicKeys.forEach { k: PGPPublicKey ->
            if (k.isEncryptionKey) {
                key = k
            }
        }
    }

    if (key == null) {
        throw IllegalArgumentException("Can't find encryption key input key ring.")
    } else {
        return key!!
    }
}

private fun encrypt(file: File): String {
    val input = IOUtils.toInputStream("pub.asc", "UTF-8")
    val key = readPublicKey(input)

    Security.addProvider(BouncyCastleProvider())

    val out = ByteArrayOutputStream()
    val compressor = PGPCompressedDataGenerator(PGPCompressedData.ZIP)

    PGPUtil.writeFileToLiteralData(compressor.open(out), PGPLiteralData.BINARY, file)
    compressor.close()

    val builder = BcPGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.TRIPLE_DES)
    val generator = PGPEncryptedDataGenerator(builder.setSecureRandom(SecureRandom()))

    generator.addMethod(BcPublicKeyKeyEncryptionMethodGenerator(key))

    return String(out.toByteArray())
}

Используя gpg cli (v2.2.15), после генерации ключа я вывожу asc-файл.

gpg -ab -o ./pub.asc

его содержимое выглядит так

-----BEGIN PGP SIGNATURE-----

iQEzBAABCAAdFiEEpjyVE0VY1bLTdOo7wzVyPJ8SXFIFAlzbRfQACgkQwzVyPJ8S
XFKtjwgAp1ad9jFxKtsbzR4XT4HqypTPxpwY8raoIeXNg2PMDAFXGqmcRmP4NEBO
BYqalHAxrzXKVPcmKHtYnm7Jb91VLcYycsF+9RM53mwhg2YJhv49xROx8IsJuhVG
8X52nhPc+qQtzE/79FPDgiZNKSnrHUDvPU3rrZH44WPsGQJ9iGy0eoJPomuU29Cb
wWYxOHq8fRmL5h5Pi9mU1dJRZvHej8ewt0DpredY//7Er7xjCKHrFyzddSn1sGtv
QvoOP+1pLNCV/LKAgCz2N2vSOToLqYTuQlrO/kNApnza0+lO0GW4RMf0OJntbSIa
MHDa+/uc9YnyABkptxD2a9DsbvHwvg==
=QeFf
-----END PGP SIGNATURE-----

Затем со строкой

val input = IOUtils.toInputStream("pub.asc", "UTF-8")

Я попытался бежать. Он выводит сообщение "Can't find encryption key input key ring." после неудачной попытки извлечь ключ. После отладки я увидел, что publicKey.keyRings размер был 0.

Я не понял ситуацию, так как в связанном руководстве, похоже, рекомендуется использовать файл .asc для шифрования, когда я думал, что это для подписи. Я не знаю много о PGP, но я думал, что это были разные шаги, и, возможно, подписывание не было необходимым для моего варианта использования.

Итак, я попытался экспортировать открытый ключ

gpg --export -a "User" > public.key

, содержащий

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBFzaBaIBCACngN7Zu5ZKKJuwlp9/iYLleIbYqTm1mxIVEsCiiksLTwbKIo2M
d7YeFDjJRPoKS94bt0FaRUV7cKwXTvqdVg0OITkTLE446TrMhi6Yz9InxkO1yC2l
RfVIZJgOfFBFTwiqx5HpPMmgHnpyzYESiwkNXR7mVIbIX4/5r+NOjMH/ioBSAd80
FV8Yl7k72B6gpbD/CEV6iR+uWlL99Bv6aYtbubCUEieY0KZyk998TFlatrtHvhDQ
ftVHYS4EsrnvlwtVD8QLbnYA2WsX6xVqpz8KHZ5LzXLys4D64sHZ5BkD3aX8Jp5s
iCpOb6rU4wdlD7gDJb1a1ks613C8Qj5/KHN1ABEBAAG0J0dyYXlkZW4gSG9ybWVz
IDxncmF5ZGVuLmhvcm1lc0BzYXAuY29tPokBVAQTAQgAPhYhBKY8lRNFWNWy03Tq
O8M1cjyfElxSBQJc2gWiAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
AAoJEMM1cjyfElxS2H0H/0O37sJfcNC2UFeuwoGqPMV4+3dN6sejpWBvQCw8OuGv
lDQmPUpEbBHs3awI83XlpYBbAKaDcJlIHPugM6CKGNWOL8RhL+ziJoGX1/Cldc5M
NHToNwU78/LE9Eog6oiC/VELnLP2qMRGK9+6sSYy7kz4zVPRzGjjD3t2uSxpoclO
LnF7Iqm6W+j2OIHACgBeqjjv4hgH4bJjXuixuPSxRLNp0dQ6PU8fj+xRjJudJWS6
hx3PM8/NZvoDruqEWjoTJW96S7askitImtcSw90kMbTpw/knZhpNeCJMQPF8jLUo
ZSbuC+8EukzuJ1mNxS9S0M1IX4psKEUttBYya+SoX/C5AQ0EXNoFogEIALk9vHyO
sXeqHEXeRsCHDyfOtFJlUFQvtkf3dwyyg4hVQq2vYTVyO+couxpgmCCrCzSNdlwK
Salh7Wejf+U+Erx8RzGJ764uyIlw/1B2qlGFgdWPaRWHtufQiUz6RNtWEhsBuddI
lbWxMOvbA3wfkFAIl+NQ8Aqqd8N9ao7mrXcADF7hRMtM+TllFJjxpNJeCWxwfeDf
EMM6totFf9CyD+Q0Zq6zyVFhgLiMuLPX4LsRMBKHGrg0LyyRQgDEezI1WH25YeAT
El8YJriEV4PcXQGnrsfkKbvsnNkXFb3nRlANuKlnHgBrSLE9Tqm4XuwG+czdGJuU
p0eyoxv4vrCGCgMAEQEAAYkBPAQYAQgAJhYhBKY8lRNFWNWy03TqO8M1cjyfElxS
BQJc2gWiAhsMBQkDwmcAAAoJEMM1cjyfElxSRuwH/3RZ6Zs5K76GaakJh0H5uw3H
mqrQiVSh1PmcGO2qRZuDrGDOiJWnOCnl48t71DgqjyABPAYsYzIhZXltA6lYVCI5
68HmUyfOHyeoZa6t35YM3A6S3jsIHRSQgu98R/1VK5EksQnGTrYwsa3gUQy+7BbN
F88+jRhEKnBYOABQ+M29pkx8zvH9UdrHWMTu2h5tb70volDSQzsdN9KX4EHoAto3
jP3janjIzYohBXM+FFte9HIOndwJ0RsZ5UD8lx8EmKh4DCUw3JxHagHOvdXopAAM
j+bUVTlu72LmvcsiNAKg7UicIuprKyHxDkSeelgEQt7Iz+6w3WL9djvL3hG3cks=
=9i+0
-----END PGP PUBLIC KEY BLOCK-----

и побежал с

val input = IOUtils.toInputStream("public.key", "UTF-8")

Это не принесло никаких изменений. bouncycastle не нашел ключей в моем файле открытого ключа. Затем я увидел, что, поскольку я использую gpg2, существуют различия в способах обработки ключей. Я нашел решение преобразовать .pkr в .kbx здесь https://stackoverflow.com/a/34221494/4727842, но в этот момент это стало крайне сложным. Я не знаю разницы между открытым ключом и открытым ключом. Я не знаю, почему в первом примере использовался файл .asc в качестве допустимого набора ключей. Особенно я не знаю, почему так сложно создать бодрящий PGPPublicKey объект из моего public.key файла.

...