Điểm:2

Câu hỏi mở rộng khóa AES

lá cờ us

Tôi đang đọc về phần mở rộng khóa cho AES nhưng dường như tôi chưa thể tìm thấy câu trả lời cho câu hỏi này. Cuốn sách đề cập đến khóa mật mã và khóa mở rộng (hoặc lịch trình khóa). Đây là thuật toán từ cuốn sách:

thủ tục KeyExpansion(byte K[4][Nk], byte W[4][Nb (N r + 1)]) ? Nk ⤠6
    cho j = 0 đến Nk â 1 làm
        cho tôi = 0 đến 3 làm
            W[i][j] â K[i][j]
        kết thúc cho
    kết thúc cho
    for j = Nk to Nb (N r + 1) â 1 do
        nếu j mod Nk = 0 thì
            W[0][j] â W[0][j â Nk ] + S RD [W[1][j â 1]] + RC[j/Nk ]
            cho tôi = 1 đến 3 làm
                W[i][j] â W[i][j â Nk ] + S RD [W[i + 1 mod 4][j â 1]]
            kết thúc cho
        khác
            cho tôi = 0 đến 3 làm
                W[i][j] â W[i][j â Nk ] + W[i][j â 1]
            kết thúc cho
        kết thúc nếu
    kết thúc cho
thủ tục kết thúc

Câu hỏi 1: Trong dòng đầu tiên, quy trình này đang lấy một khóa. Đối tượng chính cần được chức năng này chấp nhận là gì? Có vẻ như khóa này đã có số lượng từ 32 bit cần thiết cho 128 hoặc 192 (vì đây là phần mở rộng khóa cho 6 cột trở xuống) nhưng làm cách nào để bạn lấy được từ mật khẩu có độ dài ngẫu nhiên của người dùng? PKCS7 đã được chạy để khóa được đệm chưa?

Câu hỏi 2: Điều này cho thấy rằng khóa đã nhập thực tế của người dùng là một phần của lịch trình khóa hay tất cả các khóa trong lịch trình đều bắt nguồn từ khóa đầu vào thô thực tế của người dùng?

Điểm:8
lá cờ my

Có vẻ như khóa này đã có số lượng từ 32 bit cần thiết cho 128 hoặc 192 (vì đây là phần mở rộng khóa cho 6 cột trở xuống) nhưng làm cách nào bạn lấy được từ mật khẩu có độ dài ngẫu nhiên của người dùng?

Cách bạn lấy khóa bit 128, 192 (hoặc 256) nằm ngoài thông số kỹ thuật của AES. Nó lấy chìa khóa đó làm đầu vào; những gì bạn làm để tìm ra chìa khóa không phải là mối quan tâm của nó.

Bây giờ, chúng tôi thường không chuyển trực tiếp mật khẩu của người dùng thành khóa; chúng tôi thường tạo nó từ Hàm dẫn xuất khóa (với các đầu vào có thể bao gồm kết quả của hoạt động trao đổi khóa) hoặc có thể sử dụng trực tiếp đầu ra của một trình tạo số ngẫu nhiên an toàn (và tìm cách truyền khóa này sang bên kia bằng cách nào đó) . Vấn đề với việc sử dụng trực tiếp mật khẩu của người dùng là mật khẩu là phần yếu nhất của hệ thống - việc đoán mật khẩu dễ dàng hơn nhiều so với việc phá vỡ AES (hoặc thao tác trao đổi khóa).

Điều này cho thấy rằng khóa đã nhập thực tế của người dùng là một phần của lịch trình khóa hay tất cả các khóa trong lịch trình đều được lấy từ khóa đầu vào thô thực tế của người dùng?

Việc mở rộng khóa tạo ra 11, 13 hoặc 15 khóa con mà AES sử dụng (tùy thuộc vào kích thước khóa). Các khối 1, 3/2 hoặc 2 ban đầu sẽ là các bit được lấy trực tiếp từ khóa đã nhập; tuy nhiên điều đó không quan trọng đối với cách thức hoạt động của AES.

lá cờ us
Cảm ơn thông tin này.
Điểm:7
lá cờ in

Đối tượng chính cần được chức năng này chấp nhận là gì?

Một mảng byte.

làm thế nào bạn có được điều đó từ mật khẩu có độ dài ngẫu nhiên của người dùng?

Phương pháp thông thường là sử dụng Hàm dẫn xuất khóa dựa trên mật khẩu (PBKDF) như PBKDF2, Bcrypt, Argon2, BalloonHash, v.v. Hãy nhớ rằng chúng không thể tăng độ mạnh của đầu vào. Do đó, người dùng phải chọn một mật khẩu tốt có đủ độ mạnh như mật khẩu được tạo bằng phương pháp dicewire.

Trong một số ứng dụng như mã hóa đĩa, một khóa ngẫu nhiên thống nhất được tạo để mã hóa đĩa và khóa này được mã hóa từ khóa lấy từ mật khẩu của người dùng. Tuy nhiên, bảo mật phụ thuộc vào chất lượng của mật khẩu.

Ngoài ra, tài liệu chính có thể là nguồn trao đổi khóa như DHKE, trong trường hợp này, Hàm dẫn xuất khóa như HKDF phải được áp dụng cho tài liệu chính để lấy khóa AES (byte).

PKCS7 đã được chạy để khóa được đệm chưa?

Không thể nào, điều đó không an toàn. Nếu bạn đang thiết kế thư viện, hãy từ chối đầu vào của người dùng (lập trình viên) nếu đầu vào đó ngắn hơn kích thước khóa mục tiêu.

điều này cho thấy rằng khóa đã nhập thực tế của người dùng là một phần của lịch trình khóa hay tất cả các khóa trong lịch trình đều được lấy từ khóa đầu vào thô thực tế của người dùng?

Mật khẩu của người dùng phải được xử lý bằng PBKDF để lấy khóa. Lịch trình khóa cần một mảng khóa có kích thước tùy thuộc vào AES ưu tiên (128,192,256). Các lịch trình chính không phân biệt chất lượng của vật liệu chính và nó không phải là một phần của thiết kế của nó. Người sử dụng và thư viện chịu trách nhiệm về chất lượng của tài liệu chính. Các thư viện mã hóa lẽ ra phải xử lý mật khẩu bằng PBKDF tốt và nhập đầu ra vào lịch trình khóa. Quá trình này phải độc lập với người dùng - ngoại trừ một số cảnh báo về chất lượng của mật khẩu.

Tất cả hợp lại thành một;

  1. Nhận mật khẩu từ người dùng và cảnh báo người dùng nếu mật khẩu ngắn.
  2. lấy được mảng byte khóa mong muốn từ mật khẩu bằng PBKDF
  3. Cung cấp lịch trình khóa với mảng byte khóa dẫn xuất.
lá cờ us
"Mật khẩu của người dùng phải được xử lý bằng PBKDF để lấy khóa." hiểu rồi. Cảm ơn.Chỉ là cuốn sách dường như không đi sâu vào vấn đề này như tôi có thể nói.
Maarten Bodewes avatar
lá cờ in
Tiêu đề của cuốn sách là gì"? Cách khóa AES được tạo hoặc dẫn xuất không phải là một phần của chính thuật toán AES...
lá cờ us
@MaartenBodewes "Thiết kế của Rijndael" trong chương 3 nơi trình bày lịch trình chính. Nhưng cũng có FIPS 197. Sẽ hoàn toàn ổn nếu bản thân nó không phải là một phần của AES nhưng điều đó sẽ giải thích tại sao nó không được đề cập và tại sao tôi không chắc chắn. :D
lá cờ cn
@mirkaim Tôi nghi ngờ hầu hết các khóa đối xứng hoàn toàn không được lấy từ mật khẩu người dùng. Chúng được tạo từ một số giao thức thỏa thuận khóa bất đối xứng (ví dụ TLS) hoặc được tạo ngẫu nhiên (hy vọng là từ trình tạo số ngẫu nhiên an toàn bằng mật mã), sau đó được bảo vệ bằng cách mã hóa bằng một số khóa khác.
Điểm:5
lá cờ in

Có vẻ như khóa này đã có số lượng từ 32 bit cần thiết cho 128 hoặc 192 (vì đây là phần mở rộng khóa cho 6 cột trở xuống) nhưng làm cách nào bạn lấy được từ mật khẩu có độ dài ngẫu nhiên của người dùng?

Mật khẩu không phải là chìa khóa của chính họ.

Để lấy khóa từ mật khẩu, bạn phải sử dụng Hàm dẫn xuất khóa dựa trên mật khẩu. Bạn có thể sử dụng các chức năng như băm PBKDF2, Argon2 hoặc Balloon. Các thuật toán nổi tiếng khác là bcrypt và scrypt.

PKCS7 đã được chạy để khóa được đệm chưa?

Không, phần đệm tương thích PKCS#7 là phần đệm bạn chạy trên bản rõ (hoặc - khi được triển khai hiệu quả - trên bộ đệm có kích thước khối được sử dụng để mã hóa/giải mã trong thao tác mã hóa cuối cùng). Khóa không cần phương thức đệm khi được tạo/xuất phát chính xác; nó phải luôn có kích thước phù hợp - và nếu không thì phần đệm bằng 0 sẽ hoạt động tốt.

Điều này cho thấy rằng khóa đã nhập thực tế của người dùng là một phần của lịch trình khóa hay tất cả các khóa trong lịch trình đều được lấy từ khóa đầu vào thô thực tế của người dùng?

Các khóa đối xứng bao gồm các bit/byte. Vì vậy, khóa AES bao gồm 128, 192 hoặc 256 bit/16, 24 hoặc 32 bit tương ứng. Bất cứ thứ gì khác không phải là khóa AES. Một chuỗi thường không được coi là khóa, mặc dù nó có thể là mã hóa hex hoặc base64 của khóa. Nếu nó là một chuỗi có kích thước bất kỳ thì nó thường được coi là mật khẩu.

Đối với lịch trình khóa bên trong AES: Không, (các) vòng đầu tiên rất có thể sử dụng khóa đầu vào ban đầu. Như bạn có thể thấy giá trị của j không bắt đầu với j. Điều này có ý nghĩa, lịch trình khóa đảm bảo rằng các khóa con đủ khác nhau để thông tin về khóa con sau không hiển thị bất kỳ thông tin nào về khóa con trước đó.

lá cờ us
Hiểu rồi. Cảm ơn rất nhiều.

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