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

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

AES 算法在我的數(shù)據(jù)字符串中間返回垃圾字符

AES 算法在我的數(shù)據(jù)字符串中間返回垃圾字符

人到中年有點(diǎn)甜 2022-01-06 17:45:59
我取一個(gè)數(shù)據(jù)字符串 = "AkhilRanjanBiharabcdefghijklmnopMovedtoChennai18",先加密然后解密。我解密后得到的字符串是“AkhilRanjanBiharù?+???à–y?ó@Movedto?hennai18”,這對(duì)于前 16 個(gè)和最后 16 個(gè)字符幾乎沒(méi)問(wèn)題,但中間的 16 個(gè)字符絕對(duì)是垃圾。什么可能會(huì)出錯(cuò)?我的加密代碼:-public String encrypt(String value) {    log.info("This method is not going to be used");    String key = "theabcd@heymaths";    initVector = "{{{{{{{{{{{{{{{{";    String encryptedStr="";    byte[] encrBytes =null;    try {        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes());        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);        encrBytes = cipher.doFinal(value.getBytes());        encryptedStr = new String(encrBytes);    } catch (Exception ex) {        ex.printStackTrace();    }    String strToBeEncoded = encryptedStr +"::"+initVector;    encrBytes = strToBeEncoded.getBytes();    //String encoded = Base64.encodeBase64String(encrBytes);    String encoded = Base64.getEncoder().encodeToString(encrBytes);    String urlEncoded = null;    try {        urlEncoded = java.net.URLEncoder.encode(encoded, CHARSET);    } catch (UnsupportedEncodingException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    return urlEncoded;}解密代碼:-public String decrypt(String encrypted) {    String decryptedStr = null;    byte[] base64Bytes = null;    String urlDecoded = null;    String key = HmCommonProperty.getProperty("abcd_crypt_key");    if(key == null || key.isEmpty()) {        key = securityKey;    }    String encryptionMech = HmCommonProperty.getProperty("abcd_crypt_algo");    if(encryptionMech == null || encryptionMech.isEmpty()) {        encryptionMech = CRYPT_MECHANISM;    }    return decryptedStr;}
查看完整描述

2 回答

?
胡說(shuō)叔叔

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

您的加密數(shù)據(jù)是一個(gè)字節(jié)序列。如果需要將其編碼為字符串,則應(yīng)使用 base64 或用于編碼任意字節(jié)數(shù)組的類(lèi)似編碼。假裝您的任意字節(jié)數(shù)組是有效的字符串編碼會(huì)給您帶來(lái)麻煩,即使您使用ISO_8859_1.



查看完整回答
反對(duì) 回復(fù) 2022-01-06
?
largeQ

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

你的錯(cuò)誤在這里:


encryptedStr = new String(encrBytes);

strToBeEncoded.getBytes();

這些方法使用平臺(tái)默認(rèn)字符集,并且當(dāng)您從byte[]toString和 back轉(zhuǎn)換時(shí),在一般情況下byte[]是有損的。如果平臺(tái)默認(rèn)字符集是"ISO_8859_1".


我將所有 11 個(gè)這樣的調(diào)用更改為:


encryptedStr = new String(encrBytes, StandardCharsets.ISO_8859_1);

strToBeEncoded.getBytes(StandardCharsets.ISO_8859_1);

(我沒(méi)有改變CHARSET)。我現(xiàn)在得到的輸出是:


initVector 長(zhǎng)度 -> 16

輸入長(zhǎng)度 -> 48

AkhilRanjanBiharabcdefghijklmnopMovedtoChennai18


獎(jiǎng)勵(lì)警告 1:加密使用硬編碼,"AES/CBC/NoPadding"但解密是動(dòng)態(tài)的(當(dāng)然也應(yīng)該使用"AES/CBC/NoPadding")。


獎(jiǎng)勵(lì)警告2:機(jī)會(huì)是低,但它是完全可能的,"::"里面出現(xiàn)encrBytes,搞砸了你的str.split("::");。一種解決方案是搜索最后一次出現(xiàn)的"::"并且僅在其上進(jìn)行拆分。


查看完整回答
反對(duì) 回復(fù) 2022-01-06
  • 2 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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