为什么解密仅对某些数据失败

时间:2012-06-11 13:26:02

标签: java aes

我使用了本网站提供的示例代码。我需要加密密码并存储在文件中以备将来使用。当用户尝试使用系统时,我从文件中获取密码,解密并使用它进行进一步处理。所以我不能在每个加密/解密请求期间使用不同的密钥。所以我使用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(使用了早期的密钥。所以我完全无法理解为什么它不适用于某些数据?

有人可以帮助我,我在哪里做错了吗?

1 个答案:

答案 0 :(得分:0)

我使用Base64Encoder解决了这个问题。基本上加密的数据可能有一些字符无法存储在普通的txt文件中,因此解密将失败。所以我使用Base64Encoder来编码加密的字符串。这个编码字符是普通的ascii字符,可以很容易地存储在txt文件中。需要反向来获取原始数据,即首先解码,然后解密存储在文件中的字符串。