2012-01-25 7 views
6

Czytam wikipedia o klucza publicznego kryptografii klucza publicznego (http://en.wikipedia.org/wiki/Public-key_cryptography) aw nim jest napisane:Jak połączyć klucz prywatny i klucz publiczny do wspólnej tajemnicy w Javie

W Program wymiany kluczy Diffie-Hellman, każda ze stron generuje parę kluczy publiczny/prywatny i dystrybuuje klucz publiczny ... Po uzyskaniu autentycznej kopii kluczy publicznych drugiej strony, Alicja i Bob mogą obliczyć wspólny sekret w trybie offline. Wspólny klucz tajny może być na przykład używany jako klucz do symetrycznego szyfru.

Zastanawiam się, jak to osiągnąć w Javie? to jest, biorąc pod uwagę arbitralny klucz publiczny i arbitralny klucz prywatny, w jaki sposób wygenerować z niego tajemnicę udziału?

Żeby było jasne:

Alice z publicznego/prywatnego pary kluczy key_pair_alice,

Bob ma parę kluczy publiczny/prywatny key_pair_bob,

Zakładając moje rozumienie jest tak, powinna być metoda combine_keys(), tak aby:

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

Moje pytanie brzmi: jak zaimplementować metodę combine_keys() w Javie.

Dzięki.

+0

Możliwy duplikat http://stackoverflow.com/questions/4219197/how-to-create-a-pki-in-java – nwaltham

+0

Dziękuję za pytanie i badania później - w zasadzie większość ludzi myśli w "RSA ograniczenia "gdzie ta fajna właściwość nie jest ogólnie możliwa, dlatego błędnie interpretuje pytanie ... – joshis

Odpowiedz

3

Po przeprowadzeniu badań, opracowałem rozwiązanie przy użyciu pakietu kryptograficznego 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 na końcu pokazuje, że alicja i bob teraz mają ten sam sekret.

+0

Próbuję również zrobić to samo, ale myślę, że ten kod może nie być całkiem poprawny - wygląda na to, że alice_key i bob_key są inicjowane na tym samym paśmie klawiszy - więc oba "łączą" się z tą samą wartością. –

2

Wydaje się, że źle interpretujesz artykuł. Wspólny klucz tajny nie jest generowany z par kluczy prywatny/publiczny. Jest to arbitralne dane, które jedna ze stron posiada (lub generuje, np. W przypadku klucza do szyfru symetrycznego) i współdzieli z drugą stroną za pośrednictwem niezabezpieczonego systemu transportu danych (np. E-mail, większość protokołów sieciowych, itp.) Za pomocą szyfrowanie za pomocą klucza publicznego drugiego i podpisywanie za pomocą własnego klucza prywatnego. Algorytm generowania wspólnego hasła może być dowolny i nie zależy od kluczy prywatnych/publicznych. Są po prostu używane do przekazywania tajemnicy między obiema stronami.

+0

hmm, nie jestem tego taki pewien. W artykule napisano, że wspólny sekret jest obliczany offline przez obie strony. W trybie offline zakładam, że oznacza to, że nie jest konieczna dalsza wymiana między dwiema stronami? Rysunek wyraźnie pokazuje, że łączy on oba klucze, aby wygenerować wspólny sekret. – Wudong

+0

Spójrz na http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange: Rozszerzony diagram pokazuje, że strony muszą uzgodnić "wspólną farbę". W tym przypadku klucz * końcowy * rzeczywiście jest obliczany offline. Jeśli chcesz zaimplementować ten algorytm, spójrz na przykład w artykule. Możesz swobodnie używać dowolnego algorytmu, który pasuje do schematu, aby obliczyć wspólne klucze, dlatego nie ma * jedynego * sposobu wdrożenia tego. – flyx

+0

PS: Uważam także, że wzmianka o Diffie-Hellmanie jest trochę myląca w artykule o kryptografii Public Key, ponieważ jest to w rzeczywistości trochę inny schemat, który wykorzystuje tylko prywatny i bez klucza publicznego. * Możesz * używać go z publicznymi kluczami prywatnymi, ale naprawdę nie widzę sensu, ponieważ podczas pracy z kluczami publicznymi i prywatnymi nie jest konieczne obliczanie wspólnego hasła. – flyx

1

Klucze publiczne i prywatne nigdy nie są arbitralne, ale generowane w połączeniu, tj. Są parami kluczy. Następnie możesz użyć klucza prywatnego do odszyfrowania wiadomości zaszyfrowanych za pomocą klucza publicznego lub podpisania wiadomości za pomocą klucza prywatnego. Pomysł w Diffie-Hellman polega na szyfrowaniu klucza symetrycznego za pomocą klucza publicznego partnera komunikacji, aby można go było bezpiecznie przekazywać. Partner komunikacyjny może odszyfrować klucz symetryczny swoim kluczem prywatnym. W ten sposób obaj partnerzy komunikacyjni mają wspólny klucz symetryczny, który mogą wykorzystać do symetrycznej encykli.

Istnieje pakiet java związany z tym, javax.crypto, ale nie mam z tym żadnego doświadczenia. Może API może ci pomóc.

0

biorąc pod uwagę arbitralny klucz publiczny i prywatny klucz arbitrażowy, w jaki sposób wygenerować z niego tajemnicę udziału?

Załóżmy, że strona z kluczem publicznym ma sekret (na przykład ciąg bitów generowanych przez generator liczb pseudolosowych z kryptograficznym ciągiem znaków).

  1. Szyfruje tajny klucz za pomocą wybranego algorytmu i klucza publicznego.

  2. Wysyła zaszyfrowany sekret do strony z kluczem prywatnym.

  3. Strona z kluczem prywatnym odszyfrowuje zaszyfrowany klucz tajny, a obie strony dzielą się sekretem.

Ważną rzeczą jest to, że tylko osoba z kluczem prywatnym jest stanie zrobić deszyfrowania. Tak więc, pod warunkiem, że klucz prywatny nie wycieknie, a algorytm nie jest roztrzaskany, powyższa sekwencja gwarantuje również, że sekret pozostaje tajemnicą, nawet jeśli trzecia strona przechwytuje zaszyfrowany sekret.

Zastanawiam się, jak osiągnąć to w Javie?

Istnieją istniejące implementacje w Javie. Jeśli nie możesz użyć jednego z nich, możesz zaimplementować opublikowany algorytm od podstaw i użyć go do wdrożenia wspólnej tajnej procedury, jak powyżej.

Prawdopodobnie potrzebujesz lepszego źródła informacji niż Wikipedia. Istnieją podręczniki na ten temat ...

1

Zakładając moje zrozumienie jest słuszne, nie powinno być metodą combine_keys()

pewien, że istnieje sposób. I ten sposób jest dobrze znany Diffie-Hellman's method. Istnieje wiele implementacji Diffiego-Hellmana w języku Java. Na przykład look here. Twoja metoda Combine() jest przypisywana jako sharedKey

Powiązane problemy