2013-08-15 13 views
7

Próbuję zaimplementować ECDSA (algorytm krzywej cyfrowej eliptycznej krzywej eliptycznej), ale nie mogłem znaleźć żadnych przykładów w Javie, które używają Bouncy Castle. Stworzyłem klucze, ale tak naprawdę nie wiem, jakiego rodzaju funkcji powinienem użyć, aby stworzyć podpis i zweryfikować go.Implementacja krzywej eliptycznej z algorytmem podpisu elektronicznego (ECDSA) na BouncyCastle

public static KeyPair GenerateKeys() 
    throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException 
{ 
    ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571"); 
    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC"); 
    g.initialize(ecSpec, new SecureRandom()); 
    return g.generateKeyPair(); 
} 
+0

to nie pomogło, ale stworzyłem to samo pytanie także na crypto.stackexchange.com – Yagiz

+1

Kilka lat temu, na próbach kodu prawidłowego użycia bibliotek szyfrowania był temat. Nie jestem już taki pewien, czy tak jest teraz. ... chociaż byłoby miło mieć miejsce bogate w precyzyjny, sprawdzony kodeks związany z bezpieczeństwem. – LamonteCristo

Odpowiedz

11

owlstead jest poprawne. I opracować nieco więcej, można to zrobić:

KeyPair pair = GenerateKeys(); 
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC"); 
ecdsaSign.initSign(pair.getPrivate()); 
ecdsaSign.update(plaintext.getBytes("UTF-8")); 
byte[] signature = ecdsaSign.sign(); 

i do sprawdzenia:

Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "BC"); 
ecdsaVerify.initVerify(pair.getPublic()); 
ecdsaVerify.update(plaintext.getBytes("UTF-8")); 
boolean result = ecdsaVerify.verify(signature); 
+0

"Nazwa dostawcy Java Security API to teraz SC, a nie BC" https://rtyley.github.io/spongycastle/ – JDOaktown

1

Wygląda na to, że używasz Dmuchanego Zamku głównie jako dostawcy. W takim przypadku możesz po prostu użyć Signature.getInstance("SHA256withECDSA", "BC").

5

BouncyCastle jest dostawca: zestaw klas, które zawiera pewne funkcje kryptograficzne, które aplikacje mają używać ogólnego interfejsu API, z którego pochodzi Java. Zobacz Java Cryptography Architecture, szczególnie sekcję dotyczącą podpisów, aby zobaczyć, jak wygenerować lub zweryfikować podpis. Zasadniczo otrzymasz instancję java.security.Signature (ze statyczną metodą getInstance()), a następnie zainicjujesz ją za pomocą klucza prywatnego (initSign(), aby wygenerować podpis) lub klucza publicznego (initVerify(), aby zweryfikować podpis). Następnie wprowadzasz dane wiadomości za pomocą jednego lub kilku wywołań update(), a na koniec dzwonisz pod numer sign() lub verify(), aby wygenerować lub zweryfikować podpis.