Tôi đang sử dụng mật khẩu để mã hóa và giải mã tin nhắn:
Mã hóa chuỗi công khai (Chuỗi chuỗi) ném InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] stringBytes = string.getBytes("UTF-8");
byte[] mã hóaBytes = cipher.doFinal(stringBytes);
trả về android.util.Base64.encodeToString(encryptedBytes, android.util.Base64.DEFAULT);
}
Giải mã chuỗi công khai (Chuỗi chuỗi) ném InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] stringBytes = android.util.Base64.decode(string.getBytes(), android.util.Base64.DEFAULT);
byte[] decryptedBytes = cipher.doFinal(stringBytes);
trả về Chuỗi mới (decryptedBytes,"UTF-8");
}
Vì một lý do nào đó, mặc dù tôi sử dụng Base64 để mã hóa và giải mã chuỗi nhưng tôi vẫn gặp lỗi này:
javax.crypto.IllegalBlockSizeException: khối cuối cùng chưa hoàn thành trong quá trình giải mã
我做错了什么?
biên tập:
Đây là JSONObject của tôi - Tôi đang cố giải mã "m":
{"m://Cu7FR2be0E6ZP2BrZaLU2ZWQSfycNg0-fPibphTIZno\r\n"}
Điều lạ là lỗi này chỉ xuất hiện ở Android. Máy chủ của tôi được viết bằng Java và tôi đang sử dụng bộ mã hóa Apache Base64, bộ mã hóa này hoạt động rất tốt.
Tôi nghĩ mã của bạn ổn, bạn có thể thử thêm "UTF-8" trước khi giải mã.
byte[] stringBytes = android.util.Base64.decode(string.getBytes("UTF-8"), android.util.Base64.DEFAULT);
biên tập
Đây là lớp tiện ích bảo mật mẫu sử dụng BouncyCaSTLe và mã hóa AES dựa trên mật khẩu để mã hóa/giải mã.
lớp công khai SecurityUtils {
Chuỗi cuối cùng tĩnh công khai KEY_DERIVATION_ALGORITHM = "PBKDF2WithHmacSHA1";
Chuỗi cuối cùng tĩnh riêng CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
Chuỗi cuối cùng tĩnh riêng DELIMITER = "]";
int tĩnh cuối cùng riêng tư KEY_LENGTH = 256;
int tĩnh cuối cùng ITERATION_COUNT = 1000;
cuối cùng tĩnh riêng tư SALT_LENGTH = 8;
riêng tư SecureRandom ngẫu nhiên = new SecureRandom();
tĩnh {
Security.addProvider(org.spongycastle.jce.provider.BouncyCastleProvider() mới);
}
Mã hóa chuỗi tĩnh công khai (Ngữ cảnh, văn bản gốc chuỗi)
ném ngoại lệ {
byte[] salt = generateSalt();
trả về mã hóa (văn bản gốc, getKey(salt, getPassword(context)), salt);
}
Mã hóa chuỗi tĩnh riêng tư (Văn bản gốc chuỗi, khóa SecretKey, muối byte [])
ném ngoại lệ {
thử {
Mật mã = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
byte[] iv = generateIv(cipher.getBlockSize());
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] cipherText = cipher.doFinal(plaintext.getBytes("UTF-8"));
nếu (muối != null) {
trả về String.format("%s%s%s%s%s",
Chuỗi mới(Base64.encode(salt)), DELIMITER, Chuỗi mới(
Base64.encode(iv)), DELIMITER, Chuỗi mới(
Base64.encode(cipherText)));
}
return String.format("%s%s%s", Chuỗi mới(Base64.encode(iv)),
DELIMITER, Chuỗi mới(Base64.encode(cipherText)));
} bắt (Ném được e) {
ném ngoại lệ mới("Lỗi khi mã hóa", e);
}
}
Giải mã chuỗi tĩnh công khai (Ngữ cảnh, văn bản mã hóa chuỗi)
ném ngoại lệ {
return decrypt(ciphertext, getPassword(context));
}
Giải mã chuỗi tĩnh riêng tư (Văn bản mã hóa chuỗi, Mật khẩu chuỗi)
ném ngoại lệ {
Các trường chuỗi[] = ciphertext.split(DELIMITER);
if (fields.length != 3) {
ném IllegalArgumentException mới ("Định dạng văn bản được mã hóa không hợp lệ");
}
thử {
byte[] salt = Base64.decode(fields[0]);
byte[] iv = Base64.decode(fields[1]);
byte[] cipherBytes = Base64.decode(fields[2]);
Khóa SecretKey = getKey(muối, mật khẩu);
Mật mã = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivParams);
byte[] văn bản gốc = cipher.doFinal(cipherBytes);
Chuỗi plainrStr = Chuỗi mới (văn bản thuần túy, "UTF-8");
return plainrStr;
} bắt (Ném được e) {
ném ngoại lệ mới("Lỗi khi giải mã", e);
}
}
Chuỗi tĩnh riêng getPassword(Ngữ cảnh bối cảnh) {
trả về "Mật khẩu bí mật của tôi";
}
riêng tư SecretKey getKey(byte[] salt, String mật khẩu)
ném ngoại lệ {
thử {
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
ITERATION_COUNT, KEY_LENGTH);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(
KEY_DERIVATION_ALGORITHM, "BC");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
trả về SecretKeySpec mới(keyBytes, "AES");
} bắt (Ném được e) {
ném ngoại lệ mới ("Lỗi khi tạo khóa", e);
}
}
byte tĩnh riêng tư[] generateIv(int length) {
byte[] b = byte mới[độ dài];
ngẫu nhiên.nextBytes(b);
return b;
}
byte tĩnh riêng tư[] generateSalt() {
byte[] b = byte mới[SALT_LENGTH];
ngẫu nhiên.nextBytes(b);
return b;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!