it-swarm-vi.com

"Khóa có độ dài x bit" nghĩa là gì?

Tôi muốn biết ý nghĩa của việc nói "hệ thống mật mã C sử dụng các khóa có độ dài x bit". Tôi không hiểu chiều dài bit có nghĩa là gì ... không phụ thuộc vào mã hóa? Cùng một từ mã hóa thành các chuỗi bit có độ dài khác nhau trong utf8, iso và unicode, vậy có mã hóa chung nào được sử dụng để xác định độ dài của khóa không? Hay "độ dài của x bit" có nghĩa là một cái gì đó hoàn toàn khác nhau?

22
strauberry

Đối với thuật toán đối xứng ( mã hóa đối xứng , Mã xác thực thư ), khóa là một chuỗi bit, sao cho bất kỳ chuỗi có độ dài phù hợp là một khóa có thể. Chẳng hạn, AES là thuật toán mã hóa đối xứng (cụ thể là mật mã khối ) được xác định trên các khóa của 128, 192 và 256 bit: bất kỳ chuỗi 128, 192 hoặc 256 bit có thể được sử dụng làm khóa. Cách bạn mã hóa các bit này không liên quan ở đây: bất kể bạn chỉ đổ chúng thô (8 bit mỗi byte), hoặc sử dụng Base64, thập lục phân, hoặc suy ra chúng từ một chuỗi ký tự, hoặc bất cứ điều gì, tùy thuộc vào bạn.

Có một vài vấn đề với một số thuật toán. Ví dụ điển hình là DES , tiền thân của AES. DES là được xác định để sử dụng khóa 64 bit. Tuy nhiên, nếu bạn nhìn vào định nghĩa thuật toán, bạn sẽ thấy rằng chỉ 56 bit này được sử dụng; 8 cái còn lại đơn giản bị bỏ qua (nếu bạn đánh số bit từ 1 đến 64, đây là các bit 8, 16, 24, 32, 40, 48, 56 và 64; chúng được coi là "bit chẵn lẻ" tùy thuộc vào 56 bit khác, nhưng không ai thực sự bận tâm với việc thiết lập hoặc kiểm tra chúng). Vì vậy, người ta thường nói rằng DES có a Khóa 56 bit. Điều này là do độ dài khóa có liên quan đến bảo mật: nếu thuật toán chấp nhận các khóa có độ dài n bit, thì có 2n các khóa có thể và do đó thử tất cả (tấn công được gọi là "tìm kiếm toàn diện" hoặc "lực lượng vũ phu") có thời gian tỷ lệ thuận với 2n (với n đủ lớn, tức là hơn khoảng 85, điều này là không khả thi về mặt công nghệ). Theo nghĩa đó, DES cung cấp bảo mật của khóa 56 bit ( 256 "thực sự khác biệt" các phím có thể). Tuy nhiên, nếu bạn sử dụng thư viện triển khai DES, thư viện đó sẽ mong đợi các phím DES dưới dạng chuỗi 64 bit (thường được cung cấp dưới dạng 8 byte).

Một thuật toán khác có quy tắc đặc biệt là RC2 . Nó chấp nhận các khóa có độ dài 8 đến 128 bit (bội số của 8 chỉ); nhưng nó cũng có một tham số phụ gọi là độ dài khóa hiệu quả ký hiệu là "T1". Ở giữa quá trình xử lý khóa, một giá trị bên trong được "giảm" thành một chuỗi các bit T1, điều đó có nghĩa là mã hóa tiếp theo sẽ chỉ phụ thuộc vào các giá trị của các bit cụ thể của T1 trong giá trị bên trong đó. Điện trở của RC2 chống lại tìm kiếm toàn diện sau đó không nhiều hơn mức được cung cấp bởi khóa T1-bit, bởi vì người ta có thể thử tất cả các chuỗi có thể có của các bit T1 cho giá trị bên trong đó. Tuy nhiên, RC2 vẫn có độ dài khóa thực tế (độ dài của chuỗi bit được cung cấp dưới dạng khóa) có thể lớn hơn T1.

Đối với thuật toán bất đối xứng (còn được gọi là mật mã khóa công khai , bao gồm mã hóa bất đối xứng, chữ ký số, một số giao thức trao đổi khóa và thêm một vài thuật toán bí truyền), các khóa hoạt động bằng cặp bao gồm khóa chung và khóa riêng. Các khóa này là các đối tượng toán học với một số cấu trúc bên trong nặng. "Độ dài khóa" sau đó là thước đo thông thường về kích thước của một trong các đối tượng toán học có liên quan.

Chẳng hạn, khóa công khai RSA chứa một số nguyên lớn được gọi là modulus, cũng như một số nguyên khác (thường là nhỏ) được gọi là số mũ công khai. Khi chúng tôi nói "khóa RSA 1024 bit", chúng tôi có nghĩa là mô đun có độ dài 1024 bit, tức là số nguyên lớn hơn 21023 nhưng thấp hơn 21024. Một số nguyên như vậy có thể được mã hóa thành một chuỗi gồm 1024 bit, tức là 128 byte. Tuy nhiên, khóa chung cũng phải chứa số mũ công khai, do đó độ dài được mã hóa thực tế sẽ lớn hơn. Và khóa riêng là, trên quan điểm lý thuyết, kiến ​​thức về cách mô đun có thể được tính bằng số nguyên tố; mã hóa truyền thống cho kiến ​​thức đó là các yếu tố chính, cùng với một loạt các giá trị trợ giúp có thể được tính toán lại từ các yếu tố (nhưng sẽ hơi tốn kém) và có thể giúp thực hiện thuật toán nhanh hơn.

Đối với các loại khóa riêng biệt hoạt động trên toán học riêng biệt, các "độ dài" khác được sử dụng, do đó bạn không thể so sánh trực tiếp tính bảo mật của các thuật toán bằng cách đơn giản so sánh độ dài khóa. Một khóa 256-bit ECDSA an toàn hơn rất nhiều so với khóa RSA 768 bit. Ngoài ra, cấu trúc toán học vốn có của các cặp khóa công khai/riêng tư cho phép các cuộc tấn công nhanh hơn nhiều so với việc đơn giản thử một loạt các bit ngẫu nhiên và có nhiều chi tiết tinh tế. Xem trang web này để biết giải thích và máy tính trực tuyến cho bộ quy tắc khác nhau về việc so sánh các kích thước chính mà nhiều tổ chức quản lý đã đưa ra.

23
Thomas Pornin

Hãy xem xét mã hóa đơn giản của việc dịch chuyển từng chữ cái sang phải trong bảng chữ cái, để A trở thành B, B trở thành C, v.v. Vì vậy, HELLO được mã hóa thành: IFMMP

Tôi có thể dịch chuyển một chữ cái sang phải, hai chữ cái bên phải hoặc tối đa 25 chữ cái bên phải. Coi "số chữ cái bên phải" là "phím". Phải mất 5 lần cắn để giữ một số trong khoảng từ 0 đến 25. Do đó, kích thước khóa là "5 bit".

Hoặc, thay vì dịch chuyển sang phải, hãy giả sử rằng chúng tôi sắp xếp lại ngẫu nhiên bảng chữ cái và thực hiện ánh xạ một-một: ABCDEFGHIJKLMNOPQRSTUVWXYZ RJQFGSKPBTODUZLNHYAVXEMWIC trong trường hợp này, chúng tôi sẽ tìm thấy nó được chuyển thành chữ 'P' và thông báo: HELLO trở thành: PGDDL

Giả sử việc sắp xếp lại ngẫu nhiên của bảng chữ cái được thực hiện với một chuỗi toán học dựa trên một số 5 bit, sao cho mỗi số tạo ra một chuỗi khác nhau. Do đó, số 5 bit một lần nữa là "khóa".

Vấn đề với khóa 5 bit là nó chỉ có 32 kết hợp. Nếu tôi biết thuật toán mã hóa, tôi có thể có tất cả 32 khóa cho đến khi tôi tìm thấy sự kết hợp đúng. Chìa khóa càng lớn, điều này càng trở nên khó khăn - HIỆU QUẢ. Khóa 6 bit có 64 kết hợp, khóa 7 bit có 128 kết hợp, v.v. Khóa 10 bit có một nghìn kết hợp, khóa 20 bit có một triệu kết hợp, khóa 30 bit có kết hợp BILLION.

Giả sử bạn có một máy tính có thể kiểm tra một tỷ khóa mỗi giây khi cố gắng thực hiện tất cả các kết hợp. Điều đó có nghĩa là bạn có thể phá khóa 30 bit chỉ trong một giây. Nhưng, điều đó có nghĩa là bạn sẽ mất một tỷ giây (hoặc 34 năm) để phá khóa 60 bit.

Mỗi 30 bit chúng ta thêm vào làm cho nó khó hơn gấp tỷ lần. Một cơ quan gián điệp như NSA có thể bẻ khóa 60 bit bằng siêu máy tính, nhưng khóa 90 bit khó bẻ khóa hơn gấp tỷ lần và khóa 120 bit sẽ khó hơn gấp tỷ lần để bẻ khóa hơn 90 bit.

Đó là lý do tại sao WEP cũ hơn (40 bit) và DES (56 bit) bị coi là lỗi thời: chúng ta có thể bẻ khóa chúng bằng máy tính để bàn bằng cách thử tất cả các kết hợp. Đó là lý do tại sao tiền điện tử hiện đại, như AES, sử dụng 128 bit. Chúng ta không thể vũ phu bẻ khóa các thuật toán đó.

14
Robert David Graham

Độ dài của khóa tính theo bit không khác gì một đặc điểm kỹ thuật về kích thước của nó. Khóa 128 bit chiếm 16 byte dung lượng - chỉ các bit thô mà bộ xử lý sử dụng. Không có gì đặc biệt, không có bản dịch.

Mã hóa là ánh xạ các bit đến một cái gì đó có ý nghĩa. Ví dụ: chuỗi 8 bit 01100001 (0x61) trong ASCII là chữ "a". Vì các khóa là dữ liệu ngẫu nhiên và chúng không có ý nghĩa, mã hóa chỉ phát huy tác dụng để dịch dữ liệu nhị phân sang một cái gì đó có thể in được, ví dụ BASE64. Vì vậy, thay vì "chuỗi bit nào tôi phải viết chữ a?" - có thể thay đổi với các bảng mã khác nhau, một khóa là "bit này là gì? bit này là gì? bit này là gì? ? ".

3
Jeff Ferland

Cùng một từ mã hóa thành các chuỗi bit có độ dài khác nhau trong utf8, iso và unicode, vậy có mã hóa chung nào được sử dụng để xác định độ dài của khóa không?

Một chìa khóa không phải là một từ. Nó là một chuỗi các bit. "Mã hóa chung" mà bạn nói không phải là mã hóa.

Một lưu ý khác, có mã hóa mã điểm-> chuỗi được gọi là UTF-8 và ISO- *, nhưng unicode không phải là mã hóa. Đó là một bộ ký tự.

Có lẽ xác định một số thuật ngữ có thể giúp đỡ.

Một "bộ ký tự", ví dụ unicode, là một tập hợp các ký hiệu thường được xác định bởi chỉ số nguyên. Trong unicode, các ký hiệu đó còn được gọi là điểm mã (giá trị vô hướng unicode).

"Chuỗi" là một chuỗi các ký hiệu được chọn từ bảng chữ cái. Trừ khi có quy định khác, chuỗi có độ dài hữu hạn và bảng chữ cái là tập con của unicode nhưng thuật ngữ này cũng có thể được sử dụng cho các bảng chữ cái khác: "chuỗi byte" (trong đó bảng chữ cái là tập hợp các số nguyên có thể biểu thị trong 8 bit [0,255] hoặc [-128.127]) hoặc "chuỗi UTF-16" (trong đó bảng chữ cái là tập hợp các số nguyên [0,65535]).

"Mã hóa" là ánh xạ (thường có thể đảo ngược) từ một loại chuỗi này sang một chuỗi khác. UTF-8 ánh xạ các chuỗi "điểm mã" (còn gọi là chuỗi thông thường) thành chuỗi byte.

1
Mike Samuel

Tôi không hiểu chiều dài bit có nghĩa là gì ... không phụ thuộc vào mã hóa?

Văn bản - một chuỗi các ký tự và glyphs khác từ nhiều ngôn ngữ - là một sự trừu tượng. Con người biết cách xử lý văn bản, nhưng máy tính thì không - cho đến khi chúng ta tạo ra một cách để máy tính làm điều đó. Cách đó được gọi là "mã hóa" - mã hóa là cách ánh xạ một chuỗi các ký tự thành một chuỗi byte và để ánh xạ một chuỗi các byte trở lại một chuỗi các ký tự. Trong một mã hóa, một ký tự có thể được mã hóa thành một byte, trong khi ở một mã hóa khác, cùng một ký tự sẽ được mã hóa thành bốn byte.

Đơn giản, văn bản có thể được mã hóa thành một chuỗi byte. Tuy nhiên, văn bản là trừu tượng và phải được được mã hóa để được xử lý.

Nhưng một chuỗi các byte chỉ là một chuỗi các byte và không liên quan gì đến văn bản và không có khái niệm nào về mã hóa.

Chuỗi các bit, miễn là độ dài của chúng luôn là bội số của 8 bit, tương đương với chuỗi byte. Vì vậy, khi ai đó nói về khóa 16 byte, nó tương đương với khóa 128 bit.

Khi làm việc với các chức năng mã hóa, người ta nên luôn luôn cẩn thận chỉ xử lý các chuỗi bit hoặc byte. Nếu một người có văn bản mà người ta muốn mã hóa hoặc băm, trước tiên anh ta nên cẩn thận mã hóa văn bản trước thành một chuỗi byte, sử dụng cùng một mã hóa trong mọi trường hợp hoặc lưu ý mã hóa nào được sử dụng trong trường hợp này. Người ta chỉ nên mã hóa hoặc băm byte, không bao giờ văn bản: và mã hóa là cách dịch văn bản thành byte. Tương tự như vậy, nếu một cái có một khóa được biểu thị trong các mã hóa văn bản hex hoặc base64, trước tiên bạn nên cẩn thận để giải mã khóa trở lại thành byte.

1
yfeldblum

Ý nghĩa thực sự của việc đó là có bao nhiêu bit sẽ tạo thành khóa mong muốn để tiến hành các thuật toán mã hóa hoặc giải mã. Giả sử kích thước khóa là 256 bit, nghĩa là, nếu bạn lấy một số nguyên có giá trị lớn hơn 2 ^ 255 và thấp hơn 2 ^ 256. Ở giữa số nguyên, bạn phải lấy nó làm khóa chung hoặc khóa riêng.

0
seshu babu