Điểm:2

Phân biệt IV đúng với IV sai trong AES CBC khi biết khóa

lá cờ us

Hiện tại, tôi đang sử dụng giá trị IV tĩnh cho tất cả quá trình mã hóa và giải mã nhưng tôi muốn nó động cho mỗi yêu cầu mã hóa/giải mã nên tôi đã bắt đầu sử dụng byte mới[16] và nó đã hoạt động. Vấn đề là làm thế nào để phát hiện và giải mã dữ liệu cũ. Dưới đây là mã của tôi để giải mã và tôi đang chuyển IV tĩnh được lưu trữ bí mật trong keyvault.

byte tĩnh riêng tư[] DecryptFromBytes_Aes(byte[] dataBytes, byte[] key, byte[] iV)
    {
        nếu (dataBytes == null || dataBytes.Length <= 0)
            ném ArgumentNullException mới ("DataBytes");
        nếu (khóa == null || khóa. Độ dài <= 0)
            ném ArgumentNullException mới ("key");
        if (iV == null || iV.Length <= 0)
            ném ArgumentNullException mới("iV");

        byte[] kết quả = null;
        sử dụng (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = khóa;
            aesAlg.IV = iV;
            aesAlg.Padding = PaddingMode.PKCS7;
            Bộ giải mã ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            sử dụng (MemoryStream memoryStream = new MemoryStream(dataBytes))
            {
                sử dụng (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    byte[] decryptedBytes = new byte[dataBytes.Length];
                    int read = cryptoStream.Read(decryptedBytes, 0, dataBytes.Length);
                    Array.Resize(ref decryptedBytes, đã đọc);
                    kết quả = decryptedBytes;
                }
            }

        }

        trả về kết quả;
    }
Bharat Malhotra avatar
lá cờ us
Cảm ơn bạn đã phản hồi nhanh chóng. Tôi đã được yêu cầu đăng nó ở đây :)
Bharat Malhotra avatar
lá cờ us
Btw, tôi đang chuẩn bị nhưng tôi không biết cách xử lý tất cả dữ liệu hiện có
Aman Grewal avatar
lá cờ gb
Nếu nó đã được thêm vào trước cho dữ liệu cũ, chỉ cần phát hiện xem IV có khớp với dữ liệu tĩnh hay không. Nếu đúng như vậy, hãy giải mã nó như bình thường, nhưng tạo IV mới khi mã hóa (ngay cả khi tất cả dữ liệu khác đều giống nhau).
kelalaka avatar
lá cờ in
@AmanGrewal vấn đề thực tế mà tôi thấy là thế này; IV tĩnh không được lưu trữ cùng với bản mã và ngày không đáng tin cậy để phân biệt. Điều này chỉ đơn giản là chúng ta có thể phân biệt một bản mã CBC được thêm vào trước một IV ngẫu nhiên với một bản mã CBC không được thêm vào trước IV. Kiểm tra phần đệm là chìa khóa.
Điểm:4
lá cờ in

Vấn đề là làm thế nào để phát hiện và giải mã dữ liệu cũ. Dưới đây là mã của tôi để giải mã và tôi đang chuyển IV tĩnh được lưu trữ bí mật trong keyvault.

Câu trả lời dựa trên phần đệm và tính chính xác của khóa.

  • Trường hợp: Nếu khóa đúng và IV không;

    Hãy nhớ rằng quá trình giải mã CBC được thực hiện như \begin{align} P_1 =& Dec_k(C_1) \oplus IV\ P_i =& Dec_k(C_i) \oplus C_{i-1},\;\; 1 < i \leq nb, \end{align}

    Do đó, nếu IV không chính xác, thì khối đầu tiên $P_1$ là không chính xác. Chúng ta có thể coi điều này tương tự như tấn công lật bit trong khối đầu tiên. khối tiếp theo $P_i$ sẽ giải mã chính xác vì chúng dựa vào tính chính xác của $C_i$$C_{i-1}$ và trong trường hợp này, họ đúng. Chỉ khối đầu tiên của bạn sẽ không chính xác. Phân biệt điều này có thể khó và bạn cần chuẩn bị một số bộ lọc để phân biệt nó với các thuộc tính của văn bản gốc - ngôn ngữ hoặc định dạng. So sánh hai trường hợp là cần thiết; đó là IV tĩnh hay IV ngẫu nhiên. Bất kỳ trường hợp nào vượt qua bộ lọc của bạn đều có thể là trường hợp chính xác và điều này thực sự phụ thuộc vào dữ liệu của bạn.

    Nếu khối đầu tiên của bản rõ là văn bản thuần túy và chỉ chứa các ký tự từ phần đầu tiên của ASCII (tức là giá trị int của char < 128) thì đây là một điểm phân biệt tốt. Chỉ cần kiểm tra xem mỗi 16 byte <128.

    Di chuyển tất cả các tệp của bạn sang một định dạng duy nhất càng sớm càng tốt.

  • Trường hợp: Nếu chìa khóa không chính xác thì khả năng cao là bạn sẽ gặp lỗi đệm PKCS#7.

    Các byte đệm sẽ là một trong những byte sau ở cuối bản rõ tùy thuộc vào kích thước của bản rõ.Với phần đệm, kích thước cần phải là bội số tối thiểu của kích thước khối AES, có kích thước khối 16 byte.

      thiếu 1 byte - byte đệm: 01
      thiếu 2 byte - byte đệm: 02 02
      thiếu 3 byte - byte đệm: 03 03 03
      thiếu 4 byte - byte đệm: 04 04 04 04
      thiếu 5 byte - byte đệm: 05 05 05 05 05
      thiếu 6 byte - byte đệm: 06 06 06 06 06 06
      ...
      khối đầy đủ - byte đệm: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 
      Ngay cả khi bản rõ là bội số của 128, thì vẫn cần có một khối đầy đủ để phần đệm không mơ hồ.
    

    Kiểm tra xem phần đệm có đúng không.

    Nếu không chính xác, bạn có thể chắc chắn rằng IV không chính xác. Nếu đúng thì có $1/256$ xác suất mà IV tạo ra một hợp lệ ngẫu nhiên 01 đệm, với $1/(256)^2$ xác suất 0202 phần đệm hợp lệ, v.v. Để loại bỏ khả năng này, bạn cần kiểm tra dữ liệu. Ngôn ngữ hoặc bất kỳ định dạng nào khác về văn bản gốc có thể giúp bạn loại bỏ các kết quả sai.

Manish Adhikari avatar
lá cờ us
Tôi đang thiếu thứ gì đó hay nó được gợi ý ở đâu trong câu hỏi rằng bản mã bao gồm một khối duy nhất? Nếu có nhiều hơn một khối, kiểm tra đệm sẽ luôn vượt qua, tôi sẽ chỉ nhận được khối đầu tiên bị hỏng, nếu IV không chính xác.
Manish Adhikari avatar
lá cờ us
Tôi không phải là OP. Tôi chỉ chỉ ra rằng việc kiểm tra IV thông qua tính chính xác của phần đệm chỉ hoạt động nếu nó chỉ tạo ra một khối bản mã duy nhất. Vì vậy, tôi chỉ tự hỏi liệu có một gợi ý tinh tế nào mà tôi đã bỏ lỡ hay không. Cảm ơn đã cập nhật câu trả lời của bạn
kelalaka avatar
lá cờ in
@ManishAdhikari vâng, bạn không phải OP :)
Bharat Malhotra avatar
lá cờ us
Cảm ơn bạn đã chia sẻ suy nghĩ của mình về vấn đề này :) Tôi không có nhiều kiến ​​thức để khắc phục sự cố này nên chỉ tự hỏi liệu một mẹo để xác định các khối đầu tiên là IV trong chuỗi được mã hóa có đủ để tôi chuyển sang sử dụng IV cũ không? Tôi nghĩ rằng AesCryptoServiceProvider lưu IV trước chuỗi được mã hóa.
kelalaka avatar
lá cờ in
@BharatMalhotra Nếu bạn cho rằng đó là văn bản gốc, thì hãy đảm bảo rằng byte đó nhỏ hơn 128? Thực hành thông thường là tiết kiệm cùng nhau. Tôi không thể nhìn thấy nó từ tài liệu. Bạn có thể tự kiểm tra nó rất dễ dàng. Kích thước của bản mã có thể chỉ ra điều này.Mã hóa một chữ cái, nếu bản mã là 16 byte thì không lưu IV,,,,
Bharat Malhotra avatar
lá cờ us
Cảm ơn, tôi nghĩ bạn đúng. Nó không lưu IV với chuỗi mã hóa. Bất kỳ liên kết nào để tham khảo để xem cách chúng tôi có thể làm điều đó để sau này tôi có thể phát hiện liên kết đó cho dữ liệu mới?
kelalaka avatar
lá cờ in
Đây là cách thực hành phần mềm, bạn có thể thêm một số ma thuật như [Maarten](https://crypto.stackexchange.com/a/96527/18298) đã đề xuất cho thấy IV là tĩnh hoặc ngẫu nhiên. Lưu ý rằng khi xây dựng phần mềm, hãy đảm bảo rằng bạn có thể phân biệt phiên bản dữ liệu nếu cần. Cập nhật nên xem xét tất cả các trường hợp...
Điểm:4
lá cờ in

Bạn không thể kiểm tra chắc chắn xem dữ liệu có tiền tố ngẫu nhiên hay không. Đối với cùng một khóa, dữ liệu thậm chí sẽ không gặp lỗi khi hủy đệm. Vì vậy, những gì bạn cần làm là sử dụng một giao thức khác.

Chẳng hạn, bạn có thể có một phép thuật hoàn toàn ngẫu nhiên 16 byte trước các tệp mới được mã hóa (tất nhiên là được tạo một lần), sau đó là số phiên bản và dữ liệu khác bao gồm IV ngẫu nhiên, bản mã và HMAC trên tiêu đề và dữ liệu bao gồm IV. Bằng cách đó, bạn có thể phát hiện ra rằng mã hóa phù hợp được sử dụng (vì vô tình tạo ra phép thuật đó có xác suất là 1 trong $2^{128}$) bằng cách đơn giản là so sánh. Bạn cũng đã bảo vệ tính toàn vẹn và xác thực cho tệp của mình bằng cách sử dụng HMAC (điều này là tùy chọn và không bắt buộc nghiêm ngặt về tính bảo mật - nhưng nó rất được khuyến khích).

Vì vậy, đó sẽ là:

 MA THUẬT (16 byte) | PHIÊN BẢN | IV (16 byte) | CIPHERTEXT | NHÃN

Trong đó TAG là thẻ xác thực được tạo bằng HMAC trên mọi thứ trước đó.

Tất nhiên, đã có nhiều người cũng đã viết các giao thức như thế này, vì vậy bạn có thể muốn xem xét các định dạng vùng chứa như CMS (thường phụ thuộc vào chứng chỉ/mã hóa khóa công khai) hoặc thậm chí là NaCL.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.