kotlin - 如何使用 BouncyCaSTLe 从 java/kotlin 中的文件/字符串中读取 RSA 公钥

标签 kotlin bouncycastle

我正在尝试从 kotlin 解析 RSA 格式的公钥。我有一个字符串中的键,其内容如下:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAwAzOKC8d0o0dcv1KqILLehASGgOWyjlAc+adazix6ThhX7QeD3Qw
HzxPpbwsJrVPIEMEIN383awIqnCfIL+AbCQPL13XaUCCS74wC5a84X1r6hcI5XO1
9CPAn+jBKmTr4hPaHWKxuhfO3PcXxGfQdXyqNT96bCYnAYaeSECohFjqDbe+RFcL
1lIns2GtQPMh1/uDyhPA+8HSguREWn+Ac3I2c0wtrzZa6R4nruPgIi6XbWRqAskr
tzbO2Xy6O1DcERH9tg+es/pbrWHRHrwEmLXorj3iGqkJJBUmLeW6B5EjmIgiukdJ
dw7bLTNcwf2n0BLJy/bgnhcw4TMOzUadSQIDAQAB
-----END RSA PUBLIC KEY-----

我发现了很多代码示例来执行此操作,这些示例涉及使用 String.replace() 修剪 BEGIN 和 END,但这对我来说似乎很老套。 BouncyCastle code seems to handle this already包括为它遇到的不同类型的"file"创建解析器的能力。我正在尝试这个:
try {
    val parser = PEMParser(StringReader(publicKeyString))
    val pemObject = parser.readPemObject()
    val pemContent = pemObject.content
    val key = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(pemContent)
    serviceLogger.info("Key object: {}", key)
} catch (e: Exception) {
    serviceLogger.error("Could not generate key from keyspec", e)
}

我可以毫无问题地获得 pemContent (字节数组),但是当我尝试将其实际解析为 RSAPublicKey 时,我得到了这个:
java.lang.IllegalArgumentException: failed to construct sequence from byte[]: DEF length 3 object truncated by 2

我无法弄清楚我是否正确调用 RSAPublicKey.getInstance() - 使用整个 PemObject 的内容 - 还是这个异常告诉我我的 key 有问题。

我在这方面能找到的例子已经很老了,而且 API 似乎已经发展到我不应该手动分割字符串的地步。

我怀疑这真的有助于解决问题,但我正在从一个 rsa key 对生成这个文件:
func PublicKeyToPemBytes(prvkey *rsa.PrivateKey) ([]byte, error) {
    var pubkey *rsa.PublicKey
    pubkey = &prvkey.PublicKey

    pubkey_bytes := x509.MarshalPKCS1PublicKey(pubkey)
    if pubkey_bytes == nil {
        return nil, errors.New("Public key could not be serialized")
    }

    pubkey_pem := pem.EncodeToMemory(
        &pem.Block{
            Type:  "RSA PUBLIC KEY",
            Bytes: pubkey_bytes,
        },
    )

    return pubkey_pem, nil
}

go rsa.PublicKey 对象包含一个 N 和一个 E。它为我提供了上面列出的文件,base64 解码结果完全相同,长度为 270 字节。

最佳答案

dave_thompson_085 是对的。这段代码确实有效。他问我是否改变了数据,这让我更仔细地观察它,我意识到我在 base64 上做了一个 .toUpperCase() 。结果仍然是完全有效的base64,有些位在这里和那里翻转。我根本不应该这样做 .toUpperCase() ,直到他这么说我才看到它。有弹性的确实有效。

关于kotlin - 如何使用 BouncyCaSTLe 从 java/kotlin 中的文件/字符串中读取 RSA 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938195/

相关文章:

java - Kotlin中如何限制内部类的实例化仅在外部内部?

java - Java 的 RSA 实现,BC 的替代方案

java - Jasypt 使用 Bouncy CaSTLe 的 EncryptionOperationNotPossibleException

java - Android 路径形状中间的文本居中

kotlin - Kotlin 中的代数数据类型

java - Bouncy CaSTLe - 如何从 JceOpenSSLPKCS8DecryptorProviderBuilder 获取公钥信息

java - 如何将 PKCS10CertificationRequest 打印为字符串?

Java Bouncy CaSTLe TLS 协议(protocol)版本顺序?

android - 如何在 Kotlin MVVM 数据绑定(bind)中解析 Json

java - 如何解析HH :mm:ss without hours?