我正在搜索一种已知的加密算法,该算法可以让我使用密钥加密数据,如果使用其他密钥解密数据,则会为我提供与第一项不同的数据。这是字符串数据。我尝试过AES,但问题是使用错误密钥解密的结果会产生大量无效符号,因此生成的字符串与使用良好密钥给出的结果不同。
有解决方法吗?
到目前为止我这样做了:
private static final String truc = "f41a3ff27aab7d5c";
public static String encryptPass(String pass,String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidAlgorithmParameterException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(key.getBytes("UTF-8"));
byte[] digest = md.digest();
BCrypt bcrypt = new BCrypt();
SecretKey keyL = new SecretKeySpec(digest, "AES");
Cipher AesCipher = Cipher.getInstance("AES/CTR/NoPadding");
AesCipher.init(Cipher.ENCRYPT_MODE, keyL, new IvParameterSpec(truc.getBytes()));
byte[] encVal = AesCipher.doFinal(pass.getBytes());
pass = Base64.encodeToString(encVal, Base64.DEFAULT);
Log.i("ADA", "encoded pass: " + pass);
return pass;
}
public static String decryptPass(String encPass , String key) throws NoSuchAlgorithmException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(key.getBytes("UTF-8"));
byte[] digest = md.digest();
SecretKey keyL = new SecretKeySpec(digest, "AES");
Cipher AesCipher = Cipher.getInstance("AES/CTR/NoPadding");
AesCipher.init(Cipher.DECRYPT_MODE, keyL, new IvParameterSpec(truc.getBytes()));
byte[] decodedValue = Base64.decode(encPass, Base64.DEFAULT);
byte[] decValue = AesCipher.doFinal(decodedValue);
String decryptedValue = new String(decValue);
Log.i("ADA", "decrpyted pass: " + decryptedValue);
return decryptedValue;
}
阅读the answer of MaybeWeCouldStartAVar后,最后一段我使用了“AES / CTR / NoPadding”。
当我说一个结构良好的字符串时,我期待的主要是ASCII字符32到125.
那里有什么东西可以满足我的需求,或者我应该只使用我自己的加密算法(我听说不建议但是如果这是我唯一的选择......)
我不是要限制对任何数据的访问。任何使用该应用程序的人都可以完全看到数据,但除非他们拥有正确的密钥,否则他们应该看到错误的数据(显然看起来并不错误)。 这个想法是为了抑制蛮力。