我是一个完全的密码学新手,正在寻找一个简单的(哈!)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_policy
和local_policy
) 放在项目的构建路径 (Eclipse) 上并重新运行代码。又是同样的问题。我知道链接的文章引用了建议在 JRE 中包含这些 JAR 的安装说明,但在运行时,我的应用程序应该只关心在类路径中找到 JAR - 它不应该关心在类路径中找到它们的位置!
我可以从 Elcipse 内部做些什么来确保 JCE 可用于我的运行时类路径吗?或者我是否偏离了基础并且我的代码中有导致这些错误的错误?