Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Tạo 1 chuỗi ngẫu nhiên cực mạnh trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Smile Tạo 1 chuỗi ngẫu nhiên cực mạnh trong lập trình C#

    Bạn muốn tạo 1 chuỗi ngẫu nhiên sao cho người dùng ác ý không thể đoán trước được. Thông thường, bạn sẽ nghĩ ngay đến việc ứng dụng lớp System.Random để làm việc này, các số mà bạn tạo với lớp System.Random là ngẫu nhiên về mặt thống kê, nghĩa là chúng đi theo một sự phân bố ngẫu nhiên, tuy nhiên chúng lại không phù hợp cho việc bảo mật. Với những lập trình viên nắm vững giải thuật, họ có thể phát hiện ra quy luật tạo số ngẫu nhiên ngay (thông thường được rủt từ hệ thống), và rồi họ sẽ đoán ra được các giá trị trong tương lai.

    Giải pháp cho chúng ta là sử dụng chuỗi ngẫu nhiên bảo mật mạnh. Chuỗi này được sinh ra từ nhiều giá trị, bao gồm các dữ liệu hệ thống và người dùng như: ID của tiến trình và ID của tiểu trình, thời gian hệ thống,... Để làm được này, bạn cần dùng đến lớp RNGCryptoServiceProvider trong namespace bằng cách thêm using System.Security.Cryptography;

    Và sau đây là 1 ví dụ minh họa (full code):

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.Security.Cryptography;
    5. namespace ConsoleApplication1
    6. {
    7.     class Program
    8.     {
    9.         public static string GetSalt(int length)
    10.         {
    11.             byte[] randomArray = new byte[length];
    12.             string randomString;
    13.             RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    14.             rng.GetBytes(randomArray);
    15.             randomString = Convert.ToBase64String(randomArray);
    16.             return randomString;
    17.         }
    18.         static void Main(string[] args) { Console.WriteLine(GetSalt(4)); }
    19.     }
    20. }

  2. #2
    Ngày gia nhập
    12 2008
    Bài viết
    23

    "Với những lập trình viên nắm vững giải thuật, họ có thể phát hiện ra quy luật tạo số ngẫu nhiên ngay (thông thường được rủt từ hệ thống"

    Nghi ngờ về câu nói này....!!!

  3. #3
    Ngày gia nhập
    01 2011
    Bài viết
    22

    Trích dẫn Nguyên bản được gửi bởi neverland87 Xem bài viết
    Bạn muốn tạo 1 chuỗi ngẫu nhiên sao cho người dùng ác ý không thể đoán trước được. Thông thường, bạn sẽ nghĩ ngay đến việc ứng dụng lớp System.Random để làm việc này, các số mà bạn tạo với lớp System.Random là ngẫu nhiên về mặt thống kê, nghĩa là chúng đi theo một sự phân bố ngẫu nhiên, tuy nhiên chúng lại không phù hợp cho việc bảo mật. Với những lập trình viên nắm vững giải thuật, họ có thể phát hiện ra quy luật tạo số ngẫu nhiên ngay (thông thường được rủt từ hệ thống), và rồi họ sẽ đoán ra được các giá trị trong tương lai.
    Giải pháp cho chúng ta là sử dụng chuỗi ngẫu nhiên bảo mật mạnh. Chuỗi này được sinh ra từ nhiều giá trị, bao gồm các dữ liệu hệ thống và người dùng như: ID của tiến trình và ID của tiểu trình, thời gian hệ thống,... Để làm được này, bạn cần dùng đến lớp RNGCryptoServiceProvider trong namespace bằng cách thêm using System.Security.Cryptography;
    Và sau đây là 1 ví dụ minh họa (full code):
    Bạn đã đưa ra quá nhiều kết luận CẢM TÍNH
    1. Thứ nhất, bạn đã đưa vào một khái niệm "ngẫu nhiên mạnh" mà chẳng giải thích thế nào là mạnh.
    2. Thứ hai, bạn nói "đoán trước được" mà không nói điều kiện để "đoán trước" là gì.
    3. Bạn cho rằng nắm được "quy luật tạo số ngẫu nhiên" thì sẽ doán được giá trị trong tương lai? Không chặt chẽ! Cảm tính! Tôi không cần biết quy luật tạo số, tôi cũng đoán đc rằng trong tương lai sẽ xuất hiện số 1!!!!!!!!!!
    4. Thế nào là "phù hợp cho việc bảo mật"? Bạn đang nói đến mật mã? Bạn đang nói đến thanh ghi dịch?
    5. Bạn khẳng định "chuỗi này được sinh ra từ nhiều giá trị, bao gồm....". Bạn sai hoàn toàn. Sai cơ bản! Tất cả các thứ bạn liệt kê ra đó chỉ quyết định số "seed" cho bộ sinh số mà thôi. Ấy là chưa kể, có thể bạn chỉ phỏng đoán về việc sử dụng chúng chứ không biết chắc. Nói luôn bạn hay, lớp Random sử dụng "seed" mặc định phụ thuộc vào thời gian hệ thống (theo MSDN).
    6. Nói một cách chính xác, tất cả các số sinh ra bằng các phương pháp trên đây đều là số giả ngẫu nhiên. Trong mật mã, để sinh các số như thế, người ta sử dụng "thanh ghi dịch phản hồi" (xin lỗi, nếu tôi dùng sai thuật ngữ). Muốn biết được số tiếp theo là số nào, bạn phải biết được
    - cấu trúc thanh ghi (tức là "quy luật tạo số ngẫu nhiên" ấy)
    - trạng thái hiện thời của nó (có thể hiểu thô thiển là n số nào đó)
    hoặc là bạn phải có được khoảng 2 mũ n số trước số mà bạn muốn đoán. Trong đó, n là độ dài thanh ghi. Các "số" được nói đến trong mục 6 này là các số nhị phân.

  4. #4
    Ngày gia nhập
    12 2008
    Bài viết
    23

    nói tóm lại là cho em hỏi sử dụng lớp Random có thực sự mạnh không???

  5. #5
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Trích dẫn Nguyên bản được gửi bởi nguyendangdung Xem bài viết
    nói tóm lại là cho em hỏi sử dụng lớp Random có thực sự mạnh không???
    Với class Random, bạn khởi tạo 2 đối tượng cùng 1 seed sẽ cho ra cùng chuỗi số "ngẫu nhiên".

    Tham khảo ( đọc phần remarks )
    Code:
    http://msdn.microsoft.com/en-us/library/system.random.aspx
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 18-06-2012 lúc 07:43 PM.

  6. #6
    Ngày gia nhập
    01 2013
    Bài viết
    1,418

    Mặc định Tạo 1 chuỗi ngẫu nhiên cực mạnh trong lập trình C#

    Trích dẫn Nguyên bản được gửi bởi takhavova Xem bài viết
    Bạn đã đưa ra quá nhiều kết luận CẢM TÍNH
    1. Thứ nhất, bạn đã đưa vào một khái niệm "ngẫu nhiên mạnh" mà chẳng giải thích thế nào là mạnh.
    2. Thứ hai, bạn nói "đoán trước được" mà không nói điều kiện để "đoán trước" là gì.
    3. Bạn cho rằng nắm được "quy luật tạo số ngẫu nhiên" thì sẽ doán được giá trị trong tương lai? Không chặt chẽ! Cảm tính! Tôi không cần biết quy luật tạo số, tôi cũng đoán đc rằng trong tương lai sẽ xuất hiện số 1!!!!!!!!!!
    4. Thế nào là "phù hợp cho việc bảo mật"? Bạn đang nói đến mật mã? Bạn đang nói đến thanh ghi dịch?
    5. Bạn khẳng định "chuỗi này được sinh ra từ nhiều giá trị, bao gồm....". Bạn sai hoàn toàn. Sai cơ bản! Tất cả các thứ bạn liệt kê ra đó chỉ quyết định số "seed" cho bộ sinh số mà thôi. Ấy là chưa kể, có thể bạn chỉ phỏng đoán về việc sử dụng chúng chứ không biết chắc. Nói luôn bạn hay, lớp Random sử dụng "seed" mặc định phụ thuộc vào thời gian hệ thống (theo MSDN).
    6. Nói một cách chính xác, tất cả các số sinh ra bằng các phương pháp trên đây đều là số giả ngẫu nhiên. Trong mật mã, để sinh các số như thế, người ta sử dụng "thanh ghi dịch phản hồi" (xin lỗi, nếu tôi dùng sai thuật ngữ). Muốn biết được số tiếp theo là số nào, bạn phải biết được
    - cấu trúc thanh ghi (tức là "quy luật tạo số ngẫu nhiên" ấy)
    - trạng thái hiện thời của nó (có thể hiểu thô thiển là n số nào đó)
    hoặc là bạn phải có được khoảng 2 mũ n số trước số mà bạn muốn đoán. Trong đó, n là độ dài thanh ghi. Các "số" được nói đến trong mục 6 này là các số nhị phân.
    1. Chí phải.
    Ko biết chủ thớt định xài TRNG hay CSPRNG (bắt buộc phải là crypto-secured) đây.
    2. Nắm được internal state hay init state + step là xong.
    3. Private key, session key, IV, blabla...
    5. Đó là CSPRNG.
    Nếu ko bơm entropy là lộ sáng ngay.
    Còn implementation thì chưa được CS đâu.
    6. Register feedback? Cái đó làm sao mà crypto-secured được, vì vẫn có thể lấy được những số sinh từ trước.


    Còn crypto-secure: Để crypto-secure thì *ít nhất* cũng phải có: (từ dễ đến khó)
    - Giá trị sinh ra phải ăn được test thống kê (PRNG đều phải có)
    - Biết internal state hiện thời thì không thể biết internal state quá khứ
    Sau đó là: Biết internal state hiện thời thì không thể biết internal state tương lai (đó là lí do để bơm entropy)
    Đã được chỉnh sửa lần cuối bởi prog10 : 17-06-2014 lúc 09:48 AM.

  7. #7
    Ngày gia nhập
    06 2011
    Bài viết
    3

    Đã dùng Random thì phải là thánh mới đoán đc. Mà đã phàm là thánh thì Random mạnh hay yếu cũng vẫn bị đoán ra

Các đề tài tương tự

  1. Game Lệnh (run, pause, stop) một chuỗi ngẫu nhiên
    Gửi bởi MrKaii trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 02-09-2013, 04:07 PM
  2. Tạo một chuỗi ngẫu nhiên không trùng lặp trong lập trình C#
    Gửi bởi vinhson trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 17
    Bài viết cuối: 20-05-2012, 02:37 PM
  3. Chuỗi ngẫu nhiên
    Gửi bởi thekingofrag trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 04-04-2012, 05:40 AM
  4. Bài tập C Tạo ngẫu nhiên mảng 2 chiều vuông 4X4 với các phần tử tạo ngẫu nhiên trong đoạn[0,50]
    Gửi bởi truongtrungviet trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 16-04-2011, 08:06 AM
  5. Hướng dẫn hàm tạo chuỗi ngẫu nhiên trong C++
    Gửi bởi bigcat2009 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 06-09-2010, 05:08 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn