我正在尝试创建一个简单的加密和解密类。两种方法都给出相同的字符串。我有点困惑。请帮忙。
这是我的代码段:
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 );
}
}
答案 0 :(得分:0)
您的代码有几个错误,但距离工作不远。以下是问题:
您应该将RANDOM_GENERATOR_ALGORITHM
传递给SecretKeySpec
构造函数,而不是CIPHER_ALGORITHM
。
您需要为加密和解密指定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值。
其他一些评论:
您的方法应为static
,因为它们不使用任何实例字段。
您不应该使用密码的原始字节作为密钥。相反,您应该使用like PBKDF2。
如果您想查看一些正确执行此操作的代码,请参阅JNCryptor。这是一个兼容Android的Java库,可以进行基于密码的加密和解密。特别是,请查看来源: