CryptoLibrary會找不到定義耶!大家能不能幫我看一下給點意見喔!! User.cs using System;
using System.Net;
using System.Net.Sockets; namespace Iae.Nsu.Crypto.ElGamal
{
///
/// Класс пользователя шифром Эль-Гамаля.
///
public class User
{
public User(int prime)
{
this.p_ = prime; System.Random rand = new Random();
int n, x, y;
int t = this.p_-1; do
{
// c_ выбираем случайным образом
this.c_ = (int)System.Math.Abs(rand.Next(t));
// проверяем что бы НОД(c_, (p_-1)*(q_-1)) = 1
CryptoLibrary.Math.EuclidAlgoritm(this.c_, t, out n, out x, out y);
// если не равняется выбираем новое c_
} while(n != 1 || this.c_ < 2); this.g_ = CryptoLibrary.Math.FindGenerativeElement(this.p_);
this.d_ = CryptoLibrary.Math.PowerByModule(this.g_, this.c_, this.p_);
} private Socket sock; private int p_;
private int c_;
private int d_;
private int g_;
protected string name_;
///
/// Имя пользователя.
///
public string Name
{
get
{
return this.name_;
}
set
{
this.name_ = value;
}
} ///
/// Шифруем сообщение message в поток байт используя
/// открытый ключ опонента d.
///
/// Сообщение для пересылки.
/// Несекретная информация опонента.
/// Зашифрованное сообщение.
public byte [] EncodeMessage(string message, int d)
{
int len = message.Length;
char [] chs = message.ToCharArray();
int [] its = new int[len 1];
byte [] bts = new byte[(len 1)*4];
int r__;
Random rand = new Random();
int k = rand.Next(2, this.p_-1); r__ = CryptoLibrary.Math.PowerByModule(this.g_, k, this.p_);
its[0] = r__;
for (int i = 0; i < len; i )
{
its[i 1] = CryptoLibrary.Math.PowerByModule(d, k, this.p_);
its[i 1] = CryptoLibrary.Math.PowerByModule(its[i 1]*chs[i], 1, this.p_);
} for (int i = 0; i <= len; i )
{
bts[i*4 0] = (byte)(its[i]%6); its[i] /= 256;
bts[i*4 1] = (byte)(its[i]%6); its[i] /= 256;
bts[i*4 2] = (byte)(its[i]%6); its[i] /= 256;
bts[i*4 3] = (byte)(its[i]%6); its[i] /= 256;
} return bts;
} ///
/// Дешифровываем сообщение из потока байт bytes из
/// которых полезных length байт.
///
/// Зафирванное сообщение.
/// Кол-во полезных байт.
/// Дешифрованное сообщение.
public string DecodeMessage(byte [] bytes, int length)
{
int len = length / 4;
char [] chs = new char[len];
int [] its = new int[len];
int r__ = 0; for (int i = 0; i < len; i )
{
its[i] = bytes[i*4 3]; its[i] *= 256;
its[i] = bytes[i*4 2]; its[i] *= 256;
its[i] = bytes[i*4 1]; its[i] *= 256;
its[i] = bytes[i*4 0];
if (i == 0)
{
r__ = its[0];
}
else
{
int t = CryptoLibrary.Math.PowerByModule(r__, this.p_-1-this.c_, this.p_);
chs[i-1] = (char)CryptoLibrary.Math.PowerByModule(t*its[i], 1, this.p_);
}
} return new string(chs);
} ///
/// Принимаем сообщение. Открываем сокет на порт port.
/// Ждем установления соединения. Затем высылаем свой открытый ключ.
/// Ожидаем сообщение. Дешифруем его.
///
/// Порт.
public void WaitMessage(int port)
{
byte [] bts = new byte[1024];
int t = this.d_;
int len; IPAddress ipAddress = new IPAddress(0);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(ipAddress, port));
sock.Listen(5); System.Console.WriteLine("{0}: Ожидаем запрос на установку соединения.", this.name_);
Socket s = sock.Accept();
System.Console.WriteLine("{0}: Соединение установленно.", this.name_); System.Console.WriteLine("{0}: Отправляем несекретные данные.", this.name_);
for (int i = 0; i < 4; i )
{
bts[i] = (byte)(t%6); t/=256;
}
s.Send(bts, 4, SocketFlags.None); System.Console.WriteLine("{0}: Ожидаем сообщение.", this.name_);
len = s.Receive(bts);
System.Console.WriteLine("{0}: Сообщение успешно принято.", this.name_); System.Console.WriteLine("{0}: Сообщение дешифруется.", this.name_);
string message = this.DecodeMessage(bts, len); System.Console.WriteLine("{0}: Полученно сообщение:: {1}", this.name_, message);
} ///
/// Отправляем сообщение message на IPaddress:port.
/// Устанавливаем соединение. Получаем публичный ключ. Шифруем.
/// Отравляем.
///
/// Адрес опонента.
/// Его порт.
/// Сообщение для отправки.
public void SendMessage(string IPaddress, int port, string message)
{
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(IPaddress), port);
Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
byte [] bytes = new byte[4]; s.Connect(ipe);
if (s.Connected)
{
System.Console.WriteLine("{0}: Соединение установленно.", this.name_); System.Console.WriteLine("{0}: Ожидаем несекретные данные опонента.", this.name_);
s.Receive(bytes);
int dFriend = (((bytes[3]*256 bytes[2])*256 bytes[1])*256 bytes[0]); System.Console.WriteLine("{0}: Производим шифровку и пересылку сообщения.", this.name_); if(s.Send(this.EncodeMessage(message, dFriend)) == (message.Length 1)*4)
{
System.Console.WriteLine("{0}: Сообщение успешно посланно.", this.name_);
}
else
{
System.Console.WriteLine("{0}: Ошибка при посылке сообщения.", this.name_);
}
}
else
{
System.Console.WriteLine("{0}: Ошибка при установлении соединения.", this.name_);
}
} }
} Main.cs using System;
using Iae.Nsu.Crypto.CryptoLibrary; namespace Iae.Nsu.Crypto.ElGamal
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
User a = new User(5851);
a.Name = "Alice";
User b = new User(5851);
b.Name = "Bob";
System.Console.Write("Для принятия сообщения введите 1, для отправки 2: ");
int s = System.Console.Read();
System.Console.Read(); System.Console.Read();
if (s == (int)'1')
{
System.Console.Write("Введите номер порта для принятия сообщения: ");
int port = Int32.Parse(System.Console.ReadLine());
a.WaitMessage(port);
}
else
{
System.Console.Write("Введите IP адрес назначения сообщения: ");
string IPaddress = System.Console.ReadLine();
System.Console.Write("Введите номер порта для отправки сообщения: ");
int port = Int32.Parse(System.Console.ReadLine());
System.Console.Write("Введите сообщение для отправки: ");
string message = System.Console.ReadLine(); b.SendMessage(IPaddress, port, message);
}
}
}
}