2009-11-23 43 views
14

Tôi chắc chắn không có câu trả lời cho câu hỏi này, nhưng chỉ cố gắng tìm ra cách tiếp cận chung.Tôi nên tạo một vectơ khởi tạo như thế nào?

Sử dụng Java 1.4.2, tôi cần tạo khóa và IV để sử dụng trong thuật toán đối xứng. Các giá trị này sẽ được chia sẻ trước với người nhận thông qua kênh bảo mật.

Chìa khóa tôi có thể tạo bằng KeyGenerator.keyGenerate(). Nhưng trừ khi tôi bỏ lỡ nó, không có chức năng để tạo ra một IV ngẫu nhiên.

Tôi có nên làm điều gì đó hoàn toàn tùy ý như kéo 16 byte ngẫu nhiên khỏi bộ nhớ không? Hoặc là có một cách ưa thích của việc tạo ra các vectơ khởi tạo ngẫu nhiên đầy đủ?

Bất kỳ hướng dẫn nào được đánh giá cao.

Trả lời

7

Đối với một số sự bổ sung, lớp SecureRandom sẽ giúp bạn ra ngoài bằng cách tạo ra số đúng ngẫu nhiên:

Nhiều triển khai SecureRandom là trong hình thức của một bộ tạo số giả ngẫu nhiên (PRNG), có nghĩa là họ sử dụng một thuật toán xác định để tạo ra một chuỗi giả ngẫu nhiên từ một hạt giống ngẫu nhiên thực sự . Các triển khai khác có thể tạo ra các số ngẫu nhiên thực sự, và chưa những người khác có thể sử dụng kết hợp cả hai kỹ thuật .

Có hai phương pháp, getProvider()getAlgorithm() sẽ cung cấp cho bạn một số thông tin về việc triển khai được sử dụng. Từ this page có vẻ như máy phát ngẫu nhiên giả SHA1PRNG (được gieo giống với dữ liệu ngẫu nhiên thực) là một trong số chúng hoặc thậm chí là dữ liệu duy nhất hiện có sẵn.

+1

@schnaader - nit-pick - SHA1PRNG không phải là RNG thực. Nó là một PRNG với (theo trang bạn liên kết đến) một hạt giống ngẫu nhiên thực sự. –

+0

Bạn đã đúng, đã chỉnh sửa câu trả lời. – schnaader

13

Tùy thuộc vào chế độ bạn đang sử dụng mật mã của mình. Nếu bạn đang sử dụng CBC, các byte từ một số SecureRandom là dễ nhất và có thể là an toàn nhất & hellip, miễn là RNG của bạn tốt.

Hầu hết các nhà cung cấp Java sẽ tự động tạo các thông số bắt buộc, nhưng để bạn có thể tìm ra những gì đã được chọn, bạn cần hiểu mật mã và chế độ. Ví dụ: nếu bạn đang sử dụng chế độ yêu cầu IV, bạn sẽ làm như sau:

cipher.init(Cipher.ENCRYPT_MODE, secret); 
IvParameterSpec spec = 
    cipher.getParameters().getParameterSpec(IvParameterSpec.class); 
byte[] iv = spec.getIV(); 

Điều này cho phép nhà cung cấp chọn phương pháp phù hợp để tự tạo IV. Nhưng nếu bạn sử dụng cùng một phương pháp trên mật mã bằng chế độ ECB, nó sẽ thất bại.

Sử dụng chế độ truy cập rõ ràng yêu cầu cẩn thận để tránh sử dụng lại bộ đếm.

6

Như các câu trả lời khác ngụ ý, hãy sử dụng trình tạo số ngẫu nhiên an toàn để tạo IV.

Cũng giống như một bên, mặc dù bạn không cần phải gửi IV thông qua một kênh an toàn - nó thường là chỉ cần thêm nó vào tin nhắn. Hãy nhớ rằng đó là đến nay quan trọng hơn là bạn sử dụng IV mới cho mỗi thư, hơn là bạn giữ bí mật IV. Pre-chia sẻ các IV cùng một lúc như là chìa khóa ngụ ý hoặc hơn bạn đang tái sử dụng IV (xấu), hoặc có một giới hạn về số lượng tin nhắn bạn có thể gửi.

1

Nếu bạn đang sử dụng GUI hoặc bạn có quyền truy cập vào các cuộc gọi hệ thống tới phần cứng nhập dữ liệu người dùng (ưu tiên chuột), bạn có thể tạo vectơ các cặp tọa độ con trỏ chuột khi người dùng di chuyển nó. Thêm chúng vào một số chuỗi. Than sử dụng hàm băm yêu thích của bạn trên chuỗi để tạo IV hoàn toàn ngẫu nhiên với entropy cao.

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