當(dāng)前位置:首頁 > 智能硬件 > 人工智能AI
[導(dǎo)讀]   3DES,也稱為3DESede或TripleDES,是三重?cái)?shù)據(jù)加密,且可以逆推的一種算法方案。1975年美國IBM公司成功研究并發(fā)布了DES加密算法,但DES密碼長度容易被暴力破解,通過對D

  3DES,也稱為3DESede或TripleDES,是三重?cái)?shù)據(jù)加密,且可以逆推的一種算法方案。1975年美國IBM公司成功研究并發(fā)布了DES加密算法,但DES密碼長度容易被暴力破解,通過對DES算法進(jìn)行改進(jìn),針對每個(gè)數(shù)據(jù)塊進(jìn)行三次DES加密,也就是3DES加密算法。但由于3DES的算法是公開的,所以算法本身沒什么秘密可言,主要依靠唯一密鑰來確保數(shù)據(jù)加密解密的安全。

  有人可能會問,那3DES到底安不安全呢?!目前為止,還沒有人能破解3DES,所以你要是能破解它,都足以震驚整個(gè)信息安全界了。

 3DES加密算法簡析

  3DES加密算法并非什么新的加密算法,而是DES算法的另一種模式。是現(xiàn)在比較常用的一種對稱加密算法,比起DES來說安全性更高。該算法的加解密過程分別是對明文/密文數(shù)據(jù)進(jìn)行三次DES加密或解密,得到相應(yīng)的密文或明文。假設(shè)EK()和DK()分別表示DES的加密和解密函數(shù),P表示明文,C表示密文,那么加解密的公式如下:

  加密:C = EK3( DK2( EK1(P) ) ) 即對明文數(shù)據(jù)進(jìn)行,加密 --》 解密 --》 加密的過程,最后得到密文數(shù)據(jù)

  解密:P = DK1( EK2( DK3(C) ) ) 即對密文數(shù)據(jù)進(jìn)行,解密 --》 加密 --》 解密的過程,最后得到明文數(shù)據(jù)

  其中:K1表示3DES中第一個(gè)8字節(jié)密鑰,K2表示第二個(gè)8字節(jié)密鑰,K3表示第三個(gè)8字節(jié)密鑰,通常情況下,3DES的密鑰為雙倍長密鑰(若不知道雙倍長,可參考博主的密鑰分算算法文章中的解釋),即K1對應(yīng)KL(左8字節(jié)),K2對應(yīng)KR(右8字節(jié)),K3對應(yīng)KL(左8字節(jié))。

  由于DES加解密算法是每8個(gè)字節(jié)作為一個(gè)加解密數(shù)據(jù)塊,因此在實(shí)現(xiàn)該算法時(shí),需要對數(shù)據(jù)進(jìn)行分塊和補(bǔ)位(即最后不足8字節(jié)時(shí),要補(bǔ)足8字節(jié))。Java本身提供的API中NoPadding,Zeros填充和PKCS5Padding。假設(shè)我們要對9個(gè)字節(jié)長度的數(shù)據(jù)進(jìn)行加密,則其對應(yīng)的填充說明如下:

  ZerosPadding

  無數(shù)據(jù)的字節(jié)全部被填充為0

  第一塊:F0 F1 F2 F3 F4 F5 F6 F7

  第二塊:F8 0 0 0 0 0 0 0

  PKCS5Padding

  每個(gè)被填充的字節(jié)都記錄了被填充的長度

  第一塊:F0 F1 F2 F3 F4 F5 F6 F7

  第二塊:F8 07 07 07 07 07 07 07

  DES的具體算法過程很復(fù)雜,實(shí)話說我也不懂,我只能借用Android和iOS里面自帶的API去實(shí)現(xiàn)3DES的過程,其具體代碼如下:

  Android代碼

 ?。踦lain] view plain copypublic byte[] triDesEncrypt(byte[] desKey, byte[] desData, int flag) {//flag == 1為加密,flag == 0為解密

  byte[] keyFirst8 = new byte[8];

  byte[] keySecond8 = new byte[8];

  if (desKey.length 》 8) {

  for (int i = 0; i 《 8; i++) {

  keyFirst8[i] = desKey[i];

  }

  } else {

  return null;

  }

  if (desKey.length 《 16) {

  for (int i = 0; i 《 desKey.length - 8; i++) {

  keySecond8[i] = desKey[i + 8];

  }

  } else {

  for (int i = 0; i 《 8; i++) {

  keySecond8[i] = desKey[i + 8];

  }

  }

  byte[] tmpKey = new byte[8];

  byte[] tmpData = new byte[8];

  arrayCopy(keyFirst8, 0, tmpKey, 0, 8);

  arrayCopy(desData, 0, tmpData, 0, 8);

  int mode = flag;

  byte[] result = unitDes(tmpKey, tmpData, mode);

  arrayCopy(keySecond8, 0, tmpKey, 0, 8);

  arrayCopy(result, 0, tmpData, 0, 8);

  mode = (mode == 1) ? 0 : 1;

  result = unitDes(tmpKey, tmpData, mode);

  arrayCopy(keyFirst8, 0, tmpKey, 0, 8);

  arrayCopy(result, 0, tmpData, 0, 8);

  mode = (mode == 1) ? 0 : 1;

  result = unitDes(tmpKey, tmpData, mode);

  return result;

  }

  iOS代碼

 ?。踦lain] view plain copy+ (NSData *)encryptWithDataKey:(NSData *)src key1:(NSData *)key1 key2:(NSData *)key2 key3:(NSData *)key3

  {

  if (src == nil || [src length] == 0 ||

  key1 == nil || [key1 length] == 0 ||

  key2 == nil || [key2 length] == 0 ||

  key3 == nil || [key3 length] == 0) {

  return nil;

  }

  const void *vplainText;

  size_t plainTextBufferSize;

  plainTextBufferSize = [src length];

  vplainText = [src bytes];

  CCCryptorStatus ccStatus;

  uint8_t *bufferPtr = NULL;

  size_t bufferPtrSize = 0;

  size_t movedBytes = 0;

  bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);

  bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));

  memset((void *)bufferPtr, 0x00, bufferPtrSize);

  NSMutableData *key = [NSMutableData data];

 ?。踜ey appendData:key1];

 ?。踜ey appendData:key2];

 ?。踜ey appendData:key3];

  NSString *initVec = @“01234567”;

  const void *vKey = [key bytes];

  const void *vinitVec = (const void *)[initVec UTF8String];

  uint8_t iv[kCCBlockSize3DES];

  memset((void *)iv, 0x00, (size_t)sizeof(iv));

  ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES, kCCOpTIonPKCS7Padding | kCCOpTIonECBMode, vKey, kCCKeySize3DES, vinitVec, vplainText, plainTextBufferSize, (void *)bufferPtr, bufferPtrSize, &movedBytes);

  if (ccStatus != kCCSuccess) {

  free(bufferPtr);

  return nil;

  }

  NSData *result = [NSData dataWithBytes:bufferPtr length:movedBytes];

  free(bufferPtr);

  return result;

  }

  + (NSData *)decryptWithDataKey:(NSData *)src key1:(NSData *)key1 key2:(NSData *)key2 key3:(NSData *)key3

  {

  if (src == nil || [src length] == 0 ||

  key1 == nil || [key1 length] == 0 ||

  key2 == nil || [key2 length] == 0 ||

  key3 == nil || [key3 length] == 0) {

  return nil;

  }

  const void *vplainText;

  size_t plainTextBufferSize;

  plainTextBufferSize = [src length];

  vplainText = [src bytes];

  CCCryptorStatus ccStatus;

  uint8_t *bufferPtr = NULL;

  size_t bufferPtrSize = 0;

  size_t movedBytes = 0;

  bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);

  bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));

  memset((void *)bufferPtr, 0x00, bufferPtrSize);

  NSMutableData *key = [NSMutableData data];

 ?。踜ey appendData:key1];

  [key appendData:key2];

 ?。踜ey appendData:key3];

  NSString *initVec = @“01234567”;

  const void *vkey = [key bytes];

  const void *vinitVec = (const void *)[initVec UTF8String];

  uint8_t iv[kCCBlockSize3DES];

  memset((void *)iv, 0x00, (size_t)sizeof(iv));

  ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithm3DES, kCCOpTIonPKCS7Padding | kCCOpTIonECBMode, vkey, kCCKeySize3DES, vinitVec, vplainText, plainTextBufferSize, (void *)bufferPtr, bufferPtrSize, &movedBytes);

  if (ccStatus != kCCSuccess) {

  free(bufferPtr);

  return nil;

  }

  NSData *result = [NSData dataWithBytes:bufferPtr length:movedBytes];

  free(bufferPtr);

  return result;

  }  

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉