Алгоритм шифрования 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[]); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д