0

我使用了用户在本网站上提供的示例代码。我需要加密密码并存储在文件中以备将来使用。当用户尝试使用系统时,我从文件中获取密码,解密并使用它进行进一步处理。所以我不能在每个加密/解密请求期间使用不同的密钥。所以我使用fixed byte[]来存储key,而不是调用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 失败(它与早期的密钥一起使用。所以我完全不明白为什么它只对某些数据不起作用?

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

4

1 回答 1

0

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

于 2012-06-18T07:15:47.210 回答