2011-01-05 36 views
7

Có cách nào để tạo PrivateKey từ mảng byte không? Tôi đã nhận mảng byte này bằng phương thức getEncoded(), nhưng bây giờ tôi phải chuyển đổi nó thành PrivateKey.Tạo PrivateKey từ mảng byte

Cảm ơn, Vuk

+0

điều này có hữu ích không? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –

+0

Không, điều này không có tác dụng, nhưng dù sao đi nữa, xin cám ơn – Vuk

Trả lời

5

Như đã nêu trên Java docs

phím thường được thu được thông qua máy phát điện trọng điểm, giấy chứng nhận, hoặc các lớp học nhận dạng khác nhau sử dụng để quản lý các khóa. Các khóa cũng có thể thu được từ các thông số kỹ thuật chính (các biểu diễn minh bạch của vật liệu chính bên dưới) thông qua việc sử dụng một nhà máy chính.

Lớp học KeyFactory có thể giúp bạn thực hiện việc này.

+0

Tôi quên nói rằng tôi đang làm việc với javacard, không hỗ trợ Lớp KeyFactory. Nó hỗ trợ keyBuilder, nhưng tôi không thể tìm ra cách sử dụng lớp này cho nhu cầu của tôi. – Vuk

3

Vứt bỏ mảng byte được mã hóa. Trên JavaCard có AFAIR không có cách nào để giải mã trực tiếp - bạn phải đặt riêng các thành phần chính khác nhau.

Ví dụ một RSAPrivateKey cần phải được khởi tạo với số mũ và các module:

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey 
    (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
    javacard.security.KeyBuilder.LENGTH_RSA_512, false); 

byte[] exponent = {(byte) 7}; 
byte[] modulus = {(byte) 33}; 
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length); 
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length); 

BTW: Đối với câu hỏi JavaCard Tôi khuyên bạn nên JavaCard Forum trong các diễn đàn Oracle. Nếu bạn tìm kiếm ở đó cho RSAPrivateKey, bạn sẽ tìm thấy một số bài viết thú vị.

+0

điểm getEncoded là gì? Họ cũng có thể ném ra một UnsupportedOperationException. – Jus12

+0

getEncoded() chỉ khả dụng trên J2SE. Nó trả về một khóa riêng ở dạng mã hóa PKCS # 8 có thể được sử dụng gần như ở mọi nơi. Nền tảng JavaCard là một trong những ngoại lệ đó. – Robert

+0

@ Robert Tôi hiểu rồi. Cảm ơn bạn đã làm rõ. – Jus12

7

Tôi cũng đang tìm kiếm câu trả lời này và cuối cùng đã tìm thấy câu trả lời. keyBytes là một mảng byte ban đầu được tạo với getEncoded().

//add BouncyCastle as a provider if you want 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
//create a keyfactory - use whichever algorithm and provider 
KeyFactory kf = KeyFactory.getInstance("DSA", "BC"); 
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec 
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes); 
PrivateKey pk = kf.generatePrivate(ks); 

Tôi chưa bao giờ làm bất cứ điều gì cho JavaCard nhưng từ post này, có vẻ như bạn có thể sử dụng lớp KeyFactory. Có thể bạn sẽ cần phải tải xuống thư viện BouncyCastle.

+1

cảm ơn. Làm tốt lắm! Bạn đã tiết kiệm cho tôi nhiều giờ nghiên cứu. Điều này nên được chọn làm câu trả lời đúng, trừ khi nền tảng của OP không hỗ trợ lâu đài bouncy. – Jus12

+0

Tôi không hiểu ý bạn là "nếu bạn muốn". Nó là tùy chọn? – Jus12

+0

@ Jus12 Tôi muốn nói nếu bạn muốn sử dụng BouncyCastle và nó chưa được đưa vào làm nhà cung cấp trên nền tảng bạn đang sử dụng. Ví dụ: trên Android, tôi đã thêm thư viện BouncyCastle và phải sử dụng dòng đó để thêm BC làm nhà cung cấp và sử dụng các thuật toán của BC. Vui vì tôi có thể giúp ai đó! :) – marchica

0

Hoặc bạn phải giải mã blob được mã hóa PKCS # 8 và thiết lập các thành phần hoặc bạn có thể lấy các thành phần từ khóa riêng (ít nhất là số mũ riêng và mô đun) như Java BigIntegers , chuyển đổi chúng thành mảng byte chưa ký và đặt chúng trong API thẻ Java như được giải thích bởi Robert. Phân tích PKCS # 8 có thể được thực hiện trên Thẻ Java nhưng đó là một bài tập khá khủng khiếp.