JavaでRijndael開発を行う必要があります。
私たちを助ける記事、図書館などに関する推奨事項はありますか?
キーストアのメンテナンスへのポインタと、キーを安全に保存する方法はありますか?
編集:
オープンソースである必要があります。基本的に、これはRijndaelを使用したデータの標準的な暗号化/復号化です。
Javaには、すぐに使用できるAESが含まれています。 RijndaelはAESです。外部ライブラリは必要ありません。次のようなものが必要です。
byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
暗号化/復号化については以上です。大量のデータを処理している場合は、16バイトの倍数であるチャンクを読み取り、doFinalの代わりにupdateを呼び出すことをお勧めします(最後のブロックでdoFinalを呼び出すだけです)。
素晴らしい無料のライブラリについては、私は強くお勧めします BouncyCastle。 積極的に維持され、高品質で、コード例の素晴らしい配列があります。参考資料として、一般的なものにもっと頼る必要があります JCE docs。
FIPS認定要件を満たすためにどのライブラリを使用しているかはわかりません。しかし、CryptoJに代わる、はるかに安価なものがあります。
一般に、Rijndaelのような対称暗号で暗号化するメッセージごとに新しいキーを生成してから、RSAのような非対称アルゴリズムでそのキーを暗号化することをお勧めします。これらの秘密鍵は、PKCS#12やJavaの「JKS」などのパスワードで保護されたソフトウェアベースの鍵ストアに保存できます。セキュリティを強化するために、「スマートカード」ハードウェアトークンやその他の暗号化ハードウェアモジュールに保存できます。
私の会社が最近発見したように、AESは完全にRijndaelではありません。 AESには、キーが128、192、または256ビットでなければならないという制限がありますが、Rijndaelでは160および224のキーも使用できます。
上記のericksonで示されているように、BouncyCastleは、追加のキー長(128/160/192/224/256ビット)をサポートするRijndaelオブジェクトを提供します。具体的には、軽量APIを見てください。
Gnu-cryptoは別のオープンソースライブラリですが、160ビットキーと224ビットキーもサポートしていません。
したがって、Rijndaelの完全なサポートを特に探しているのであれば、これまでに見つけたのはBouncyCastleだけです。
javax.cryptoはAESをサポートしています: http://Java.Sun.com/developer/technicalArticles/Security/AES/AES_v1.html
安全な鍵保管に関しては、通常の方法は、暗号化ハッシュ関数を使用してユーザー入力(パスフレーズ)から暗号化鍵を導出し、導出された鍵を使用してキーチェーンを暗号化することです。または、キーが1つだけ必要な場合は、派生キー自体を使用できます。
システムのセキュリティは、使用されるハッシュ関数の強度に直接関係していることを常に念頭に置いてください。暗号化された安全なハッシュ関数を、可能であればソルトとともに使用し、複数回(たとえば、数百回)ハッシュします。
そうは言っても、質問は非常にあいまいです。