,嗨,这是我的.NET代码:
public static string ExportPublicKeyFile(this RSA rsa)
{
var privateKeyBytes = rsa.ExportRSAPublicKey();
var builder = new StringBuilder("-----BEGIN PUBLIC KEY-----");
var base64PrivateKeyString = Convert.ToBase64String(privateKeyBytes);
var offset = 0;
const int LINE_LENGTH = 64;
for (var i = 0; i < base64PrivateKeyString.Length; ++i)
{
if (i % (LINE_LENGTH - 1) == 0)
builder.Append("\n");
builder.Append(base64PrivateKeyString[i]);
}
if (builder[builder.Length-1] != '\n')
builder.Append("\n");
builder.AppendLine("-----END PUBLIC KEY-----");
return builder.ToString();
}
(外部有一些多余的绒毛,需要保存到文件中)
这是我的Kotlin:
class App {
companion object {
@JvmStatic
fun main(args: Array<String>) {
//App().run()
//val parts = "/ss/dsa".split('/')
//println(parts)
val key = PublicKeyReader.get("C:\\Path\\To\\public.key")
}
object PublicKeyReader {
@kotlin.Throws(Exception::class)
operator fun get(filename: String): PublicKey {
val keyBytes: ByteArray = Files.readAllBytes(Paths.get(filename))
val spec = X509EncodedKeySpec(keyBytes)
val kf: java.security.KeyFactory = java.security.KeyFactory.getInstance("RSA")
return kf.generatePublic(spec)
}
}
}
}
Kotlin没有运行Android,它目前是一个IntelliJ应用程序。
运行时出现以下异常:Caused by: java.security.InvalidKeyException: invalid key format
我试过手动删除开始\END行,但没有效果。
1条答案
按热度按时间jdg4fx2g1#
在C#程式码中,
ExportRSAPublicKey()
会以PKCS#1格式汇出密钥,DER编码。然后,密钥会以PEM编码(Base64编码加上分行符号、页首和页尾)。假设对于页眉和页脚,密钥应该以X.509/SPKI格式导出。但是,为此必须使用
ExportSubjectPublicKeyInfo()
方法。由于Kotlin代码期望密钥DER编码,因此在Kotlin端必须执行DER编码(去除页眉、页脚和换行符,Base64解码)。
此外,Kotlin代码要求密钥采用X.509/SPKI格式,如果在C#代码中应用了
ExportSubjectPublicKeyInfo()
,则该格式与C#代码一致。