我是密码学的新手,并希望拥有一个简单的(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_policy
和local_policy
)放在项目的构建路径(Eclipse)上,然后重新运行代码。同样是同样的问题。我知道链接的文章引用了建议的安装说明,建议将这些JAR包括在JRE中,但是在运行时,我的应用程序应该只关心在类路径上查找JAR,而不关心它在类路径上的找到位置!我可以从Elcipse内做些什么来确保JCE对我的运行时类路径可用?还是我脱离基础并在代码中存在导致这些错误的错误?
最佳答案
您可以简单地使用128位AES密钥。他们在99%的时间内都足够安全。或者使用256位密钥并按照自述文件中的说明安装强度不限的加密文件。如果您可以将它们简单地放在类路径中,那么每个人都将简单地将内容复制到他们自己的库中,并跳过整个保护过程。它们不包含可运行的代码,仅包含资源。