1

我是一个完全的密码学新手,正在寻找一个简单的(哈!)AESEncryption实用程序类,我可以使用它来读取/写入文件和带有 AES 密钥的字符串。就像是:

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实例化 a时,KeySpec都会生成 a (并且可以由 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几乎一无所知,以下是我收集的内容:

  • JCE 是 AES 算法在 Java 平台上执行所必需的
  • JCE 以 ZIP 格式下载,但实际上只包含两个 JAR

我将这 2 个 JAR (US_export_policylocal_policy) 放在项目的构建路径 (Eclipse) 上并重新运行代码。又是同样的问题。我知道链接的文章引用了建议在 JRE 中包含这些 JAR 的安装说明,但在运行时,我的应用程序应该只关心在类路径中找到 JAR - 它不应该关心类路径中找到它们的位置!

我可以从 Elcipse 内部做些什么来确保 JCE 可用于我的运行时类路径吗?或者我是否偏离了基础并且我的代码中有导致这些错误的错误?

4

2 回答 2

2

我很确定这些 jar 在运行时类路径中毫无意义。它们必须安装在 jre 安装目录中。

于 2012-05-21T18:41:33.263 回答
2

您可以简单地使用 128 位 AES 密钥。它们在 99% 的时间里都足够安全。要么使用 256 位密钥,要么按照自述文件中的说明安装无限强度的加密文件。如果您可以简单地将它们放在类路径中,那么每个人都会简单地将内容复制到他们自己的库中并跳过整个保护。它们不包含可运行的代码,只包含资源。

于 2012-05-21T18:55:29.727 回答