我正在尝试从 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/