ras私钥c#转java_RSA:如何在Java中生成私钥并在C#中使用它?

I would like to generate private key in java, save it as a 64 base encoded string in some file

and then encrypt some phrase in C# using this saved file.

I know to generate keys in java and encode it with 64 base.

My question is how do I use this key in C#?

This is a java code prototype to save private key into text file:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);

keyGen.initialize(spec);

KeyPair keyPair = keyGen.generateKeyPair();

PrivateKey privateKey = keyPair.getPrivate();

writeToFile("privateKey", Base64.encode(keyPair.getPrivate().getEncoded()));

I would like to implement following function in C# but can't find how to create RSAParameters or

RSACryptoServiceProvider from private key

public static string DecryptData(string privateKey64Base, string data64Base)

{

// create using privateKey64Base

// create RSACryptoServiceProvider rsa using RSAParameters above

// byte[] encryptedData = rsa.Encrypt(Convert.FromBase64String(data64Base);

}

解决方案

This page contains advice for your situation, since you are writing out PKCS#8 keys (with keyPair.getPrivate().getEncoded())

Using this approach you would use the utility on the Java side to get the private key into the PRIVATEKEYBLOB format in the first place.

Alternatively, you could use BouncyCastle C# which can read the key in (see e.g. Org.BouncyCastle.Security.PrivateKeyFactory.CreateKey - you'd need to Base64 decode first of course).

This previous question has the answer for converting from the resulting BC key object to RSACryptoServiceProvider: BouncyCastle RSAPrivateKey to .NET RSAPrivateKey

Thirdly, you might want to look at using a keystore, e.g. PKCS#12, which is a more standard (and secure) way for storing private keys.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 私钥换为 Java 私钥的过程如下: 1. 首先,将 C# 私钥导出为 XML 格式。 2. 使用 Java 的密钥库管理工具(如 Keytool)创建一个新的 Java 密钥库文件。 3. 从 XML 文件提取私钥和公钥,然后将它们换为 Java PrivateKey 和 PublicKey 对象。可以使用 Java 的 Bouncy Castle 库来完成这一步骤。 4. 将 PrivateKey 和 PublicKey 对象存储到 Java 密钥库文件。 5. 将 Java 密钥库文件导出为 JKS 格式。 下面是 C# 密钥换为 Java 密钥库的示例代码: ```csharp // 导出 C# 私钥为 XML 格式 CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeyContainer"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams); string privateKeyXml = rsa.ToXmlString(true); // 将 XML 格式的私钥换为 Java 私钥对象 var doc = new XmlDocument(); doc.LoadXml(privateKeyXml); var rsaParams = new RSAParameters(); rsaParams.Modulus = Convert.FromBase64String(doc.GetElementsByTagName("Modulus")[0].InnerText); rsaParams.Exponent = Convert.FromBase64String(doc.GetElementsByTagName("Exponent")[0].InnerText); rsaParams.P = Convert.FromBase64String(doc.GetElementsByTagName("P")[0].InnerText); rsaParams.Q = Convert.FromBase64String(doc.GetElementsByTagName("Q")[0].InnerText); rsaParams.DP = Convert.FromBase64String(doc.GetElementsByTagName("DP")[0].InnerText); rsaParams.DQ = Convert.FromBase64String(doc.GetElementsByTagName("DQ")[0].InnerText); rsaParams.InverseQ = Convert.FromBase64String(doc.GetElementsByTagName("InverseQ")[0].InnerText); rsaParams.D = Convert.FromBase64String(doc.GetElementsByTagName("D")[0].InnerText); RSACryptoServiceProvider rsaJava = new RSACryptoServiceProvider(); rsaJava.ImportParameters(rsaParams); // 将 Java 私钥存储到密钥库 var keyStore = KeyStore.GetInstance(KeyStore.DefaultType); keyStore.Load(null, null); keyStore.SetKeyEntry("mykey", rsaJava, null, null); var outputStream = new FileOutputStream("mykeystore.jks"); keyStore.Store(outputStream, "mypassword".ToCharArray()); outputStream.Close(); ``` 使用 Bouncy Castle 库将 XML 格式的 C# 公钥换为 Java 公钥对象的示例代码如下: ```java // 将 C# 公钥换为 Java 公钥对象 var doc = new XmlDocument(); doc.LoadXml(publicKeyXml); var rsaParams = new RSAParameters(); rsaParams.Modulus = Convert.FromBase64String(doc.GetElementsByTagName("Modulus")[0].InnerText); rsaParams.Exponent = Convert.FromBase64String(doc.GetElementsByTagName("Exponent")[0].InnerText); RSACryptoServiceProvider rsaJava = new RSACryptoServiceProvider(); rsaJava.ImportParameters(rsaParams); var publicKey = rsaJava.ExportParameters(false); // 将 Java 公钥存储到密钥库 var keyStore = KeyStore.GetInstance(KeyStore.DefaultType); keyStore.Load(null, null); keyStore.SetCertificateEntry("mycert", new X509Certificate()); keyStore.SetKeyEntry("mykey", publicKey, null, null); var outputStream = new FileOutputStream("mykeystore.jks"); keyStore.Store(outputStream, "mypassword".ToCharArray()); outputStream.Close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值