記錄一次AES復(fù)雜解密過程

對AES加密桑阶、解密這里不做介紹亿扁,不清楚的可以網(wǎng)上查詢相關(guān)介紹。
這里只記錄下AES解密過程夹囚,在有限的加密信息下仁卷,耗時兩天穴翩,嘗試出來的解密過程。解的懷疑人生锦积。

背景

為了數(shù)據(jù)的安全性芒帕,后端將數(shù)據(jù)進行了加密,前端需求解密得到正確的JSON丰介。

給到前端的信息

1背蟆、AES加密
2、后端加密的一個類文件(java)
3哮幢、秘鑰KEY

解密過程

解讀得到信息:
1带膀、解密模式:ECB (只有一個秘鑰KEY值)
2、填充方式:默認Pkcs7
3橙垢、后端加密采用了 AES垛叨、base64、SHA1柜某、字符串轉(zhuǎn)字節(jié)處理

思路:
1嗽元、先整理后臺的加密規(guī)則(看不明白后端代碼敛纲,只能調(diào)試一步,對比結(jié)果)
2剂癌、按加密的規(guī)則進行解密
3淤翔、借助第三方解密插件

解密規(guī)則

加密內(nèi)容處理
1.base64 解密 得到字符串
2.字符串轉(zhuǎn)成byte []類型的字節(jié) (注意:字節(jié)長度需要/2)
3.將字節(jié)轉(zhuǎn)成words對象
4、words對象轉(zhuǎn) base64的字符串

秘鑰key處理
1佩谷、字符串轉(zhuǎn)byte []類型的字節(jié)(注意:字節(jié)長度不需要/2)
2办铡、用sha1加密2次 字節(jié),并轉(zhuǎn)成數(shù)組格式
3琳要、截取前16位數(shù)組
4寡具、將字節(jié)轉(zhuǎn)成words對象(int8parse)

AES解密
模式:EBC
填充方式:PKcs7

數(shù)據(jù)轉(zhuǎn)字符串
字符串轉(zhuǎn)json對象

實現(xiàn)代碼

// 解密方法
const decrypt = (word) => {
  const base64 = decodeURIComponent(escape(window.atob(word)))
  const bytes = onHex(base64)
  console.log('base64', base64)
  console.log('bytes', bytes)
  const keyByte = stringToByte(key)
  console.log('keyByte', keyByte)
  // const bytes = CryptoJS.enc.Utf8.parse(base64)
  const keyByteSha1 = sha1.array(keyByte)
  console.log('keyByteSha1', keyByteSha1)
  const keyByteSha2 = sha1.array(keyByteSha1).slice(0, 16)
  console.log('keyByteSha2', keyByteSha2)
  const keyAes = aesKeyBytes(keyByteSha2)
  console.log('keyAes', keyAes)
  const wordArray = int8parse(bytes)
  console.log('wordArray', wordArray)
  const base64Str = CryptoJS.enc.Base64.stringify(wordArray)
  console.log('base64Str', base64Str)
  const decrypt = CryptoJS.AES.decrypt(base64Str, keyAes, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
  console.log('decrypt', decrypt)
  return JSON.parse(decrypt.toString(CryptoJS.enc.Utf8))
}

// 加解密用到的密鑰
function aesKeyBytes(a) {
  const key_Int = new Int8Array(a)
  const keyBytes = int8parse(key_Int)
  return keyBytes
}

// 構(gòu)建WordArray對象
function int8parse(u8arr) {
  const len = u8arr.length
  const words = []
  for (let i = 0; i < len; i++) {
    words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8)
  }
  return CryptoJS.lib.WordArray.create(words, len)
}

// 字符串轉(zhuǎn)字節(jié) 長度需要/2
function onHex(hex) {
  const buffer = new ArrayBuffer((hex.length) / 2)
  const byteStream = new Uint8Array(buffer)
  let i = 0

  while (hex.length >= 2) {
    const x = parseInt(hex.substring(0, 2), 16)

    hex = hex.substring(2, hex.length)

    byteStream[i++] = x
  }
  return byteStream
}

// 字符串轉(zhuǎn)字節(jié) 長度不需要/2
export function stringToByte(str) {
  const bytes = []
  let c
  const len = str.length
  for (let i = 0; i < len; i++) {
    c = str.charCodeAt(i)
    if (c >= 0x010000 && c <= 0x10FFFF) {
      bytes.push(((c >> 18) & 0x07) | 0xF0)
      bytes.push(((c >> 12) & 0x3F) | 0x80)
      bytes.push(((c >> 6) & 0x3F) | 0x80)
      bytes.push((c & 0x3F) | 0x80)
    } else if (c >= 0x000800 && c <= 0x00FFFF) {
      bytes.push(((c >> 12) & 0x0F) | 0xE0)
      bytes.push(((c >> 6) & 0x3F) | 0x80)
      bytes.push((c & 0x3F) | 0x80)
    } else if (c >= 0x000080 && c <= 0x0007FF) {
      bytes.push(((c >> 6) & 0x1F) | 0xC0)
      bytes.push((c & 0x3F) | 0x80)
    } else {
      bytes.push(c & 0xFF)
    }
  }
  return bytes
}

依賴:
crypto-js
js-sha1

解密過程結(jié)果

base64 
D8061382C771D2525CDAA715BEE1483CB5D19F4003E5352D5495404A0AF9644B2B162184C35FD11B0D254784CEDB3D75B4383AB7BF27321568C2B28DC7D8F3781DF24C021DFCD89053FB6C89990B37C16CD893A3DF38F48AA626944C76F33B970AD4981122306AF636105B5C78A7816480BE93A27541CE1EF048007BA8BCF9E1BC1B2B22DBC84216AF945F5681EE15349EEDE7E8324420BF03C9A002CB6FD3EF6170A5491024861CE7914A7EB31FBC3ED70E81535100D9074EF0951AE98232124600AEC31412D0C4ACD78A19502FE4AFA56FA8C85555DCD5C543F91516C407CB2931E33BF9FE7007764E8C6529C9AFD2D763AC912A4EA3ADBA79738F773DBA2BCB9DF69A6E3124F61110D3D88645DC023F0A030AD53BB8756F498FFA0301B1C65115A9F4FC41F762FA3EDB53DAA91E9075A5F04B2A933EF9422A908105888CCA93F9CE215C31835C76F93AAC0C3BA8539C96CC6B6432662A0FE93D9F2136E483C30CC133C647C505ACFE4D01FEFBA4E634D839EF3302AF91378DFF0D28381D4A186109E754AD6C790C63013159BC5CE7615AF16A0350AA947D1BC42BEC45D66AEC8CE8E2CA7ADA1B7B

bytes 
Uint8Array(432) [216, 6, 19, 130, 199, 113, 210, 82, 92, 218, 167, 21, 190, 225, 72, 60, 181, 209, 159, 64, 3, 229, 53, 45, 84, 149, 64, 74, 10, 249, 100, 75, 43, 22, 33, 132, 195, 95, 209, 27, 13, 37, 71, 132, 206, 219, 61, 117, 180, 56, 58, 183, 191, 39, 50, 21, 104, 194, 178, 141, 199, 216, 243, 120, 29, 242, 76, 2, 29, 252, 216, 144, 83, 251, 108, 137, 153, 11, 55, 193, 108, 216, 147, 163, 223, 56, 244, 138, 166, 38, 148, 76, 118, 243, 59, 151, 10, 212, 152, 17, …]
keyByte 
(36) [102, 49, 48, 97, 48, 97, 52, 49, 45, 55, 55, 99, 54, 45, 52, 98, 97, 54, 45, 52, 51, 50, 51, 45, 101, 51, 102, 98, 50, 48, 53, 97, 97, 99, 102, 97]
keyByteSha1 
(20) [153, 230, 38, 236, 52, 96, 86, 81, 14, 242, 159, 85, 99, 71, 149, 16, 12, 194, 88, 103]
keyByteSha2 
(16) [35, 102, 148, 128, 131, 179, 185, 148, 176, 189, 182, 110, 139, 192, 150, 104]
keyAes 
{$super: {…}, words: Array(4), sigBytes: 16, init: ?}

wordArray
{$super: {…}, words: Array(108), sigBytes: 432, init: ?}

base64Str 2AYTgsdx0lJc2qcVvuFIPLXRn0AD5TUtVJVASgr5ZEsrFiGEw1/RGw0lR4TO2z11tDg6t78nMhVowrKNx9jzeB3yTAId/NiQU/tsiZkLN8Fs2JOj3zj0iqYmlEx28zuXCtSYESIwavY2EFtceKeBZIC+k6J1Qc4e8EgAe6i8+eG8Gysi28hCFq+UX1aB7hU0nu3n6DJEIL8DyaACy2/T72FwpUkQJIYc55FKfrMfvD7XDoFTUQDZB07wlRrpgjISRgCuwxQS0MSs14oZUC/kr6VvqMhVVdzVxUP5FRbEB8spMeM7+f5wB3ZOjGUpya/S12OskSpOo626eXOPdz26K8ud9ppuMST2ERDT2IZF3AI/CgMK1Tu4dW9Jj/oDAbHGURWp9PxB92L6PttT2qkekHWl8Esqkz75QiqQgQWIjMqT+c4hXDGDXHb5OqwMO6hTnJbMa2QyZioP6T2fITbkg8MMwTPGR8UFrP5NAf77pOY02DnvMwKvkTeN/w0oOB1KGGEJ51StbHkMYwExWbxc52Fa8WoDUKqUfRvEK+xF1mrsj

decrypt 
WordArray.init {words: Array(108), sigBytes: 423}

ossData 
{accessid: 'LT5tK7vA32Gguxu5n6', policy: 'eyJleHBpcmF0aW9o0MzoxOC4yNT…wMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJjc20vIl1dfQ==', signature: 'sd2p/uQtVe1maCPkr4BxF9TU=', …}

后續(xù)在記錄一篇前后端項目統(tǒng)一加解密的處理流程,封裝SDK稚补,對外只提供接口

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末童叠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子课幕,更是在濱河造成了極大的恐慌厦坛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍惊,死亡現(xiàn)場離奇詭異杜秸,居然都是意外死亡,警方通過查閱死者的電腦和手機润绎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門撬碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莉撇,你說我怎么就攤上這事呢蛤。” “怎么了棍郎?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵其障,是天一觀的道長。 經(jīng)常有香客問我涂佃,道長励翼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任辜荠,我火速辦了婚禮汽抚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侨拦。我一直安慰自己殊橙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布狱从。 她就那樣靜靜地躺著膨蛮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季研。 梳的紋絲不亂的頭發(fā)上敞葛,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音与涡,去河邊找鬼惹谐。 笑死,一個胖子當(dāng)著我的面吹牛驼卖,可吹牛的內(nèi)容都是我干的氨肌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酌畜,長吁一口氣:“原來是場噩夢啊……” “哼怎囚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桥胞,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恳守,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贩虾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催烘,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年缎罢,在試婚紗的時候發(fā)現(xiàn)自己被綠了伊群。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡策精,死狀恐怖在岂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛮寂,我是刑警寧澤蔽午,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站酬蹋,受9級特大地震影響及老,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜范抓,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一骄恶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匕垫,春花似錦僧鲁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟叼。三九已至,卻和暖如春春寿,著一層夾襖步出監(jiān)牢的瞬間朗涩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工绑改, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谢床,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓厘线,卻偏偏與公主長得像识腿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子造壮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容