線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1610
推到 Plurk!
推到 Facebook!

大家幫忙偵錯一下喔

尚未結案
donken
一般會員


發表:9
回覆:7
積分:3
註冊:2005-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-29 23:33:04 IP:220.131.xxx.xxx 未訂閱
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); } } } }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-30 00:12:31 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
系統時間:2024-05-11 12:19:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!