2012-01-25 26 views
6

Tôi đọc wikipedia về mật mã hóa khóa công khai Public-key (http://en.wikipedia.org/wiki/Public-key_cryptography) và trong đó nó nói:Làm thế nào để kết hợp một khóa bí mật và khoá công khai cho một bí mật được chia sẻ trong Java

Trong Lược đồ trao đổi khoá Diffie – Hellman, mỗi bên tạo cặp khóa công khai/riêng và phân phối khóa công khai ... Sau khi lấy được bản sao đích thực của khóa công khai của nhau, Alice và Bob có thể tính toán bí mật chia sẻ ngoại tuyến. Ví dụ, bí mật được chia sẻ có thể được sử dụng làm khóa cho mật mã đối xứng.

Tôi tự hỏi làm thế nào để đạt được điều này trong Java? tức là, được cung cấp khóa công khai tùy ý và khóa riêng tư bí mật, cách tạo bí mật chia sẻ từ nó?

Để làm cho nó rõ ràng hơn:

Alice có public/private cặp khóa key_pair_alice,

Bob có public/private cặp khóa key_pair_bob,

Giả sử hiểu biết của tôi là đúng, phải có phương thức combine_keys() sao cho:

combine_keys(key_pair_alice.private, key_pair_bob.public) == 
    combine_keys(key_pair_alice.public, key_pair_bob.private) 

Câu hỏi của tôi là cách triển khai phương thức kết hợp combined_keys() trong Java.

Cảm ơn.

+0

Bản sao có thể có của http://stackoverflow.com/questions/4219197/how-to-create-a-pki-in-java – nwaltham

+0

Cảm ơn bạn đã đặt câu hỏi và nghiên cứu sau - về cơ bản, hầu hết mọi người nghĩ trong "RSA ràng buộc "nơi mà tài sản mát mẻ này không phải là thường có thể, do đó giải thích sai câu hỏi ... – joshis

Trả lời

3

Sau một số nghiên cứu, tôi đã đưa ra giải pháp bằng cách sử dụng gói mã hóa của Java.

public static void main(String[] args) { 
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH"); 
AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator 
    .getInstance("DH"); 
paramGen.init(1024); 

// Generate the parameters 
AlgorithmParameters params = paramGen.generateParameters(); 
DHParameterSpec dhSpec = (DHParameterSpec) params 
    .getParameterSpec(DHParameterSpec.class); 

keyGen.initialize(dhSpec); 

KeyPair alice_key = keyGen.generateKeyPair(); 
KeyPair bob_key = keyGen.generateKeyPair(); 

SecretKey secret_alice = combine(alice_key.getPrivate(), 
    bob_key.getPublic()); 

SecretKey secret_bob = combine(bob_key.getPrivate(), 
    alice_key.getPublic()); 

System.out.println(Arrays.toString(secret_alice.getEncoded())); 
System.out.println(Arrays.toString(secret_bob.getEncoded())); 
} 

private static SecretKey combine(PrivateKey private1, 
    PublicKey public1) { 
KeyAgreement ka = KeyAgreement.getInstance("DH"); 
ka.init(private1); 
ka.doPhase(public1, true); 
SecretKey secretKey = ka.generateSecret("DES"); 
return secretKey; 
} 

Sysout cuối cùng cho thấy alice và bob hiện chia sẻ cùng một bí mật.

+0

Tôi cũng đang cố gắng làm điều tương tự, nhưng tôi nghĩ mã này có thể không hoàn toàn chính xác - có vẻ như alice_key và bob_key được khởi tạo cùng một cặp khóa - vì vậy cả hai "kết hợp" với cùng một giá trị. –

2

Bạn có vẻ hiểu sai bài viết. Bí mật được chia sẻ không được tạo ra từ các cặp khóa riêng/khóa công khai. Đó là dữ liệu tùy ý mà một bên sở hữu (hoặc tạo ra, ví dụ trong trường hợp khóa cho mật mã đối xứng) và chia sẻ với bên kia qua hệ thống truyền dữ liệu không an toàn (ví dụ: E-Mail, hầu hết các giao thức mạng, v.v.) mã hóa bằng khóa công khai của người khác và ký bằng khóa riêng của riêng. Thuật toán thế hệ của bí mật được chia sẻ có thể tùy ý và không phụ thuộc vào khóa riêng/khóa công khai. Họ chỉ được sử dụng để giao tiếp bí mật giữa hai bên.

+0

hmm, tôi không chắc chắn về điều này. Trong bài viết, nó nói rằng bí mật được chia sẻ được tính toán bởi cả hai bên. Bằng cách ngoại tuyến, tôi cho rằng điều đó có nghĩa là không cần trao đổi thêm giữa hai bên? Con số rõ ràng cho thấy nó kết hợp cả hai phím để tạo ra một bí mật được chia sẻ. – Wudong

+0

Xem http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange: Sơ đồ mở rộng cho thấy các bên cần phải đồng ý về "sơn chung". Trong trường hợp này, phím * cuối cùng * thực sự được tính toán ngoại tuyến. Nếu bạn muốn thực hiện thuật toán này, hãy xem ví dụ trong bài viết. Bạn được tự do sử dụng bất kỳ thuật toán nào phù hợp với lược đồ để tính toán các khóa chung, do đó không có * cách một * để thực hiện điều này. – flyx

+0

PS: Tôi cũng nghĩ rằng việc đề cập đến Diffie-Hellman là một chút sai lầm trong bài viết mã hóa khóa công khai, bởi vì nó thực sự là một chút khác biệt của một lược đồ chỉ sử dụng khóa riêng và không có khóa công khai. Bạn * có thể * sử dụng nó với khóa công khai, nhưng tôi không thể thực sự thấy được điểm vì khi bạn đang làm việc với khóa công khai và riêng tư, không cần thiết phải tính toán bí mật được chia sẻ. – flyx

1

Khóa công cộng và riêng tư không bao giờ tùy ý, nhưng được tạo ra kết hợp, tức là chúng là cặp khóa. Sau đó, bạn có thể sử dụng khóa riêng để giải mã các thư được mã hóa bằng khóa công khai hoặc ký thông báo bằng khóa riêng. Ý tưởng trong Diffie-Hellman là mã hóa một khóa đối xứng với khóa công khai của đối tác truyền thông để nó có thể được truyền một cách an toàn. Đối tác truyền thông có thể giải mã khóa đối xứng bằng khóa riêng của cô ấy. Bằng cách đó, cả hai đối tác truyền thông đều chia sẻ một khóa đối xứng chung mà họ có thể sử dụng để đối xứng encyric.

Có một gói java liên quan đến điều này, javax.crypto, nhưng tôi không có kinh nghiệm với nó. Có thể API có thể giúp bạn.

0

được cung cấp khóa công khai tùy ý và khóa riêng tư bí mật, cách tạo bí mật chia sẻ từ nó?

Giả sử bên có khóa công khai có bí mật (ví dụ: chuỗi bit được tạo bởi trình tạo số giả ngẫu nhiên mã hóa).

  1. Mã hóa bí mật bằng thuật toán đã chọn và khóa công khai.

  2. Nó sẽ gửi bí mật được mã hóa đến bên có khóa riêng tư.

  3. Bên có khóa cá nhân giải mã bí mật được mã hóa và hai bên chia sẻ bí mật.

Điều quan trọng là chỉ có bữa tiệc với khóa riêng là thể để làm giải mã. Vì vậy, với điều kiện là khóa riêng không bị rò rỉ và thuật toán không bị rạn nứt, trình tự trên cũng đảm bảo rằng bí mật vẫn là một bí mật ngay cả khi bên thứ ba chặn bí mật được mã hóa.

Tôi tự hỏi làm thế nào để đạt được điều này trong Java?

Có các triển khai hiện có trong Java. Nếu bạn không thể sử dụng một trong số họ, sau đó bạn có thể thực hiện một thuật toán được xuất bản từ đầu và sử dụng nó để thực hiện các thủ tục bí mật được chia sẻ như trên.

Có thể bạn cần một nguồn thông tin tốt hơn Wikipedia. Có sách giáo khoa về chủ đề này ...

1

Giả sử hiểu biết của tôi là đúng, cần có một phương pháp combine_keys()

Chắc chắn có cách. Và cách này là nổi tiếng Diffie-Hellman's method. Có rất nhiều triển khai Java của Diffie-Hellman. Ví dụ: look here. Phương thức kết hợp() của bạn được gán là sharedKey

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