Rumah >Java >javaTutorial >Bagaimanakah Saya Mengelakkan Isu Penukaran Apabila Menyulitkan Data Antara Tatasusunan Byte dan Rentetan?

Bagaimanakah Saya Mengelakkan Isu Penukaran Apabila Menyulitkan Data Antara Tatasusunan Byte dan Rentetan?

Barbara Streisand
Barbara Streisandasal
2024-11-19 09:15:03303semak imbas

How Do I Avoid Conversion Issues When Encrypting Data Between Byte Arrays and Strings?

Mengatasi Isu Penukaran Antara Tatasusunan Byte dan Rentetan dalam Penyulitan

Dalam konteks penyulitan, menukar tatasusunan bait kepada rentetan dan belakang boleh menimbulkan cabaran, selalunya mengakibatkan nilai yang tidak sepadan dan ralat penyahsulitan. Berikut ialah penerokaan isu ini dan penyelesaian terperinci.

Pertimbangkan senario penyulitan berikut:

public class NewEncrypter {

    // Encryption and decryption are performed on byte arrays, not strings
    public byte[] encrypt(String input) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(input.getBytes("UTF-16"));
    }

    public String decrypt(byte[] encryptionBytes) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(encryptionBytes), "UTF-16");
    }
}

Walau bagaimanapun, menyimpan data yang disulitkan sebagai rentetan adalah tidak digalakkan kerana tujuan penggunaannya untuk dibaca manusia teks, bukan data binari sewenang-wenangnya. Jika ia tidak dapat dielakkan, menggunakan pengekodan dengan pemetaan 1-ke-1 antara bait dan aksara adalah penting.

Pengekodan ISO-8859-1

Untuk senario khusus ini , pengekodan ISO-8859-1 disyorkan:

    String decoded = new String(encryptedByteArray, "ISO-8859-1");
    byte[] encoded = decoded.getBytes("ISO-8859-1");

Mengelakkan Perangkap Pengekodan Biasa

Pengekodan UTF-16 boleh menyebabkan masalah kerana:

  • String.getBytes("UTF-16") menambah aksara penanda pesanan bait.
  • Bukan semua jujukan bait boleh dipetakan kepada aksara UTF-16 (cth., jujukan 4-bait dengan pemetaan aksara tidak sah ).

Pengekodan Alternatif

Jika ISO-8859-1 tidak memenuhi keperluan anda, pertimbangkan untuk menggunakan pengekodan heksadesimal atau base64. Walau bagaimanapun, ini memerlukan perpustakaan pembantu tambahan kerana ia tidak ditakrifkan dalam API standard.

Dengan mematuhi garis panduan ini dan menggunakan pengekodan yang sesuai, anda boleh menyelesaikan percanggahan antara tatasusunan bait dan rentetan dalam proses penyulitan anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Mengelakkan Isu Penukaran Apabila Menyulitkan Data Antara Tatasusunan Byte dan Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn