9 / 9 / 3
Регистрация: 22.01.2010
Сообщений: 141
1

алгоритм шифрования RSA, exception плохие данные

17.03.2013, 00:08. Показов 2419. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Столкнулся с проблемой при реализации алгоритма RSA. Класс RSACryptoServiceProvider позволяет зашифровать данные размером не более размера ключа, поэтому приходится разбивать исходный массив байтов на части, шифровать каждую часть отдельно и снова собирать. Аналогично произвожу расшифровку.

Проблема в том, что при расшифровке
C#
1
temp = RSADecrypt(ByteList[i], RSA.ExportParameters(true), false);
выскакивает exception "Плохие данные". В чем может быть проблема?



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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
public partial class MainForm : Form
 {
        private DriveDetector driveDetector = null;
 
        RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024);
 
        byte[] dataToEncrypt;
        byte[] dataToDecrypt;
        byte[] encryptedData;
        byte[] decryptedData;
 
        public MainForm()
        {
            InitializeComponent();
            driveDetector = new DriveDetector();
            driveDetector.DeviceArrived += new DriveDetectorEventHandler(OnDriveArrived);
            driveDetector.DeviceRemoved += new DriveDetectorEventHandler(OnDriveRemoved);
            driveDetector.QueryRemove += new DriveDetectorEventHandler(OnQueryRemove);
        }
 
        // Called by DriveDetector when removable device in inserted
        private void OnDriveArrived(object sender, DriveDetectorEventArgs e)
        {
            // e.Drive is the drive letter, e.g. "E:\\"
            // If you want to be notified when drive is being removed (and be
            // able to cancel it),
            // set HookQueryRemove to true
            e.HookQueryRemove = true;
 
 
            listBox1.Items.Add(e.Drive);
            if (MessageBox.Show("Подключен накопитель " + e.Drive + ". Зашифровать?", "Запрос на шифрование",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {   
                //шифрование
                DirectoryInfo dirInfo = new DirectoryInfo(e.Drive);
                FileInfo[] filesInfo = dirInfo.GetFiles();
 
               foreach (FileInfo file in filesInfo)
                {
 
                    dataToEncrypt = File.ReadAllBytes(file.FullName);
 
                    List<byte[]> ByteList = SplitByteArray(dataToEncrypt, 8); //разбивка данных на блоки
                    List<byte> list = new List<byte>();
 
                    byte[] temp;
 
                    for (int i = 0; i < ByteList.Count; i++)
                    {
                        temp = RSAEncrypt(ByteList[i], RSA.ExportParameters(false), false);
                        list.AddRange(temp);
                    }
 
                    encryptedData = list.ToArray();
 
                    File.WriteAllBytes(file.FullName + ".crpt", encryptedData);
 
                }
 
            }
        }
     
        //расшифровка
        private void button2_Click(object sender, EventArgs e)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(driveDetector.HookedDrive);
            FileInfo[] filesInfo = dirInfo.GetFiles();
 
            foreach (FileInfo file in filesInfo)
            {
 
                dataToDecrypt = File.ReadAllBytes(file.FullName);
 
                List<byte[]> ByteList = SplitByteArray(dataToDecrypt, 8);
                List<byte> list = new List<byte>();
 
                byte[] temp;
 
                for (int i = 0; i < ByteList.Count; i++)
                {
                    temp = RSADecrypt(ByteList[i], RSA.ExportParameters(true), false);
                    list.AddRange(temp);
                }
 
                decryptedData = list.ToArray();
 
                File.WriteAllBytes(file.FullName.Replace(".crpt", ""), decryptedData);
 
            }
        }
 
        static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            try
            {
                byte[] encryptedData;
                //Create a new instance of RSACryptoServiceProvider.
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
 
                    //Import the RSA Key information. This only needs
                    //toinclude the public key information.
                    RSA.ImportParameters(RSAKeyInfo);
 
                    //Encrypt the passed byte array and specify OAEP padding.  
                    //OAEP padding is only available on Microsoft Windows XP or
                    //later.  
                    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
                }
                return encryptedData;
            }
            //Catch and display a CryptographicException  
            //to the console.
            catch (CryptographicException e)
            {
                MessageBox.Show(e.Message);
 
                return null;
            }
 
        }
 
        static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
     
            try
            {
                byte[] decryptedData;
                //Create a new instance of RSACryptoServiceProvider.
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    //Import the RSA Key information. This needs
                    //to include the private key information.
                    RSA.ImportParameters(RSAKeyInfo);
 
                    //Decrypt the passed byte array and specify OAEP padding.  
                    //OAEP padding is only available on Microsoft Windows XP or
                    //later.  
                    decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
                }
                return decryptedData;
            }
            //Catch and display a CryptographicException  
            //to the console.
            catch (CryptographicException e)
            {
                MessageBox.Show(e.ToString());
 
                return null;
            }
        }
 
         //split an array into multiple arrays
        public static List<byte[]> SplitByteArray(byte[] bytes, int range)
        {
            //Byte[] arrayByte = new byte[] { "", "", "", "", "" };
            List<byte[]> splitted = new List<byte[]>();
            int lengthToSplit = range;
 
            int arrayLength = bytes.Length;
 
            for (int i = 0; i < arrayLength; i = i + lengthToSplit)
            {
                byte[] val = new byte[lengthToSplit];
 
                if (arrayLength < i + lengthToSplit)
                {
                    lengthToSplit = arrayLength - i;
                }
                Array.Copy(bytes, i, val, 0, lengthToSplit);
                splitted.Add(val);
            }
 
            return splitted;
     
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2013, 00:08
Ответы с готовыми решениями:

Алгоритм шифрования RSA
Необходимо реализовать программу, которая по заданному паролю шифрует данные и дешифрует оные...

Алгоритм шифрования RSA
Добрый вечер! Столкнулся со следующей проблемой: Пытаюсь реализовать алгоритм шифрования RSA,...

Алгоритм шифрования RSA
Здравствуйте. Может кто помочь с написанием кода для шифрования RSA? На словах суть данного...

"Плохие данные" RSA
Есть следующий код: RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048); ...

2
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
17.03.2013, 16:04 2
Скорее всего зашифровал одним ключом, расшифровать пробуешь другим
0
9 / 9 / 3
Регистрация: 22.01.2010
Сообщений: 141
17.03.2013, 19:55  [ТС] 3
Нет, шифрую и расшифровую одним и тем же ключом.
0
17.03.2013, 19:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2013, 19:55
Помогаю со студенческими работами здесь

Алгоритм шифрования RSA
Просьба поделитесь алгоритмом шифрования RSA на PHP

Алгоритм шифрования RSA
х*17(mod 84)=1 найти х Написать на с++

RSA – алгоритм шифрования
Всем доброго времени суток. Друзья, что то у меня не правильно работает шифрование, не пойму...

Алгоритм шифрования данных с открытым ключом RSA
e*mod2346168912=1 помогите найти e чтобы при умножении на некое число, а потом при взятии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru