Алгоритм шифрования RSA - C# (185660)
Формулировка задачи:
Добрый вечер!
Столкнулся со следующей проблемой:
Пытаюсь реализовать алгоритм шифрования RSA, нахожу все значения которые нужны для составления открытого и закрытого ключа. Затем мне необходимо номер UNICODE'а каждого символа введенного в текстбокс1 записать в массив и применить к каждому номеру UNICODE'а алгоритм RSA. Далее, записать новое значение символов в текстбокс2. Подскажите как это правильно реализовать или посоветуйте другой вариант решения этой проблемы. Заранее спасибо!
Решение задачи: «Алгоритм шифрования RSA»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Security.Cryptography;
- using System.Collections;
- namespace WindowsFormsApplication2
- {
- class Class1
- {
- public string EncryptString(string inputString, int dwKeySize)
- {
- // TODO: Add Proper Exception Handlers
- RSACryptoServiceProvider rsaCryptoServiceProvider =
- new RSACryptoServiceProvider(dwKeySize);
- // rsaCryptoServiceProvider.FromXmlString(xmlString);
- int keySize = dwKeySize / 8;
- byte[] bytes = Encoding.UTF32.GetBytes(inputString);
- // The hash function in use by the .NET RSACryptoServiceProvider here
- // is SHA1
- // int maxLength = ( keySize ) - 2 -
- // ( 2 * SHA1.Create().ComputeHash( rawBytes ).Length );
- int maxLength = keySize - 42;
- int dataLength = bytes.Length;
- int iterations = dataLength / maxLength;
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i <= iterations; i++)
- {
- byte[] tempBytes = new byte[
- (dataLength - maxLength * i > maxLength) ? maxLength :
- dataLength - maxLength * i];
- Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0,
- tempBytes.Length);
- byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes,
- true);
- // Обратите внимание, что RSACryptoServiceProvider меняет порядок
- // зашифрованных байт. Он делает это после шифрования и перед
- // дешифровкой. Если Вам не нужна совместимость с Microsoft
- // Cryptographic API (CAPI) или другими поставщиками, то закомментируйте
- // следующую строку и соотвтетствующую строчку в функции DecryptString.
- //Array.Reverse(encryptedBytes);
- // Зачем конвертировать в base 64?
- // Потому что это одно из основных печатных оснований использующих только
- // символы ASCII
- stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
- }
- return stringBuilder.ToString();
- }
- public string DecryptString(string inputString, int dwKeySize)
- {
- // TODO: Add Proper Exception Handlers
- RSACryptoServiceProvider rsaCryptoServiceProvider
- = new RSACryptoServiceProvider(dwKeySize);
- // rsaCryptoServiceProvider.FromXmlString(xmlString);
- int base64BlockSize = ((dwKeySize / 8) % 3 != 0) ?
- (((dwKeySize / 8) / 3) * 4) + 4 : ((dwKeySize / 8) / 3) * 4;
- int iterations = inputString.Length / base64BlockSize;
- ArrayList arrayList = new ArrayList();
- for (int i = 0; i < iterations; i++)
- {
- byte[] encryptedBytes = Convert.FromBase64String(
- inputString.Substring(base64BlockSize * i, base64BlockSize));
- // Обратите внимание, что RSACryptoServiceProvider меняет порядок
- // зашифрованных байт. Он делает это после шифрования и перед
- // дешифровкой. Если Вам не нужна совместимость с Microsoft
- // Cryptographic API (CAPI) или другими поставщиками, то закомментируйте
- // следующую строку и соотвтетствующую строчку в функции EncryptString.
- // Array.Reverse(encryptedBytes);
- arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(
- encryptedBytes, true));
- }
- return Encoding.UTF32.GetString(arrayList.ToArray(
- Type.GetType("System.Byte")) as byte[]);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д