2009-05-19 1 views
24

したがって、CodingHorror's fun with encryptionと悲しいコメントの後、私たちは独自の暗号化を再考しています。BouncyCastleの使用を開始するにはどうすればよいですか?

この場合、ユーザーを識別する情報をサードパーティのサービスに渡す必要があります。サードパーティのサービスは、その情報とハッシュを加えたWebサイトのサービスにコールバックします。

2番目のサービスは、そのユーザーの情報を検索し、それを第三者サービスに戻します。

このユーザー情報を第三者サービスに暗号化し、そのユーザー情報が暗号化された後に復号化したいと考えています。したがって、これは長命の暗号化ではありません。

コーディングホラーの記事では、Coda Haleは特定のニーズに固有の暗号化を行うためにBouncyCastleと高レベルの抽象化をライブラリに推奨しました。

私の問題は、BouncyCastleネームスペースが大きく、ドキュメントが存在しないことです。誰かがこの高水準抽象ライブラリに私を指摘できますか? (またはBouncyCastle以外の別のオプション?)

+5

は、独自の暗号化のlibを書いて再考?良い選択! – Cheeso

+0

BouncyCastleにはたくさんのドキュメントはありませんが、私のメーリングリストは非常に有益です。http://www.bouncycastle.org/csharpdevmailarchive/index.htmlまた、購読して質問することもできます。 ほとんどの使用例をカバーするサンプルとテストに付属するソースも入手してください。 – Emmanuel

+0

あなたがOAuthの典型的なユースケースのように聞こえるのは、それを使用することを考えましたか? –

答えて

10

高度な抽象化?私は、Bouncy Castleのライブラリ内の最高レベルの抽象化が含まれるとします

私はほとんどのJavaバージョンのライブラリに精通しています。おそらく、このコードスニペットは、あなたの目的のために十分に高い抽象化を提供します(例では、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; 
    } 
} 

編集:おっと、私はちょうどあなたがにリンク先の記事を読んで。彼は私が思っていたよりも高いレベルの抽象概念について話しているようです(例えば、「秘密のメッセージを送る」)。私は彼が何を得ているのか分かりません。

+0

記事をチェックしていただきありがとうございます...暗号化の用途が多く、誤用もありますより大きい。 –

+0

努力のために+1が、実際には私が使用できる答えはありません。 –

+0

Adam Paynterも私の質問を見ています。 chcacha20を使ってテキストを暗号化したいだけです。 http://stackoverflow.com/questions/38050559/illegalargumentexception-chacha20-requires-128-bit-or-256-bit-key – Nepster

3

Javaでアプリケーションを記述すると仮定すると、特定のプロバイダを使用するのではなく、SunのJCE(Java Cryptography Extension)の上にアプリケーションを開発することをお勧めします。そうすることで、基盤となるプロバイダから独立させることができます。つまり、広く実装されている暗号を使用する限り、プロバイダを簡単に切り替えることができます。実装の詳細をすべて知っている必要はなく、間違ったクラスを使用することから少しでも保護することができます(たとえば、適切なパディングなしで生の暗号化を使用するなど)。さらに、Sunは、まあまあの量のドキュメンテーションとコードサンプル。

0

JCEは256ビットの強さを必要とし、システムのJava構成を変更することができないため、私のためには機能しません。 Bouncy Castleには、JCEほどの高レベルのAPIはありません。

"Bouncycastleは、軽量暗号ライブラリとJCEプロバイダインターフェイスライブラリという2つのライブラリで構成されていますが、JCEレイ​​ヤによって強制されますが、このレイヤを使用する必要はありません。あなただけの軽量な暗号化APIを使用する場合は、直接あなたは関係なく、ポリシーファイルがあるか、インストールされていないものを、任意の制限がありません。」 http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography

+0

私はむしろ、高水準のインターフェイスを使用する可能性よりも256ビットの要件を落としたいと思います。プロバイダを簡単に切り替える可能性。私はバウンシーキャスルの図書館のファンではありません。なぜなら、それは私の味のための欠陥が多すぎるからです。したがって、私が開発中にバウンシーキャスルを使用するとしても、私のコードが生産に入ると、それをより良いものに切り替えることができたいと思っています。汎用性は、暗号化アプリケーションを設計する際の重要な側面です。プロバイダまたは暗号プリミティブのセットをロックダウンすると、多くのことが損なわれる可能性があります。 – Accipitridae

1

私は実際にこのサンプルがデフォルト128ビット暗号化の代わりに、256ビットを使用していることを見つけた私は少し変更を加えました:。

BlockCipher blockCipher = new AESEngine(); 

は今、次のようになります。

BlockCipher blockCipher = new RijndaelEngine(256); 

、それははBouncyCastleで高い(ER)レベルAPIの

2

一例は、CMS(Cryptographic Message Syntax)パッケージになり、私のクライアントアプリケーションC++ AES256暗号化と一緒に動作します。これはプロバイダ自体とは別のjar(bcmail)に格納され、JCEに書き込まれます(ただし、C#のバージョンは軽量APIに対して記述されています)。

CMSEnvelopedDataGeneratorクラスによって、おおまかに言えば、「秘密のメッセージを送信する」というメッセージが表示され、暗号化アルゴリズム(内部で処理されるすべての詳細)が選択され、受信者がメッセージを読むことができるより多くの方法:公開鍵/証明書、共有秘密、パスワード、または鍵合意プロトコルに基づくことができます。メッセージに複数の受信者を含めることができ、受信者の種類を組み合わせて一致させることができます。

CMSSignedDataGeneratorを使用して、同様に検証可能なメッセージを送信できます。署名して暗号化する場合、CMS構造はネスト可能/構成可能です(ただし、順序は重要です)。 CMSCompressedDataGeneratorもあり、最近CMSAuthenticatedDataが追加されました。

あなたが使用すること
1

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); 

参照してください:https://github.com/wernight/decrypt-toolbox/blob/master/dtDecrypt/Program.cs

関連する問題