cuốn sách gpt4 ai đã làm

Android密码加密/解密

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 12:59:23 31 4
mua khóa gpt4 Nike

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.

câu trả lời hay nhấ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;
}

Về mã hóa/giải mã mật khẩu Android, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/14022934/

31 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress