尝试读取在.NET和JVM中生成的RSA公钥,但失败

0qx6xfy6  于 2022-11-07  发布在  .NET
关注(0)|答案(1)|浏览(200)

,嗨,这是我的.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行,但没有效果。

jdg4fx2g

jdg4fx2g1#

在C#程式码中,ExportRSAPublicKey()会以PKCS#1格式汇出密钥,DER编码。然后,密钥会以PEM编码(Base64编码加上分行符号、页首和页尾)。
假设对于页眉和页脚,密钥应该以X.509/SPKI格式导出。但是,为此必须使用ExportSubjectPublicKeyInfo()方法。
由于Kotlin代码期望密钥DER编码,因此在Kotlin端必须执行DER编码(去除页眉、页脚和换行符,Base64解码)。
此外,Kotlin代码要求密钥采用X.509/SPKI格式,如果在C#代码中应用了ExportSubjectPublicKeyInfo(),则该格式与C#代码一致。

相关问题