创建简单的AES加密和解密

时间:2013-04-21 10:15:39

标签: java android security aes

我正在尝试创建一个简单的加密和解密类。两种方法都给出相同的字符串。我有点困惑。请帮忙。

这是我的代码段:

public class UltimateEncryptor {

  private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
  private static final String RANDOM_GENERATOR_ALGORITHM = "AES";


  // Encrypts string and encodes in Base64
  public String encrypt( String password, String data ) throws Exception 
  {
    byte[] secretKey = password.getBytes();
    byte[] clear = data.getBytes();

    SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
    Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
    cipher.init( Cipher.ENCRYPT_MODE, secretKeySpec );

    byte[] encrypted = cipher.doFinal( clear );
    String encryptedString = Base64.encodeToString( encrypted, Base64.DEFAULT );

    return encryptedString;
  }

  // Decrypts string encoded in Base64
  public String decrypt( String password, String encryptedData ) throws Exception 
  {
    byte[] secretKey = password.getBytes();
    SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
    Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
    cipher.init( Cipher.DECRYPT_MODE, secretKeySpec );

    byte[] encrypted = Base64.decode( encryptedData, Base64.DEFAULT );
    byte[] decrypted = cipher.doFinal( encrypted );

    return new String( decrypted );
  }
}

1 个答案:

答案 0 :(得分:0)

您的代码有几个错误,但距离工作不远。以下是问题:

  1. 您应该将RANDOM_GENERATOR_ALGORITHM传递给SecretKeySpec构造函数,而不是CIPHER_ALGORITHM

  2. 您需要为加密和解密指定IV。如果没有指定IV,解密将不起作用,因为加密将使用随机IV,并且您的解密方法将不知道该值是什么。

    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, 
        new IvParameterSpec(/* 16 byte value */));
    
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, 
        new IvParameterSpec(/* same 16 byte value */));
    

    请注意,您必须使用密文存储IV,因此可以将其用于解密。执行此操作的常用方法是使用IV为密文值添加前缀(注意:IV不是敏感值)。每次加密时都应该使用随机IV值。

  3. 其他一些评论:

    1. 您的方法应为static,因为它们不使用任何实例字段。

    2. 您不应该使用密码的原始字节作为密钥。相反,您应该使用like PBKDF2

    3. 来从密码中获取密钥

      如果您想查看一些正确执行此操作的代码,请参阅JNCryptor。这是一个兼容Android的Java库,可以进行基于密码的加密和解密。特别是,请查看来源: