请帮忙;
我创建了一个生成x.509v3证书的服务器应用程序。我在.txt文件中导出公共密钥和私钥(格式为hex或pem);
我现在必须加密另一个客户端应用程序中的文件,我的问题是我不能直接使用公钥来执行此操作,为此我写了以下代码:
string fichier = @"C:\\Users\\Me\\Documents\\marie.docx";
FileInfo f = new FileInfo(fichier);
byte[] buffer = new byte[(int)f.Length];
System.IO.StreamReader strem = new System.IO.StreamReader(fichier);
String line = strem.ReadToEnd();
strem.Close();
IBufferedCipher cipher = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
string str = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7cXmz0lTtzEuFAP0rR1f//RZZ8dGxa26I/LwJiNFqJULDvLjmiEHs+u+2gjc3Qm1cwcusuP+akCJIsGyn+9joEbEUKCaJOXbXsuqFKWFlsnfoCGTT8M1a5J2SNixsrLCim9P+qoGfml7JONUhWoiUVYqagRG4WgFmQHonttdnWEqk5yHtXp4ZzL+Bw54IaliyEzigBMW4k0rwMceR31MGnGGcplOynX6Ga5J3HZvLm2XoUQ6PAWw19yjmjiurwBugDOA2NdLOOR96Jxv39Kv/MyGXjjN3Z2hEsSVhHQ4j9RlEg0zsMhXoHJ/MsoVr5WKhEpCuuwp8IuQmwAFW1GoEwIDAQAB";
char[] cArray = str.ToCharArray();
byte[] pub_Array = new byte[cArray.Length];
for (int j = 0; j < cArray.Length; j++)
pub_Array[j] = (byte)cArray[j];
KeyParameter par = new KeyParameter(pub_Array);
cipher.Init(false, par);
//byte[] output = cipher.DoFinal(data);
int blockSize = cipher.GetBlockSize();
int outputSize = cipher.GetOutputSize(buffer.Length);
int leavedSize = buffer.Length % blockSize;
int blocksSize = leavedSize != 0 ? buffer.Length / blockSize + 1 : buffer.Length / blockSize;
byte[] raw = new byte[outputSize * blocksSize];
int i = 0;
while (buffer.Length - i * blockSize > 0)
{
if (buffer.Length - i * blockSize > blockSize)
cipher.DoFinal(buffer, i * blockSize, blockSize,
raw, i * outputSize);
else
cipher.DoFinal(buffer, i * blockSize,
buffer.Length - i * blockSize,
raw, i * outputSize);
i++;
}
// Ecriture du fichier chiffré sur le disque dur
StreamWriter envfos = null;
using (envfos = new StreamWriter("fichier_chiffrer.txt"))
{
envfos.Write(raw);
}
envfos.Close();
我有一个
exception in : cipher.Init(false,par); << Impossible d'effectuer un cast d'un objet de type 'Org.BouncyCastle.Crypto.Parameters.KeyParameter' en type 'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'.
请帮助
c#中的任何文档;
提前考虑
Cordialement marie;
答案 0 :(得分:1)
这是一个小片段,展示了阅读公钥的最简单方法。
string str = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7cXmz0lTtzEuFAP0rR1f//RZZ8dGxa26I/LwJiNFqJULDvLjmiEHs+u+2gjc3Qm1cwcusuP+akCJIsGyn+9joEbEUKCaJOXbXsuqFKWFlsnfoCGTT8M1a5J2SNixsrLCim9P+qoGfml7JONUhWoiUVYqagRG4WgFmQHonttdnWEqk5yHtXp4ZzL+Bw54IaliyEzigBMW4k0rwMceR31MGnGGcplOynX6Ga5J3HZvLm2XoUQ6PAWw19yjmjiurwBugDOA2NdLOOR96Jxv39Kv/MyGXjjN3Z2hEsSVhHQ4j9RlEg0zsMhXoHJ/MsoVr5WKhEpCuuwp8IuQmwAFW1GoEwIDAQAB";
string header = "-----BEGIN PUBLIC KEY\n";
string trailer = "\n-----END PUBLIC KEY";
str = header + str + trailer;
StringReader sr = new StringReader(str);
PemReader PemRdr = new PemReader(sr);
RsaKeyParameters KeyParams = (RsaKeyParameters)PemRdr.ReadObject();
答案 1 :(得分:0)
RSA加密需要AsymmeticKeyParameter
作为密钥。你可以看到异常抱怨。您可以使用RsaKeyParameter
进行此操作,但这需要您提供2个属性:Modulus
和Exponent
都在密钥中。
由于您使用的是已经制作的X509证书,因此您也可以尝试从该文件中获取密钥。我提供了一些可能的示例代码,但我不知道它是否会起作用,因为我从未尝试过使用X509证书。该代码将替换您的KeyParameter par = new KeyParameter(pub_Array);
行。
X509CertificateParser parser = new X509CertificateParser();
AsymmeticKeyParameter par = parser.ReadCertificate(pub_array).GetPublicKey();