我使用了本网站提供的示例代码。我需要加密密码并存储在文件中以备将来使用。当用户尝试使用系统时,我从文件中获取密码,解密并使用它进行进一步处理。所以我不能在每个加密/解密请求期间使用不同的密钥。所以我使用fixed byte []存储密钥而不是调用KeyGenerator.generateKey()。以下是完整的代码。
public class App
{
static byte[] seckey=null;
static
{
try
{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
// Generate the secret key specs.
// SecretKey skey = kgen.generateKey();
// seckey = skey.getEncoded();
// above won't work as can't generate new secret key for decrypt. Have to use same key for encrypt and decrypt
// seckey = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
seckey = new byte[]{(byte)172,(byte)236,(byte)125,(byte)222,(byte)188,(byte)33,(byte)210,(byte)4,(byte)202,(byte)31,(byte)188,(byte)152,(byte)220,(byte)104,(byte)62,(byte)64};
} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
}
public static void main( String[] args )
{
String password = encrypt("A123456"); //working
System.out.println(password);
System.out.println(decrypt(password));
String password = encrypt("A*501717"); //NOT working
System.out.println(password);
System.out.println(decrypt(password));
}
public static String encrypt(String passwd)
{
SecretKeySpec key = new SecretKeySpec(seckey, "AES");
byte[] output;
try
{
Cipher cipher = Cipher.getInstance("AES");
// encryption pass
cipher.init(Cipher.ENCRYPT_MODE, key);
output = cipher.doFinal(passwd.getBytes());
} catch (Exception e)
{
System.out.println("Unable to encrypt password.");
output = "".getBytes();
}
return new String(output);
}
public static String decrypt(String passwd)
{
if (!StringUtils.isNotBlank(passwd))
return "";
SecretKeySpec key = new SecretKeySpec(seckey, "AES");
byte[] output;
try
{
Cipher cipher = Cipher.getInstance("AES");
// decryption pass
cipher.init(Cipher.DECRYPT_MODE, key);
output = cipher.doFinal(passwd.getBytes());
} catch (Exception e)
{
System.out.println("Unable to decrypt password");
output = "".getBytes();
}
return new String(output);
}
}
问题是,它适用于大多数时间,但对于某些字符序列,它可以解密。例如目前不适用于A123456。然后我将密钥改为
seckey = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
之后它适用于A123456,但随后失败了A * 3qwe(使用了早期的密钥。所以我完全无法理解为什么它不适用于某些数据?
有人可以帮助我,我在哪里做错了吗?
答案 0 :(得分:0)
我使用Base64Encoder解决了这个问题。基本上加密的数据可能有一些字符无法存储在普通的txt文件中,因此解密将失败。所以我使用Base64Encoder来编码加密的字符串。这个编码字符是普通的ascii字符,可以很容易地存储在txt文件中。需要反向来获取原始数据,即首先解码,然后解密存储在文件中的字符串。