C#: Как закриптовать что-нибудь хоть как-нибудь
14.08.2002
|
IT |
Как известно, принцип "мы с Томарой ходим парой" весьма распространён в различных API, нужно не просто знать какие методы вызывать, но и в какой последовательности. В MSDN много примеров как закриптовать целый файл. Но, к сожалению, нет ничего о том как закриптовать просто строку или массив байт. Следующий класс позволяет восполнить данный пробел.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace RSDN
{
public class Crypt
{
public static byte[] Encrypt(byte[] data,string password)
{
SymmetricAlgorithm sa = Rijndael.Create();
ICryptoTransform ct = sa.CreateEncryptor(
(new PasswordDeriveBytes(password,null)).GetBytes(16),
new byte[16]);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(data,0,data.Length);
cs.FlushFinalBlock();
return ms.ToArray();
}
public static string Encrypt(string data,string password)
{
return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(data),password));
}
static public byte[] Decrypt(byte[] data,string password)
{
BinaryReader br = new BinaryReader(InternalDecrypt(data,password));
return br.ReadBytes((int)br.BaseStream.Length);
}
static public string Decrypt(string data,string password)
{
CryptoStream cs = InternalDecrypt(Convert.FromBase64String(data),password);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
static CryptoStream InternalDecrypt(byte[] data,string password)
{
SymmetricAlgorithm sa = Rijndael.Create();
ICryptoTransform ct = sa.CreateDecryptor(
(new PasswordDeriveBytes(password,null)).GetBytes(16),
new byte[16]);
MemoryStream ms = new MemoryStream(data);
return new CryptoStream(ms,ct,CryptoStreamMode.Read);
}
}
}
14.08.2002 19 комментариев |
IT>Как известно, принцип "мы с Томарой ходим парой" весьма распространён в различных API, нужно не просто знать какие методы вызывать, но и в какой последовательности. В MSDN много примеров как закриптовать целый файл. Но, к сожалению, нет ничего о том как закриптовать просто строку или массив байт. Следующий класс позволяет восполнить данный пробел.
А как это дело на C# в dll засунуть. Для использования на C++. А лучше вообще в COM.
Можно это как-то просто сделать ?
V>А как это дело на C# в dll засунуть. Для использования на C++. А лучше вообще в COM.
V>Можно это как-то просто сделать ?
http://www.rsdn.ru/article/?dotnet/net2com.xml
IT>В MSDN много примеров как закриптовать целый файл. Но, к сожалению, нет ничего о том как закриптовать просто строку или массив байт.
Если уж работаешь со строками (входные данные при кодировании), то и пусть результат будет тоже строкой.
Файл есть Stream. Класс MemoryStream (с объектом которого ты работаешь) является его наследником. Тоесть, MSDN: Stream -> Encrypt -> Decrypt -> Stream. Твой класс: String -> Raw Bytes -> Stream -> Encrypt -> Decrypt -> Stream -> Raw Bytes -> String
Посмотри на GDN класс для шифрации Remoting траффика. Основная идея того класса, что нет жесткой привязки к алгоритму шифрации (например, нет явного использования Rijndael) и алгоритмы не иниицализируються по паролю (PasswordDeriveBytes).
M>Если уж работаешь со строками...
Ну так давай, вперёд, улучшай
IT>Ну так давай, вперёд, улучшай
Еще немного покритикую
Имеется ли тайный смысл перестановки этих кейвордов? Наверное, лучше идти по единообразию.
Если объявляешь класс только со статическими мемберами, то: объяви его как sealed и реализую private конструктор
M>Имеется ли тайный смысл перестановки этих кейвордов? Наверное, лучше идти по единообразию.
Конечно имеется. В одном случае ты шифруешь, в другом дешифруешь. Направления разные, следовательно и кейворды должны быть в обратном порядке.
M>Если объявляешь класс только со статическими мемберами, то: объяви его как sealed и реализую private конструктор
А вдруг у меня появится желание от него наследоваться?
M>>Имеется ли тайный смысл перестановки этих кейвордов? Наверное, лучше идти по единообразию.
IT>Конечно имеется. В одном случае ты шифруешь, в другом дешифруешь. Направления разные, следовательно и кейворды должны быть в обратном порядке.
Это шутка?
M>>>Имеется ли тайный смысл перестановки этих кейвордов? Наверное, лучше идти по единообразию.
IT>>Конечно имеется. В одном случае ты шифруешь, в другом дешифруешь. Направления разные, следовательно и кейворды должны быть в обратном порядке.
M> Это шутка?
Ты имеешь ввиду свой вопрос?
IT>Ты имеешь ввиду свой вопрос?
Самое сильное, чего просто не могут терпеть фибры моей души, так это захардкоденные значения.
Выносите их в отдельные константы.
IT>Как известно, принцип "мы с Томарой ходим парой" весьма распространён в различных API, нужно не просто знать какие методы вызывать, но и в какой последовательности. В MSDN много примеров как закриптовать целый файл. Но, к сожалению, нет ничего о том как закриптовать просто строку или массив байт. Следующий класс позволяет восполнить данный пробел.
IT>
Еслиб ты ещё написал как всем этим воспользоватся. Было бы круто
S_>Еслиб ты ещё написал как всем этим воспользоватся. Было бы круто
Неужели непонятно? Пользоваться этим вот так
S_>Здравствуйте, IT, Вы писали:
S_>Еслиб ты ещё написал как всем этим воспользоватся. Было бы круто
Посмотри здесь: http://www.gotdotnet.ru/LearnDotNet/NETFramework/223738.aspx
Исключение:
System.NotSupportedException was caught
Stream does not support seeking.
Сторока, где оно возникает:
Ощибка в предыдузем посте.
Валимся здесь:
D>Здравствуйте, Dmitriy Dubrovskiy, Вы писали:
D>Ощибка в предыдузем посте.
D>Валимся здесь:
D>
Свойство Length у данного Stream оставленно только для совместимости при наследовании. В MSDN прописано.
Заменяем:
static public byte[] Decrypt(byte[] data,string password)
{
BinaryReader br = new BinaryReader(InternalDecrypt(data,password));
return br.ReadBytes(data.Length);
}
IT>Как известно, принцип "мы с Томарой ходим парой" весьма распространён в различных API, нужно не просто знать какие методы вызывать, но и в какой последовательности. В MSDN много примеров как закриптовать целый файл. Но, к сожалению, нет ничего о том как закриптовать просто строку или массив байт. Следующий класс позволяет восполнить данный пробел.
а каким способом можно соединять закриптованные строки без вреда информации? есть ли символ, который с точностью 100% не появится в шифрованной строке?
А>а каким способом можно соединять закриптованные строки без вреда информации? есть ли символ, который с точностью 100% не появится в шифрованной строке?
Не знаю. Но с помощью замены такой символ можно всегда сделать самому.