Điểm:1

Độ dài đầu ra AES không phải lúc nào cũng là bội số của 16

lá cờ ng

Tôi có một giải pháp C# mã hóa một loạt các khối dữ liệu nhỏ bằng AES.

        // Đây là cách tôi định cấu hình đối tượng Aes
        var aes = Aes.Create();
        aes.Mode = CipherMode.CBC;
        aes.KeySize = 256;
        aes.Padding = PaddingMode.PKCS7;

Sau đó, tôi ghi các byte bản mã thô vào các cột VARBINARY của SQL Server.

Khi truy vấn độ dài của các cột bản mã VARBINARY này, tôi mong đợi chúng luôn là bội số của 16 byte. Tuy nhiên điều đó dường như không phải là trường hợp ở đây.

Tôi đã thử đọc về nó trực tuyến và câu hỏi duy nhất tôi tìm thấy là hỏi tại sao bản mã AES được đệm tới các khối 16 byte, vì vậy tôi nghĩ tôi nên hỏi về câu hỏi nghịch đảo ở đây.

Ghi chú:

  • Tôi đã thử giải mã một trong những bản mã có kích thước kỳ lạ này và nó hoạt động tốt, vì vậy bản mã không bị sai định dạng.
  • Tôi nhận thấy điều đó không xảy ra thường xuyên, trong một lần chạy, nó đã xảy ra 19 lần trên tổng số 5.828 lần.
  • Khi nó xảy ra, nó luôn tắt từng cái một (31 thay vì 32, 767 thay vì 768, v.v.)

Tôi đã nghĩ rằng có thể tiêu chuẩn AES có thể cắt bớt các byte mật mã chính xác bằng 0 (hoặc một số nổi tiếng khác) từ cuối đầu ra vì bộ giải mã có thể xây dựng lại? Nhưng rất thích làm rõ.

Điểm:4
lá cờ my

Bạn nói đúng; AES-CBC tiêu chuẩn (không ăn cắp bản mã) có đầu ra luôn có độ dài là bội số của 16 byte.

Một khả năng xảy ra với tôi là nếu việc triển khai AES của bạn gặp trục trặc là nếu byte cuối cùng xảy ra là 0x00, thì nó sẽ không thực sự xuất ra nó (và theo hướng giải mã, nếu bản mã ngắn một byte, nó sẽ ngầm thêm 0x00).

Nếu giả thuyết này là đúng, thì trong 5.828 trường hợp thử nghiệm của bạn, chúng tôi mong muốn thấy byte bản mã cuối cùng bằng 0 (và do đó bị cắt ngắn) gấp 22,8 lần dự kiến; 19 lần cũng nằm trong độ lệch chuẩn, và do đó, nó hợp lý ...

Maarten Bodewes avatar
lá cờ in
Lưu ý rằng trong trường hợp đó, bạn có thể giảm hai lần một lần trong 65536 (vì vậy có khả năng bạn chưa gặp phải nó), giảm 3 một lần trong ~ 4 tỷ, v.v. Chỉ nói vì thêm một byte có thể không khắc phục được vấn đề (nếu nó cần sửa chữa). Tôi cũng đã gặp nhiều vấn đề với việc kiểm tra kích thước nhị phân, chẳng hạn như truy xuất tệp nhị phân và sau đó kiểm tra kích thước bằng hàm dựa trên chuỗi (ví dụ: `strlen` trong C). Trên thực tế, tôi nghĩ rằng đó có nhiều khả năng là lỗi trong quy trình mã hóa/giải mã - mặc dù việc triển khai trong hầu hết DB cũng rất tệ.
lá cờ ng
Tôi đã rút ra một trong các giá trị mà SQL Server tuyên bố là 31 byte, nhưng giá trị được trả về dài 32 cặp lục giác, vì vậy tôi nghĩ rằng @MaartenBodewes đã đúng và SQL Server thực sự chỉ báo cáo độ dài sai khi tôi sử dụng hàm LEN. Điều tôi thấy thú vị HƠN là byte cuối cùng trong tất cả các byte này không phải là 00, mà là 20, mà tôi tin là ký tự khoảng trắng ASCII? Có lẽ LEN coi nó là một chuỗi và cố gắng tự động cắt chuỗi? Trong mọi trường hợp, tôi nghĩ đây không còn là câu hỏi về tiền điện tử nữa. CHỈNH SỬA: Tôi vừa tìm hiểu về hàm DATALENGTH, đây là hàm tôi nên sử dụng.
Điểm:0
lá cờ ng

Ok, như những người khác đã chỉ ra rằng tiêu chuẩn sẽ luôn tạo ra một bản mã có độ dài là bội số của 16 byte. Vấn đề là khi tôi đang đo độ dài, tôi đã sử dụng hàm T-SQL LEN, hàm này dường như cắt 0x20 byte khỏi phần cuối của chuỗi nhị phân khi nó đo độ dài.

Bây giờ tôi đã biết rằng tôi nên sử dụng hàm DATALENGTH không thực hiện việc cắt xén này và khi tôi thử, tất cả các giá trị đều là bội số của 16.

Xin lỗi vì sự nhầm lẫn!

Morrolan avatar
lá cờ ng
Để làm rõ - đó thậm chí là hành vi **mong đợi** (mặc dù đặc biệt) của T-SQL: "LEN loại trừ khoảng trắng ở cuối" theo ví dụ: [tài liệu chính thức](https://docs.microsoft.com/en-us/sql/t-sql/functions/len-transact-sql?view=sql-server-ver15#remarks)
lá cờ ng
Vâng, điều đó có ý nghĩa hơn rất nhiều sau đó. Cảm ơn @Morrolan

Đă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.