【发布时间】:2021-04-10 10:43:11
【问题描述】:
我想将明文加密和解密为 AES 算法。我得到了密钥,iv 来自 API。我尝试了很多东西,但没有奏效。怎么了?
https://github.com/simbiose/Encryption
https://github.com/scottyab/AESCrypt-Android
public class CryptoHandler {
private static CryptoHandler instance = null;
public static CryptoHandler getInstance() {
if (instance == null) {
instance = new CryptoHandler();
}
return instance;
}
public String encrypt(String message, String key, String IV) throws NoSuchAlgorithmException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException, InvalidKeyException,
UnsupportedEncodingException, InvalidAlgorithmParameterException {
byte[] srcBuff = message.getBytes("UTF8");
//here using substring because AES takes only 16 or 24 or 32 byte of key
SecretKeySpec skeySpec = new
SecretKeySpec(key.substring(0,32).getBytes(), "AES");
IvParameterSpec ivSpec = new
IvParameterSpec(IV.substring(0,16).getBytes());
Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
ecipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
byte[] dstBuff = ecipher.doFinal(srcBuff);
String base64 = Base64.encodeToString(dstBuff, Base64.DEFAULT);
return base64;
}
public String decrypt(String encrypted, String key, String IV) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, UnsupportedEncodingException {
SecretKeySpec skeySpec = new
SecretKeySpec(key.substring(0,32).getBytes(), "AES");
IvParameterSpec ivSpec = new
IvParameterSpec(IV.substring(0,16).getBytes());
Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
ecipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] raw = Base64.decode(encrypted.getBytes(), 0, 16, Base64.DEFAULT);
byte[] originalBytes = ecipher.doFinal(raw);
String original = new String(originalBytes, "UTF8");
return original;
}
}
示例 API 响应数据:
{
"key": "QaDtfPpeMW0VgMMd4XF88K6KkIPe5ZG0sitpyhuJf/E=",
"iv": "ccp2YePjewVL9X+vCms5BQ==",
"string": "5c2c82a6-66da-41f9-b20d-5d4ffd0c505a",
}
【问题讨论】:
-
API 使用什么加密方法,采用什么编码?
-
它带有用于 key 和 iv 的 base64 代码。它采用密钥和 IV 大小的 AES256。加解密采用PKCS7填充类型的ECB/CBC块加密。
-
嗯,ECB 和 CBC 是不同的操作模式,哪一种?一旦缺少IV,就可以区分ECB和CBC。 AES 的标准 IV 大小始终为 128 位——即块大小。
-
我不知道。我有一个文档,它正在写你应该使用来自 API 的密钥和 iv 来加密字符串,使用密钥和 iv 使用 AES 算法。
-
那个键和 IV 看起来是 base 64 编码的,我没有看到你解码任何东西。您可能必须实际学习这些东西,而不仅仅是尝试。
标签: android android-studio aes