AES / CBC / PKCS5Padding加密android4.4和预版本之间的不同结果

时间:2016-01-30 13:06:50

标签: java android encryption

我使用aes-cbc-pkcs5padding来编码密码,下面的代码适用于android4.4或更高版本,但在android4.2中,它每次都会返回不同的结果。谁能教我如何解决这个问题?谢谢。

public  String encryptPass(){

    String username="stackoverflow";
    String password="stackoverflow";
    String salt="stackoverflow145";

    /* generate secretkey */
    PBEKeySpec keySpec=new PBEKeySpec(username.toCharArray(),salt.getBytes(),1000,256);
    SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    SecretKey key=keyFactory.generateSecret(keySpec);

    /* IV bytes 16 length */
    byte[] iv={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
    IvParameterSpec ivSpec=new IvParameterSpec(iv);

    Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE,key,ivSpec);
    byte[] passBytes=cipher.doFinal(password.getBytes());
    String result=Base64.encodeToString(passBytes,Base64.NO_WRAP);
    return result;
}

我尝试添加代码:cipher.getProvier.getName()进行测试,然后我发现在android4.4或更高版本中,它显示" AndroidOpenSSL&#34 ;;低于4.4,它是" BC"。这个问题有关系吗?有人能帮助我吗?感谢。

1 个答案:

答案 0 :(得分:0)

最后,我将secretKey转换为secretKeySpec,它适用于所有Android版本。代码如下:

/* generate secretkey */
PBEKeySpec keySpec=new PBEKeySpec(username.toCharArray(),salt.getBytes(),1000,256);
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKey tmp=keyFactory.generateSecret(keySpec);

/*transform key to keySpec*/
SecretKey key=new SecretKeySpec(tmp.getEncoded(),"AES");
可能有人告诉我为什么?我测试改变算法" AES"与" DES",但最后结果没有改变。那就是我们的。