我是密码学的新手,并希望拥有一个简单的(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。几乎不了解JCE,这是我收集到的信息:


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


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

我可以从Elcipse内做些什么来确保JCE对我的运行时类路径可用?还是我脱离基础并在代码中存在导致这些错误的错误?

最佳答案

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

10-06 07:19