こんにちは、私はインターネット全体を見回してきましたが、署名と検証の問題に対する解決策がまったく見つかりません。まず第一に、何が起こるかを理解することに関して、私が正しい方向に進んでいることを確認したいので、私を修正してください. 署名に関して最初に行うことは、サーバーが最初に公開鍵と秘密鍵の 2 つの鍵を作成することです。次に、サーバーはデータ テキスト、公開キー、およびハッシュ化および暗号化された (秘密キーを使用して) データ テキストをファイルに格納します。サーバーはファイルをクライアントに送信し、クライアントはファイル内の公開鍵を取得してデータの検証を開始し、それを使用して暗号化されたデータを復号化します。最後に、クライアントはハッシュ アルゴリズム (サーバーと同じもの) を使用してテキスト データを処理し、復号化されたデータと比較します。
これで問題ない場合、コードが機能しない理由がわかりません。
サーバ:
string name = textBox1.Text;
string GUID = textBox2.Text;
string startDate = textBox3.Text;
string EndDate = textBox4.Text;
string macAddress = GetMacAddress();
FileStream fs = File.Create(@"cert.txt");
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
UnicodeEncoding ByteConverter = new UnicodeEncoding();
StreamWriter write = new StreamWriter(fs);
write.Write(name + "\r\n");
write.Write(GUID + "\r\n");
write.Write(startDate + "\r\n");
write.Write(EndDate + "\r\n");
write.Write(macAddress + "\r\n");
string pkey = RSA.ToXmlString(false);
write.Write(pkey + "\r\n");
SHA1Managed Sha = new SHA1Managed();
string info = name + GUID + startDate + EndDate + macAddress;
byte [] hashed = Sha.ComputeHash(Encoding.UTF8.GetBytes(info));
byte []signature = RSA.SignData(hashed,CryptoConfig.MapNameToOID("SHA1"));
write.Write(Convert.ToBase64String(signature));
textBox5.Text = Convert.ToBase64String(hashed);
write.Close();
fs.Close();
クライアント:
FileStream fsSource = new FileStream(@"cert.txt", FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fsSource);
string name = reader.ReadLine();
string GUID = reader.ReadLine();
string startDate = reader.ReadLine();
string EndDate = reader.ReadLine();
string macAddress = reader.ReadLine();
string pkey = reader.ReadLine();
string signed = reader.ReadLine();
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(pkey);
string info = name + GUID + startDate + EndDate + macAddress;
SHA1Managed Sha = new SHA1Managed();
byte[] checkinghash = Sha.ComputeHash(Encoding.UTF8.GetBytes(info));
if (RSA.VerifyHash(checkinghash, CryptoConfig.MapNameToOID("SHA1"), Encoding.UTF8.GetBytes(signed)))
{
Console.WriteLine("verfied");
}
else
{
Console.WriteLine("denied");
}
Console.WriteLine();
//Console.WriteLine(signed);
Console.ReadKey();
公開鍵がないのか、それともこれが間違った方法なのかわからないため、これは常に拒否されます。