我在使用RSA / SHA1创建和解密签名时遇到问题。我设法用SHA1创建签名。我使用SHA1从原始文本计算哈希,然后使用私钥对其进行加密并将其存储在文本文件中。我正在使用RSACryptoServiceProvider。现在,我需要从文本文件中再次读取它,使用公共密钥解密签名,并将其与解密文本中的新哈希进行比较。
用于创建哈希(并对其进行加密以获取签名)的代码:
private void btnHash_Click(object sender, EventArgs e)
{
nekriptirani_tekst = System.IO.File.ReadAllText(@"C:\Users\Ivan\Desktop\OS2 PROJEKT\tekst.txt");
byte[] tekst_bajtovi = Encoding.ASCII.GetBytes(nekriptirani_tekst);
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(tekst_bajtovi);
kriptirani_potpis_bajtovi = hash;
hash_string_original=Convert.ToBase64String(hash);
MessageBox.Show(hash_string_original);
kriptirani_potpis = RSAEncrypt(hash, privatni_klj, false);
potpis_original = Encoding.UTF8.GetString(kriptirani_potpis);
System.IO.File.WriteAllText(@"C:\Users\Ivan\Desktop\OS2 PROJEKT\potpis_poruke.txt", potpis_original);
}
}
用于读取签名并“尝试”以使用公共密钥对其进行解密的代码(这是问题所在):
private void btnProvjera_Click(object sender, EventArgs e)
{
dekriptirani_tekst = System.IO.File.ReadAllText(@"C:\Users\Ivan\Desktop\OS2 PROJEKT\dekriptirani_tekst.txt");
byte[] tekst_bajtovi = Encoding.ASCII.GetBytes(dekriptirani_tekst);
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(tekst_bajtovi);
hash_string_dekriptirano = Convert.ToBase64String(hash);
kriptirani_potpis_dekriptirano_bajtovi = hash;
MessageBox.Show(hash_string_dekriptirano);
//IN THE CODE BELOW IS THE PROBLEM:
string potpis_iz_datoteke= System.IO.File.ReadAllText(@"C:\Users\Ivan\Desktop\OS2 PROJEKT\potpis_poruke.txt");
byte[] bajtovi_potpisa = Encoding.ASCII.GetBytes(potpis_iz_datoteke);
kriptirani_potpis_dekriptirano = RSADecrypt(bajtovi_potpisa, javni_klj, false);
MessageBox.Show(Encoding.UTF8.GetString(kriptirani_potpis_dekriptirano));
}
问题是即时通讯在“ kriptirani_potpis_dekriptirano”出现下一个错误:数组不能为空。
为什么会发生以及如何解决?谢谢。