Добрый день!
Есть программа, которая шифрует сообщение закрытым ключом. А потом это же сообщение я хочу расшифровать, чтобы проверить, что все нормально работает.
Делаю я это таким образом:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
var pem = System.IO.File.ReadAllText(@"C:\...\*.pem");
// считываю закрытый ключ из файла
byte[] certBuffer = GetBytesFromPEM( pem, "RSA PRIVATE KEY" );
//считываю шифруемое сообщение
byte[] data = GetBytes(textBox1.Text);
//шифрую
byte[] encrdata = rsa.Encrypt(data, false);
//вывожу полученную кракозябру
textBox3.Text = GetString(encrdata);
var pem2 = System.IO.File.ReadAllText(@"C:\...\*.pub");
//считываю открытый ключ из файла
byte[] certBuffer2 = GetBytesFromPEM(pem, "PUBLIC KEY");
//расшифровываю сообщение
byte[] decdata = rsa.Decrypt(encrdata, false); // ошибка!!!
//На данной строке выпадает ошибка: Размер данных для дешифрования превышает максимум для этого модуля, 294 байт.
textBox3.Text = System.Text.Encoding.UTF8.GetString(encrdata); ;
}
byte[] GetBytesFromPEM(string pemString, string section)
{
var header = String.Format("-----BEGIN {0}-----);
var footer = String.Format("-----END {0}-----", section);
var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length;
var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;
if (start < 0 || end < 0)
{
return null;
}
string r = pemString.Substring(start, end);
textBox2.Text = "<RSAKeyValue><Modulus>" + r + "</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
return Convert.FromBase64String(r);
}
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
} |
|
Попытаться разбить массив на части и дешифровать каждую из них? Не могу найти, как это сделать (видела несколько небезопасных способов через указатели, но такое точно не допустят в релиз...)
Что мне делать в данной ситуации?
Спасибо большое!!!