2010-07-19 73 views
49

Tôi muốn biết kích thước dữ liệu sau khi mã hóa AES để tôi có thể tránh đệm dữ liệu sau AES (trên đĩa hoặc bộ nhớ) chủ yếu để biết kích thước.Kích thước dữ liệu sau mã hóa AES/CBC và AES/ECB

Tôi sử dụng 128 bit AES và javax.crypto.Cipherjavax.crypto.CipherInputStream để mã hóa.

Một vài xét nghiệm thực hiện với kích thước đầu vào khác nhau cho thấy, kích thước bài mã hóa tính như dưới đây là đúng:

long size = input_Size_In_Bytes; 
long post_AES_Size = size + (16 - (size % 16)); 

Nhưng tôi không chắc liệu công thức trên được áp dụng cho tất cả các kích thước đầu vào càng tốt.

Có cách nào để tính kích thước dữ liệu sau khi áp dụng mã hóa AES - trước mà không phải đệm dữ liệu được mã hóa (trên đĩa hoặc bộ nhớ) để biết kích thước mã hóa sau không?

Trả lời

64

AES có kích thước khối cố định 16 byte bất kể kích thước khóa. Giả sử bạn sử dụng đệm PKCS 5/7, hãy sử dụng công thức này,

cipherLen = (clearLen/16 + 1) * 16; 

Xin lưu ý rằng nếu văn bản rõ ràng là nhiều kích thước khối thì cần phải có toàn bộ khối mới để đệm. Giả sử bạn xóa văn bản là 16 byte. Mật mã sẽ mất 32 byte.

Bạn có thể muốn lưu trữ IV (Vector ban đầu) bằng văn bản mã hóa. Trong trường hợp đó, bạn cần thêm 16 byte nữa cho IV.

+4

tại sao cần thêm một khối hoàn toàn mới cho một bản rõ 16 byte. Nó đã là bội số của 16. cảm ơn trước – Durin

+6

Nếu không có ít nhất một chút đệm, khối không có điểm cuối. –

+3

Tại sao cần +1 1? – Deyang

2

Mật mã AES luôn hoạt động trên các khối 16 byte (128 bit). Nếu số lượng byte đầu vào không phải là bội số chính xác của 16, nó được đệm. Đó là lý do tại sao 16 dường như là "số ma thuật" trong tính toán của bạn. Những gì bạn có nên làm việc cho tất cả các kích cỡ đầu vào.

+0

Lưu ý rằng ít nhất một đệm byte luôn gia tăng, ngay cả khi độ dài đầu vào chính xác là bội của 16. –

29

AES, như mật mã khối, không thay đổi kích thước. Kích thước đầu vào luôn là kích thước đầu ra.

Nhưng AES, là một thuật toán mã khối, yêu cầu đầu vào phải nhiều kích thước khối (16 byte). Đối với điều này, sơ đồ đệm được sử dụng như phổ biến PKCS5. Vì vậy, câu trả lời là kích thước của dữ liệu được mã hóa của bạn phụ thuộc vào sơ đồ đệm được sử dụng. Nhưng đồng thời tất cả sơ đồ đệm đã biết sẽ làm tròn đến kích thước 16 mô-đun tiếp theo (kích thước AES có kích thước khối 16 byte).

+1

tại có các sơ đồ đệm không yêu cầu thay đổi kích thước dữ liệu. – usr

+5

@usr Không, có * các chế độ hoạt động * mà không yêu cầu thay đổi kích thước dữ liệu (mặc dù thường là thẻ IV và/hoặc thẻ xác thực được yêu cầu ở trên). Chế độ đệm theo định nghĩa làm cho đầu vào dữ liệu lớn hơn cho mật mã. –

+0

@ MaartenBodewes-owlstead bạn nói đúng. – usr

1

AES hoạt động trong các khối 128 bit (16 byte) và chuyển đổi các khối văn bản rõ ràng thành các khối cyphertext có cùng độ dài. Nó sẽ chặn khối cuối cùng nếu nó ngắn hơn 16 byte, vì vậy công thức của bạn có vẻ chính xác.

8

Tùy thuộc vào chế độ bạn sử dụng AES. Những gì bạn có là chính xác cho hầu hết các chế độ khối định hướng, chẳng hạn như ECB và CBC. OTOH, trong chế độ CFB (cho một ví dụ), về cơ bản bạn chỉ sử dụng AES để tạo ra một luồng các byte, mà bạn XOR với các byte của đầu vào. Trong trường hợp này, kích thước của đầu ra có thể vẫn là kích thước của đầu vào thay vì được làm tròn lên đến kích thước khối tiếp theo như bạn đã đưa ra ở trên.

-1

Có các cách tiếp cận để lưu trữ thông tin được mã hóa tránh sự cần thiết cho bất kỳ padding nào cung cấp kích thước dữ liệu ít nhất bằng với kích thước khối. Một chút khó khăn là nếu kích thước dữ liệu được phép nhỏ hơn kích thước khối và nếu có thể tạo lại kích thước chính xác của dữ liệu, ngay cả đối với các khối nhỏ, đầu ra phải lớn hơn một chút so với kích thước đầu vào, [i] bất kể [/ i] của kích thước dữ liệu.

Để hiểu vấn đề, nhận ra rằng có 256^N tệp có thể dài N byte và số tệp có thể không dài hơn N byte là 256^N cộng với số lượng tệp có thể không dài hơn N-1 byte (có thể có một tệp không có byte dài và 257 tệp có thể không dài hơn một byte).

Nếu kích thước khối là 16 byte, sẽ có 256^16 + 256^14 + 256^13 vv tệp đầu vào có thể dài không quá 16 byte, nhưng chỉ có 256^16 tệp đầu ra có thể không dài quá 16 byte (vì tệp đầu ra không thể ngắn hơn 16 byte). Vì vậy, ít nhất một số tệp đầu vào 16 byte có thể phải phát triển. Giả sử chúng sẽ trở thành 17 byte. Có 256^17 tập tin đầu ra có thể mười bảy byte; nếu bất kỳ cái nào trong số đó được sử dụng để xử lý các đầu vào từ 16 byte trở xuống, sẽ không có đủ để xử lý tất cả các tệp đầu vào 17 byte có thể có. Không có vấn đề lớn như thế nào đầu vào có thể nhận được, một số tập tin có kích thước hoặc lớn hơn phải phát triển.

4

Nói chung, đối với một mã hóa khối mật mã:

ciphertext = Plaintext + Block - (Plaintext MOD Block)

kích thước bản mã được tính như kích thước của bản rõ mở rộng đến khối tiếp theo . Nếu padding được sử dụng và kích thước của bản rõ là chính xác nhiều kích thước khối, một khối phụ có chứa thông tin đệm sẽ được thêm vào.

AES sử dụng kích thước khối 16 byte, trong đó sản xuất:

ciphertext = Plaintext + 16 - (Plaintext MOD 16)

Nguồn: http://www.obviex.com/articles/CiphertextSize.pdf

Lưu ý:

  1. CipherText và PlainText đại diện cho kích thước của văn bản mã hóa và kích thước của văn bản thuần túy cho phù hợp.
0

Nếu chiều dài đầu vào của bạn là nhỏ hơn so với kích thước tối đa của int bạn có thể sử dụng Cipher.getOutputSize(int)

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