1

私は完全な暗号化の初心者でありAESEncryption、AES キーを使用してファイルと文字列の読み取り/書き込みに使用できる単純な (ha!) ユーティリティ クラスを探していました。何かのようなもの:

String toEcnrypt = "This is a secret message!";
AESEcnryption aes = new AESEncryption(); // 256-bit by default
String encrypted = aes.encrypt(toEncrypt);

// Do some stuff

String shouldBeSameAsFirstString = aes.decrypt(encrypted);

AESEncryptionがインスタンス化されるたびにKeySpecが生成されるという考え方です (そして、その後のストレージのために API によって返される可能性があります)。これは、私よりもはるかに優秀な人々のコードを調べた結果、私が作り上げたものです(ここにあなたのコードが表示されている場合は、ありがとう!):

public class AESEncryption {

private SecretKeySpec keySpec;

public AESEncryption()
{
    super();
    setKeySpec(AES256Encryption.generateAES256KeySpec());
}

// Uses 256-bit encryption by default.
public static SecretKeySpec generateAES256KeySpec()
{
    // Stack variables
    byte[] byteArray = new byte[16];
    SecretKey oTmpKey = null;
    KeyGenerator oKeyGen;
    try
    {
        oKeyGen = KeyGenerator.getInstance("AES");
        oKeyGen.init(256);
        oTmpKey = oKeyGen.generateKey();
    }
    catch(Throwable oThrown)
    {
        throw new RuntimeException(oThrown);
    }

    byteArray = oTmpKey.getEncoded();

    return new SecretKeySpec(byteArray, "AES");
}

public String encrypt(final String p_strPlaintext)
{
    String strEncrypted = null;

    try
    {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        strEncrypted = Base64.encodeBase64String(cipher
            .doFinal(p_strPlaintext.getBytes()));
    }
    catch(Throwable oThrown)
    {
        System.out.println(oThrown.getMessage());
        throw new RuntimeException(oThrown);
    }

    return strEncrypted;
}

}

Base64 En/Decoding には Commons Codec を使用しています - なぜですか? 私が言ったように、私は仮想通貨の初心者であり、それが仕事を成し遂げるように見える唯一のことだったからです!

このコードを使用すると:

// This creates a unique key spec for this instance.
AESEncryption aes = new AESEncryption();

String toEncrypt = "blah";

// Throws a Throwable and prints the following to the console:
// "Illegal key size or default parameters"
String encrypted = aes.encrypt(toEncrypt);

質問者が同じ問題を抱えていたSOでこの質問を見ましたが、JCEが不足している可能性があることがわかりました。JCEについてほとんど何も知らないので、私が集めたものは次のとおりです。

  • Java プラットフォームで AES アルゴリズムを実行するには、JCE が必要です。
  • JCE は ZIP としてダウンロードされますが、実際には 2 つの JAR しか含まれていません

これら 2 つの JAR (US_export_policyおよびlocal_policy) をプロジェクトのビルド パス (Eclipse) に配置し、コードを再実行しました。再び同じ問題。リンクされた記事は、これらの JAR を JRE に含めることを推奨するインストール手順を参照していることを知っていますが、実行時には、私のアプリはクラスパス上の JAR を見つけることだけを気にする必要があります

実行時のクラスパスで JCE を使用できるようにするために、Elcipse 内からできることはありますか? または、ベースから外れていて、これらのエラーの原因となっているコードにバグがありますか?

4

2 に答える 2

2

単純に 128 ビットの AES キーを使用できます。それらは 99% の確率で十分に安全です。それか、256 ビット キーを使用し、readme に示されているように、無制限の強度の暗号ファイルをインストールします。それらをクラスパスに単純に入れることができれば、誰もがコンテンツを自分のライブラリにコピーして、保護全体をスキップするだけです。それらには実行可能なコードは含まれず、リソースのみが含まれます。

于 2012-05-21T18:55:29.727 に答える
2

これらの jar はランタイム クラスパスでは無意味であると確信しています。これら、jre インストール ディレクトリにインストールする必要があります。

于 2012-05-21T18:41:33.263 に答える