在我的Android应用程序中,我想使用DESede/CBC/PKCS5Padding加密密码,我的解决方案来自Lollipop(5.x),Android KitKat(4.4。 X)和Android果冻豆(版本4.3.x)使用PBKDF2WithHmacSHA1和DESede/CBC/PKCS5Padding for Android 4.2及更早版本
private static final String KEY = "a2[..]";
private static final String SALT = "t[..]";
private static final String IV = "u[..]";
private static final String DES_EDE_PKCS5 = "DESede/CBC/PKCS5Padding"
public static String encrypt(String password) {
byte[] byteSalt = Base64.decode(SALT, Base64.DEFAULT);
byte[] bytesIv = Base64.decode(IV, Base64.DEFAULT);
String mdp = "";
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(KEY.toCharArray(), byteSalt, NB_ITER_RFC, SIZE_KEY);
SecretKey secretKey = factory.generateSecret(spec);
Cipher c = Cipher.getInstance(DES_EDE_PKCS5);
IvParameterSpec ivParam = new IvParameterSpec(bytesIv);
c.init(Cipher.ENCRYPT_MODE, secretKey, ivParam);
byte[] encrypted = c.doFinal(password.getBytes("UTF-8"));
mdp = Base64.encodeToString(encrypted, Base64.DEFAULT);
}
catch [..]
return mdp;
}
但它是行不通以下版本(4.2.x版及以下),这种加密的密码似乎对于为例随意改变:
D/andro-Chiffrement-encrypt(10739): password chiffré = P7vWc+7hFuUaWQghVeO+zA==
D/andro-Chiffrement-encrypt(10739): password chiffré = jGr6nlvnYLd/AK/d7nkUrA==
D/andro-Chiffrement-encrypt(10739): password chiffré = I2weyEddIav7EulAiuQDbg==
D/andro-Chiffrement-encrypt(10739): password chiffré = HF7OFpUXYuwOm81WekReDg==
特别是如何解决Android 4.2.x的这个问题?
我发现有了图书馆Bouncy Castle,但我没有找到如何实现'IV'(Generator Vector)。你有好主意吗 ?
PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator();
gen.init(PBEParametersGenerator.PKCS12PasswordToBytes(passCharArray), byteSalt, NB_ITER_RFC);
KeyParameter params = (KeyParameter) gen.generateDerivedParameters(SIZE_KEY);
String password2 = Base64.encodeToString(params.getKey(), Base64.DEFAULT);
谢谢你的帮助。最后,我的解决方案适用于Android 4.3.x,但不适用于Android 4.2.x及更低版本。我纠正了我的帖子。这个解决方案对我不起作用,这真的很奇怪......: - / – bzhWarrior 2015-02-06 10:32:26