Jak zacząć używać BouncyCastle? [zamknięte]

Więc po CodingHorror ' s fun with encryption i thrashing comments, rozważamy zrobienie własnego szyfrowania.

W tym przypadku musimy przekazać pewne informacje identyfikujące użytkownika do usługi strony trzeciej, która następnie oddzwoni do usługi na naszej stronie internetowej z informacjami i hash.

Druga usługa wyszukuje informacje o tym użytkowniku, a następnie przekazuje je z powrotem do trzeciej usługi.

Chcemy zaszyfrować informacje o użytkowniku idąc do usługa 3rd party i odszyfrować go po wyjdzie. Więc nie jest to długotrwałe szyfrowanie.

W artykule o kodowaniu horror, Coda Hale polecił BouncyCastle i wysoki poziom abstrakcji w bibliotece, aby wykonać szyfrowanie specyficzne dla konkretnej potrzeby.

Mój problem polega na tym, że przestrzenie nazw BouncyCastle są ogromne, a dokumentacja nie istnieje. Czy ktoś może wskazać mi tę bibliotekę abstrakcji wysokiego poziomu? (Lub inna opcja poza BouncyCastle?)

Author: Jeff Martin, 2009-05-20

7 answers

Wysoki poziom abstrakcji? Przypuszczam, że najwyższy poziom abstrakcji w Bibliotece Bouncy Castle to:

I Jestem głównie zaznajomiony z wersją Java biblioteki. Być może ten fragment kodu zaoferuje ci wystarczająco dużą abstrakcję dla Twoich celów (przykładem jest użycie szyfrowania AES-256): {]}

public byte[] encryptAES256(byte[] input, byte[] key) throws InvalidCipherTextException {
    assert key.length == 32; // 32 bytes == 256 bits
    CipherParameters cipherParameters = new KeyParameter(key);

    /*
     * A full list of BlockCiphers can be found at http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/BlockCipher.html
     */
    BlockCipher blockCipher = new AESEngine();

    /*
     * Paddings available (http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/paddings/BlockCipherPadding.html):
     *   - ISO10126d2Padding
     *   - ISO7816d4Padding
     *   - PKCS7Padding
     *   - TBCPadding
     *   - X923Padding
     *   - ZeroBytePadding
     */
    BlockCipherPadding blockCipherPadding = new ZeroBytePadding();

    BufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, blockCipherPadding);

    return encrypt(input, bufferedBlockCipher, cipherParameters);
}

public byte[] encrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException {
    boolean forEncryption = true;
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption);
}

public byte[] decrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException {
    boolean forEncryption = false;
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption);
}

public byte[] process(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters, boolean forEncryption) throws InvalidCipherTextException {
    bufferedBlockCipher.init(forEncryption, cipherParameters);

    int inputOffset = 0;
    int inputLength = input.length;

    int maximumOutputLength = bufferedBlockCipher.getOutputSize(inputLength);
    byte[] output = new byte[maximumOutputLength];
    int outputOffset = 0;
    int outputLength = 0;

    int bytesProcessed;

    bytesProcessed = bufferedBlockCipher.processBytes(
            input, inputOffset, inputLength,
            output, outputOffset
        );
    outputOffset += bytesProcessed;
    outputLength += bytesProcessed;

    bytesProcessed = bufferedBlockCipher.doFinal(output, outputOffset);
    outputOffset += bytesProcessed;
    outputLength += bytesProcessed;

    if (outputLength == output.length) {
        return output;
    } else {
        byte[] truncatedOutput = new byte[outputLength];
        System.arraycopy(
                output, 0,
                truncatedOutput, 0,
                outputLength
            );
        return truncatedOutput;
    }
}

Edit: UPS, Właśnie przeczytałem artykuł, do którego podlinkowałeś. Brzmi to tak, jakby mówił o jeszcze wyższym poziomie abstrakcji niż myślałem (np. "wyślij poufną wiadomość"). Obawiam się, że nie do końca rozumiem, do czego zmierza.

 11
Author: Adam Paynter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 12:22:31

Zakładając, że piszesz swoją aplikację w Javie, zalecam, aby nie używać konkretnego dostawcy, ale aby rozwijać swoją aplikację na bazie JCE (Java Cryptography Extension) firmy Sun. W ten sposób możesz uniezależnić się od dostawców bazowych, tj. możesz łatwo przełączać dostawców, o ile używasz szyfrów, które są szeroko zaimplementowane. Daje to pewien poziom abstrakcji, ponieważ nie musisz znać wszystkich szczegółów implementacji i może cię trochę chronić dzięki użyciu niewłaściwych klas (np. używając szyfrowania raw bez odpowiedniego wypełnienia itp.), Sun dostarcza przyzwoitą ilość dokumentacji i próbek kodu.

 3
Author: Accipitridae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 22:15:57

W BouncyCastle jest to pakiet CMS (Cryptographic Message Syntax). Jest to wysyłane w oddzielnym jar (bcmail) od samego dostawcy i jest napisane do JCE (wersja C# jest jednak napisana przeciwko lightweight API).

"Wyślij poufną wiadomość" jest zaimplementowana, z grubsza rzecz biorąc, przez klasę CMSEnvelopedDataGenerator, a wszystko, co naprawdę musisz zrobić, to dać mu wiadomość, wybrać algorytm szyfrowania (wszystkie szczegóły następnie określ jeden lub więcej sposobów odczytu wiadomości przez odbiorcę: może to być oparte na kluczu publicznym/certyfikacie, wspólnej tajemnicy, haśle, a nawet protokole umowy klucza. Możesz mieć więcej niż jednego odbiorcę w wiadomości i możesz mieszać i dopasowywać typy odbiorców.

Możesz użyć CMSSignedDataGenerator, aby podobnie wysłać weryfikowalną wiadomość. Jeśli chcesz podpisać i zaszyfrować, struktury CMS są zagnieżdżone/złożone (ale kolejność może być ważne). Istnieje również CMSCompressedDataGenerator i ostatnio dodane CMSAuthenticatedData.

 2
Author: Peter Dettman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 21:46:54

Odkryłem, że ta próbka używa domyślnego 128-bitowego szyfrowania zamiast 256-bitowego. Trochę zmieniłem:

BlockCipher blockCipher = new AESEngine();

Teraz staje się:

BlockCipher blockCipher = new RijndaelEngine(256);

I współpracuje z moją aplikacją kliencką C++ szyfrowanie AES256

 1
Author: LPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 00:17:16

Możesz użyć:

byte[] process(bool encrypt, byte[] input, byte[] key)
{
    var cipher = CipherUtilities.GetCipher("Blowfish");
    cipher.Init(false, new KeyParameter(key));
    return cipher.DoFinal(input);
}

// Encrypt:
byte[] encrypted = process(true, clear, key);

// Decrypt:
byte[] decrypted = process(false, encrypted, key);

Zobacz: https://github.com/wernight/decrypt-toolbox/blob/master/dtDecrypt/Program.cs

 1
Author: Wernight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 08:20:17

JCE nie będzie działać dla mnie, ponieważ chcemy 256 bitowej siły i nie możemy zmienić konfiguracji Javy w systemie, aby na to pozwolić. Szkoda, że dmuchany zamek nie ma API tak wysokiego poziomu jak JCE.

" zauważ jednak, że bouncycastle składa się z dwóch bibliotek, lekkiej biblioteki kryptograficznej i biblioteki interfejsu dostawcy JCE. Ograniczenia keysize są egzekwowane przez warstwę JCE, ale nie trzeba jej używać. Jeśli używasz tylko lekkiego crypto API bezpośrednio, nie masz wszelkie ograniczenia, bez względu na to, jakie pliki zasad są lub nie są zainstalowane." http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 16:38:20

Książka Beginning Cryptography with Java zawiera bardzo pomocne przykłady i wyjaśnienia oparte na bibliotece bouncycastle

 0
Author: iffi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 13:46:32