不幸的是,C#没有提供任何简单的方法来实现这一点。但是,以下代码可以正确地解码x509公钥(请确保先对x509key参数进行Base64解码):
不幸的是,C#没有提供任何简单的方法来实现这一点。但是,以下代码可以正确地解码x509公钥(请确保先对x509key参数进行Base64解码):
public static RSACryptoServiceProvider DecodeX509PublicKey(byte[] x509key)
;
MemoryStream ms = new MemoryStream(x509key);
BinaryReader reader = new BinaryReader(ms);
if (reader.ReadByte() == 0x30)
ReadASNLength(reader);
else
return null;
int identifierSize = 0;
if (reader.ReadByte() == 0x30)
identifierSize = ReadASNLength(reader);
else
return null;
if (reader.ReadByte() == 0x06)
if (reader.ReadByte() == 0x03)
if (reader.ReadByte() == 0x02)
}
}
}
return null;
}
public static int ReadASNLength(BinaryReader reader)
return length;
}
以上代码基于这个问题(只适用于某些密钥大小)。 以上代码将适用于几乎任何RSA密钥大小,并已使用您提供的密钥以及2048位和4096位密钥进行了测试。
另一种解决方案是使用工具生成证书(XCA是一个很好的工具),将证书导出到p12(PKCS12)文件中,然后在Java和C#中加载该证书以获取密钥。
在C#中,您可以使用X509Certificate2
类加载PKCS12文件。
X509Certificate2 cert = new X509Certificate2(certificateFile, certificatePassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
RSACryptoServiceProvider provider1 = (RSACryptoServiceProvider)cert.PublicKey.Key;
RSACryptoServiceProvider provider2 = (RSACryptoServiceProvider)cert.PrivateKey;
在Java中,您可以使用KeyStore
类加载PKCS12文件。
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(certificateFile), certificatePassword.toCharArray());
Key key = keystore.getKey(certName, certificatePassword.toCharArray());
Certificate cert = keystore.getCertificate(certName);
PublicKey publicKey = cert.getPublicKey();
KeyPair keys = new KeyPair(publicKey, (PrivateKey) key);
arrBytes
传递给DecodeX509PublicKey
之前,请确保对其进行Base64解码。 - SyonDecodeX509PublicKey
中的一个错误,即指数和模数被转换为大端字节序。对此我感到很抱歉,因为我所阅读的所有内容都表明需要这样做(显然我没有测试得够充分:( ),但是你在上面的评论中提出的问题揭示了这个问题。 - Syon