第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Android 字符串加密/解密

Android 字符串加密/解密

UYOU 2022-12-28 14:21:47
我想String從EditTextusing加密和解密 a AndroidKeyStore。我的問題是在解密過程中得到一個(gè)BadPaddingException.密鑰生成器代碼:        KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");        KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT).                setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE).build();        keyGenerator.init(keyGenParameterSpec);        keyGenerator.generateKey();加密代碼:            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");            keyStore.load(null);            KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(ALIAS, null);            SecretKey secretKey = secretKeyEntry.getSecretKey();            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");            cipher.init(Cipher.ENCRYPT_MODE, secretKey);            cipherIV = cipher.getIV();            plainText.setText(new String(cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));解密代碼:            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");            keyStore.load(null);            final KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(ALIAS, null);            final SecretKey secretKey = secretKeyEntry.getSecretKey();            final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");            final GCMParameterSpec spec = new GCMParameterSpec(128, cipherIV);            cipher.init(Cipher.DECRYPT_MODE, secretKey, spec);            byte[] decrypted = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));            plainText.setText(new String(decrypted, StandardCharsets.UTF_8));
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

這一行是錯(cuò)誤的:

plainText.setText(new String(cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));

如果我們把它分開,我們有類似的東西

byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));
plainText.setText(new String(cipherBytes, StandardCharsets.UTF_8);

問題是這cipherBytes是一個(gè)任意字節(jié)序列而不是字符串的字符。String 構(gòu)造函數(shù)會悄悄地用其他東西替換無效字符,這是一個(gè)破壞數(shù)據(jù)的過程。

如果要顯示密碼字節(jié)或以其他方式將其發(fā)送到面向字符的通道,則必須對其進(jìn)行編碼。通常編碼是 base64 或十六進(jìn)制。要解密字符串,您必須先將其解碼為字節(jié),然后再解密。

例子:

byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));
plainText.setText(Base64.encodeToString(cipherBytes, Base64.DEFAULT));

并解密:

byte[] cipherBytes = Base64.decode(plainText.getText().toString(), Base64.DEFAULT);
byte[] decrypted = cipher.doFinal(cipherBytes);


查看完整回答
反對 回復(fù) 2022-12-28
?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊

byte[] decrypted = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));

由于 的調(diào)用,此行可能無法正常工作getBytes(StandardCharsets.UTF_8)。如果您EditText是十六進(jìn)制表示,請嘗試將其轉(zhuǎn)換為字符串,然后調(diào)用getBytes(). 例如


public static byte[] convertHexStringToByteArray(String hexString) {


    int l = hexString.length();

    byte[] data = new byte[l/2];

    for (int i = 0; i < l; i += 2) {

        data[i/2] = (byte)((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i+1), 16));

    }


    return data;

}


查看完整回答
反對 回復(fù) 2022-12-28
  • 2 回答
  • 0 關(guān)注
  • 228 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號