2009-07-29 70 views
39

Tôi mới sử dụng mã hóa. Tôi cần phải thực hiện thuật toán mã hóa không đối xứng, mà tôi nghĩ rằng nó sử dụng khóa riêng/công khai. Tôi bắt đầu sử dụng một mẫu RSACryptoServiceProvider. nó là ok với dữ liệu nhỏ để mã hóa. Nhưng khi sử dụng nó trên dữ liệu tương đối lớn hơn "2 dòng", tôi nhận được ngoại lệ CryptographicException "Bad Length"!cách sử dụng RSA để mã hóa các tệp (dữ liệu lớn) trong C#

//Create a new instance of RSACryptoServiceProvider. 
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
{ 

    //Import the RSA Key information. This only needs 
    //toinclude the public key information. 
    //RSA.ImportParameters(RSAKeyInfo); 
    byte[] keyValue = Convert.FromBase64String(publicKey); 
    RSA.ImportCspBlob(keyValue); 

    //Encrypt the passed byte array and specify OAEP padding. 
    //OAEP padding is only available on Microsoft Windows XP or 
    //later. 
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding); 
} 

Sau đó, tôi tìm thấy một số mẫu mã hóa dữ liệu lớn (hoặc file) bằng cách sử dụng CryptoStream, và chỉ sử dụng các thuật toán đối xứng như DES hoặc 3DES, có chức năng CreateEncryptor trở ICryptoTransform là một trong những đầu vào cho các nhà xây dựng của CryptoStream !!!

CryptoStream cStream = new CryptoStream(fStream, 
       new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), 
       CryptoStreamMode.Write); 

Cách mã hóa tệp bằng RSA là gì?

+15

thuật toán riêng/công cộng không phù hợp để mã hóa dữ liệu lớn. Trong thực tế, chúng được sử dụng để trao đổi khóa bí mật riêng giữa hai bên sẽ được sử dụng để mã hóa/giải mã dữ liệu lớn một cách đối xứng. –

Trả lời

32

Như đã đề cập trong câu trả lời khác mã hóa bất đối xứng chỉ được thiết kế để mã hóa dữ liệu nhỏ hơn đó là kích thước then chốt. Một tùy chọn mà tôi đã thực hiện khi cần chuyển một lượng lớn dữ liệu được mã hóa giữa hai hệ thống là phải có một cặp khóa RSA mà khóa công khai được cả người gửi và người nhận biết khi dữ liệu cần được gửi một cặp khóa RSA mới, mã hóa khóa công cộng của cặp khóa đó bằng khóa chung chung và gửi khóa công khai đã mã hóa tới người gửi. Người gửi giải mã khóa công khai của người nhận bằng khóa riêng (mà người nhận không cần biết, cũng giống như người gửi không cần biết khóa nhận được tạo riêng), tạo khóa mã hóa đối xứng, mã hóa dữ liệu bằng khóa đối xứng và sau đó mã hóa khóa đối xứng bằng khóa công khai nhận được từ người nhận.Cả khóa đối xứng được mã hóa và dữ liệu mã hóa sau đó được gửi đến người nhận sử dụng khóa riêng được tạo ra để giải mã khóa đối xứng và sau đó giải mã dữ liệu.

Bạn có thể sử dụng các phương pháp RSACryptoServiceProvider.ToXMLString()RSACryptoServiceProvider.FromXMLString() để lưu trữ khóa công khai chung dưới dạng chuỗi ký tự XML trong ứng dụng người nhận.

Đừng quên, khi bạn tạo khóa mã hóa đối xứng để sử dụng RNGCryptoServiceProvider() để tạo khóa vì đây là phương pháp tạo số ngẫu nhiên (giả) an toàn hơn nhiều.

Ngoài ra, tôi khuyên bạn không nên sử dụng 3DES làm thuật toán mã hóa đối xứng, nó cũ và bắt đầu hiển thị tuổi của nó. Sử dụng mã hóa đối xứng AES với các lớp AesCryptoServiceProvicer hoặc RijndaelManaged.

19

Thông thường, RSA chỉ được sử dụng để chuyển khóa đối xứng (ở đầu luồng) và sau đó dữ liệu hàng loạt được mã hóa bằng khóa đó.

Mã hóa không đối xứng không đủ hiệu quả để chuyển nhiều dữ liệu.

6

Triển khai .NET của RSA (và tất cả thuật toán khóa công khai/riêng tư) không hỗ trợ khối dữ liệu lớn - vì đó không phải là mục đích của khóa công khai/riêng tư.

Thay vào đó, những gì bạn sẽ làm là tạo khóa đối xứng mới và sử dụng khóa đó để mã hóa dữ liệu. Sau đó, bạn sử dụng khóa công khai/riêng tư để mã hóa khóa đối xứng và trao đổi nó với bên kia một cách an toàn. Sau đó, họ giải mã khóa đối xứng và sử dụng nó để không mã hóa dữ liệu của bạn.

56

RSA chỉ có thể mã hóa các khối dữ liệu được ngắn hơn chiều dài chính vì vậy những gì bạn thường làm là

  1. Tạo một khóa ngẫu nhiên của độ dài chính xác cần thiết cho AES (hoặc tương đương).
  2. Mã hóa dữ liệu của bạn sử dụng AES hoặc tương tự sử dụng phím đó
  3. Encrypt phím ngẫu nhiên sử dụng RSA của bạn chính

Sau đó bạn xuất bản cả hai kết quả đầu ra từ 2 và 3

Để giải mã

  1. Giải mã khóa AES bằng cách sử dụng khóa RSA của bạn.
  2. Giải mã các dữ liệu sử dụng mà AES key
+0

Nếu bạn làm điều này thì những người duy nhất có thể giải mã dữ liệu là những người có khóa riêng từ cặp khóa RSA của bạn. –

+24

Tất nhiên, đó không phải là điểm mã hóa thực sự sao? – jcoder

18

Đối với các tìm kiếm trong tương lai liên quan đến RSA ngoại lệ chiều dài xấu ...

Bạn có thể tính toán số lượng tối đa của byte có thể được mã hóa với một kích thước phím đặc biệt như sau:

((KeySize - 384)/8) + 37

Tuy nhiên, nếu tối ưu đối xứng đệm mã hóa (OAEP) tham số là đúng, sau đây có thể được sử dụng để tính toán các byte tối đa:

((KeySize - 384)/8) + 7

Các kích thước chính pháp lý là 384-16.384 với kích thước bỏ qua của 8.

1

ta có:

MaxBlockSize=((KeySize - 384)/8) + 37 

HOẶC

MaxBlockSize=((KeySize - 384)/8) + 7 

như vậy, chúng ta có thể phân chia dữ liệu cho một số khối và sau đó mã hóa từng mã và sau đó hợp nhất chúng

Các vấn đề liên quan