Java密码学扩展和无限的力量

时间:2012-05-21 18:37:33

标签: java security cryptography aes

我是一个完整的加密新手,并且希望有一个简单的(ha!)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实例化时,都会生成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上看到this问题,提问者有同样的问题,我发现我可能错过了JCE。知道 next 一无所知JCE,这是我收集的内容:

  • AES算法在Java平台上执行需要JCE
  • JCE下载为ZIP,但实际上只包含两个JAR

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

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

2 个答案:

答案 0 :(得分:2)

我很确定这些jar在运行时类路径中没有意义。他们安装在jre安装目录中。

答案 1 :(得分:2)

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