2010-05-27 36 views

Trả lời

22

Bạn có thể thử này:

key.getModulus().bitLength(); 
4

Kích thước của một khóa RSA là số bit trong mô đun của nó, vì vậy bạn muốn myRSAKey.getModulus().bitLength().

4

(EDIT: Tôi đã viết phản hồi này trước khi tôi hiểu các hạn chế được đặt trên các số nguyên nguyên được tạo cho khóa RSA. http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf Bây giờ tôi tin rằng bất kỳ trình tạo khóa tốt nào đều phải đảm bảo rằng mô đun nằm trong khoảng từ 2^(n- 1) và 2^n-1. Do đó, biểu diễn hai bổ sung tối thiểu của mô đun sẽ luôn có chính xác số bit được chỉ định cho độ dài khóa tại thời điểm tạo khóa. Ví dụ: nếu bạn tạo Khóa 2048 bit, sau đó key.getModulus(). BitLength() sẽ luôn trả về 2048.)

Trả lời một giá trị không chính xác khi bit quan trọng nhất của mô đun là 0? Ví dụ, đối với khóa 2048 bit, nếu bit quan trọng nhất của mô đun là 0, thì key.getModulus().bitLength() sẽ trả lại 2047 (hoặc ít hơn nếu nhiều bit hơn là 0). Tôi nghĩ rằng kết quả mong muốn trong trường hợp này thực sự sẽ là 2048.

Các tài liệu cho BigInteger.bitLength() đọc như sau:

Trả về số bit trong các đại diện two's-bổ sung tối thiểu của BigInteger này, trừ một chút dấu hiệu. Đối với các BigIntegers dương, điều này tương đương với số bit trong biểu diễn nhị phân thông thường. (? Tính (ceil (log2 (điều này < 0 -đây:. Này + 1))))

tôi sợ rằng người ta cần thực hiện một số giả định về những gì kích thước phím có thể được. Bạn sẽ phải giả định, ví dụ, rằng bạn sẽ chỉ bao giờ thấy 1024, phím 2048, hoặc 4096-bit và sau đó làm điều gì đó như:

int keySize; 
int bitLength = key.getModulus().bitLength(); 
if (bitLength <= 512) { 
    throw new IllegalArgumentException(...) 
} 
else if (bitLength <= 1024) { 
    keySize = 1024; 
} 
else if (bitLength <= 2048) { 
    keySize = 2048; 
} 
else if (bitLength <= 4096) { 
    keySize = 4096; 
} 
else { 
    throw new IllegalArgumentException(...) 
} 
return keySize; 

Mã này vẫn có thể là sai lầm trên (rất hiếm) ví dụ, khi 1048 bit đầu tiên của khóa 2048 bit là tất cả 0. Tôi nghĩ rằng đó không phải là điều đáng lo ngại.

+0

Mã này không đúng trong mọi dịp. 'key.getModulus(). bitLength()' là giá trị được xác định bởi các thuật ngữ "key size" hoặc "key length". Thay thế nó bằng các giá trị được chọn tùy ý là sai. –

+0

Oleg, bạn nói đúng, dĩ nhiên. Tôi đã thêm EDIT để giải thích sự hiểu lầm của tôi về các hạn chế về các yếu tố chính mà đi vào thế hệ quan trọng. –

+0

Nếu vẫn còn hoang tưởng trên máy phát điện tệ hại, người ta có thể sử dụng làm tròn lên: keySize = ((bitLength + 127)/128) * 128. Tốt hơn là đoán. Và cơ hội của 128 bit cao là tất cả các số không, tốt, theo thứ tự 1 trong 2^128. –

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