DSA署名アルゴリズムを使用してファイル/ファイルにアクセスしたかどうかを調べる小さなプログラムを作成しようとしています。DSA暗号化サービスプロバイダの同じキーで同じデータを署名すると、結果が異なる
私はこの問題を説明するための小さなサンプルコードを提供します。 ファイルc:\ Temporary \ Temp.txtがあるとします。 私たちのプログラムには2つのボタンがあります。最初のボタンをクリックすると、ファイル名と最後のアクセス時刻にデジタル署名 が作成されます。また、パラメータをエクスポートして保存します。 2番目のボタンをクリックすると、以前にエクスポートしたパラメータを使用して同じファイル上の署名を再作成し、新しい署名と前の署名を比較します。
ここでの問題は、プログラム(常に)が私にファイルにアクセスしたという結果を与えることです!
問題を見つけるためにデバッガを使用し、2つのbutton_clickイベントの間ですべての変数値が同じであることと、その違いが署名プロセスで発生することを確認しました。
問題がどこにあるか教えてください。あなたは==
演算子を使用して2つのバイト配列を比較している
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Security.Cryptography;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
string filename = @"C:\Temporary\Temp.txt";
DSAParameters parameters;
byte[] data_to_sign, signature;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Sign_button_Click(object sender, EventArgs e)
{
FileInfo f_info = new FileInfo(filename);
string file_information = f_info.FullName + f_info.LastAccessTime;
UnicodeEncoding byteEncoder = new UnicodeEncoding();
data_to_sign = byteEncoder.GetBytes(file_information);
DSACryptoServiceProvider dsaprovider = new DSACryptoServiceProvider();
parameters = dsaprovider.ExportParameters(true);
signature = dsaprovider.SignData(data_to_sign);
label1.Text = " Signature generated";
}
private void Verify_button_Click(object sender, EventArgs e)
{
FileInfo f_info = new FileInfo(filename);
string file_information = f_info.FullName + f_info.LastAccessTime;
UnicodeEncoding byteEncoder = new UnicodeEncoding();
data_to_sign = byteEncoder.GetBytes(file_information);
DSACryptoServiceProvider dsaprovider2 = new DSACryptoServiceProvider();
dsaprovider2.ImportParameters(parameters);
byte [] signature2 = dsaprovider2.SignData(data_to_sign);
if (signature == signature2)
label1.Text = "The file hasn't been accessed";
else
label1.Text = "Opp... The file has been accessed";
}
}
}
はいSequenceEqualを比較したり、比較する文字列に変換し、言いました。 –