feat: Simplify AES key encryption and decryption process in MessageCrypto by removing unnecessary conversions and enhancing logging
This commit is contained in:
@@ -139,14 +139,24 @@ object CryptoManager {
|
||||
|
||||
/**
|
||||
* Encrypt data with password using PBKDF2 + AES
|
||||
*
|
||||
* ⚠️ ВАЖНО: Совместимость с JS (crypto-js) и React Native (cryptoJSI.ts):
|
||||
* - PBKDF2WithHmacSHA1 (не SHA256!) - crypto-js использует SHA1 по умолчанию
|
||||
* - Salt: "rosetta"
|
||||
* - Iterations: 1000
|
||||
* - Key size: 256 bit
|
||||
* - AES-256-CBC с PKCS5/PKCS7 padding
|
||||
* - Compression: zlib deflate (pako.deflate в JS)
|
||||
* - Формат: base64(iv):base64(ciphertext)
|
||||
*/
|
||||
fun encryptWithPassword(data: String, password: String): String {
|
||||
// Compress data
|
||||
val compressed = compress(data.toByteArray())
|
||||
// Compress data (zlib deflate - совместимо с pako.deflate в JS)
|
||||
val compressed = compress(data.toByteArray(Charsets.UTF_8))
|
||||
|
||||
// Derive key using PBKDF2
|
||||
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
|
||||
val spec = PBEKeySpec(password.toCharArray(), SALT.toByteArray(), PBKDF2_ITERATIONS, KEY_SIZE)
|
||||
// Derive key using PBKDF2-HMAC-SHA1 (⚠️ SHA1, не SHA256!)
|
||||
// crypto-js по умолчанию использует SHA1 для PBKDF2
|
||||
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
|
||||
val spec = PBEKeySpec(password.toCharArray(), SALT.toByteArray(Charsets.UTF_8), PBKDF2_ITERATIONS, KEY_SIZE)
|
||||
val secretKey = factory.generateSecret(spec)
|
||||
val key = SecretKeySpec(secretKey.encoded, "AES")
|
||||
|
||||
@@ -169,6 +179,15 @@ object CryptoManager {
|
||||
|
||||
/**
|
||||
* Decrypt data with password
|
||||
*
|
||||
* ⚠️ ВАЖНО: Совместимость с JS (crypto-js) и React Native (cryptoJSI.ts):
|
||||
* - PBKDF2WithHmacSHA1 (не SHA256!) - crypto-js использует SHA1 по умолчанию
|
||||
* - Salt: "rosetta"
|
||||
* - Iterations: 1000
|
||||
* - Key size: 256 bit
|
||||
* - AES-256-CBC с PKCS5/PKCS7 padding
|
||||
* - Decompression: zlib inflate (pako.inflate в JS)
|
||||
* - Формат: base64(iv):base64(ciphertext)
|
||||
*/
|
||||
fun decryptWithPassword(encryptedData: String, password: String): String? {
|
||||
return try {
|
||||
@@ -178,20 +197,21 @@ object CryptoManager {
|
||||
val iv = Base64.decode(parts[0], Base64.NO_WRAP)
|
||||
val ciphertext = Base64.decode(parts[1], Base64.NO_WRAP)
|
||||
|
||||
// Derive key using PBKDF2
|
||||
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
|
||||
val spec = PBEKeySpec(password.toCharArray(), SALT.toByteArray(), PBKDF2_ITERATIONS, KEY_SIZE)
|
||||
// Derive key using PBKDF2-HMAC-SHA1 (⚠️ SHA1, не SHA256!)
|
||||
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
|
||||
val spec = PBEKeySpec(password.toCharArray(), SALT.toByteArray(Charsets.UTF_8), PBKDF2_ITERATIONS, KEY_SIZE)
|
||||
val secretKey = factory.generateSecret(spec)
|
||||
val key = SecretKeySpec(secretKey.encoded, "AES")
|
||||
|
||||
// Decrypt
|
||||
// Decrypt with AES-256-CBC
|
||||
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
|
||||
cipher.init(Cipher.DECRYPT_MODE, key, IvParameterSpec(iv))
|
||||
val decrypted = cipher.doFinal(ciphertext)
|
||||
|
||||
// Decompress
|
||||
String(decompress(decrypted))
|
||||
// Decompress (zlib inflate - совместимо с pako.inflate в JS)
|
||||
String(decompress(decrypted), Charsets.UTF_8)
|
||||
} catch (e: Exception) {
|
||||
android.util.Log.e("CryptoManager", "decryptWithPassword failed: ${e.message}")
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user