日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

 3DES加密算法簡析

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

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

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

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

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

  ZerosPadding

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

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

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

  PKCS5Padding

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

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

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

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

  Android代碼

  [plain] 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代碼

  [plain] 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];

  [key 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];

  [key 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)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

環(huán)形振蕩器作為電子系統(tǒng)中常用的時鐘信號生成器件,憑借結(jié)構(gòu)簡單、集成度高、成本低廉的優(yōu)勢,廣泛應(yīng)用于數(shù)字電路、通信設(shè)備、傳感器等領(lǐng)域。其核心原理是通過奇數(shù)級反相器首尾相連形成正反饋環(huán)路,利用反相器的傳輸延遲產(chǎn)生持續(xù)振蕩,但...

關(guān)鍵字: 環(huán)形振蕩器 時鐘信號 反相器

在IC芯片的應(yīng)用與設(shè)計中,極限溫度是一個高頻出現(xiàn)卻易被誤解的關(guān)鍵參數(shù)。無論是消費電子的芯片選型,還是工業(yè)、汽車領(lǐng)域的熱設(shè)計,工程師們都需頻繁查閱芯片 datasheet 中的溫度指標(biāo),卻常常陷入“極限溫度是絕對閾值”的認(rèn)...

關(guān)鍵字: 極限溫度 芯片 閾值

在線性穩(wěn)壓電路設(shè)計中,穩(wěn)壓管作為核心基準(zhǔn)元件,其工作穩(wěn)定性直接決定電路輸出精度與可靠性。不少工程師在實操中會在穩(wěn)壓管兩端并聯(lián)電容,此舉究竟是提升性能的合理優(yōu)化,還是可能引發(fā)隱患的錯誤操作,一直存在爭議。事實上,穩(wěn)壓管并聯(lián)...

關(guān)鍵字: 穩(wěn)壓電路 穩(wěn)壓管 電容

在工業(yè)控制、電源監(jiān)測、傳感器信號處理等場景中,電壓比較器是核心模擬器件之一,負(fù)責(zé)將模擬輸入信號與參考電壓進行對比,輸出高低電平信號供后級數(shù)字電路處理。LM2901作為一款四通道低功耗電壓比較器,憑借寬電源范圍、低輸入偏置...

關(guān)鍵字: 電壓比較器 數(shù)字電路 邏輯電平

在工業(yè)自動化、智能家電、環(huán)境監(jiān)測等領(lǐng)域,液位檢測是保障設(shè)備正常運行、實現(xiàn)精準(zhǔn)控制的核心環(huán)節(jié)。傳統(tǒng)液位測量方式多存在安裝復(fù)雜、抗干擾能力弱、適用場景有限等弊端,而基于單端對地式電容測量原理的單端液位模組,憑借結(jié)構(gòu)簡潔、精度...

關(guān)鍵字: 電容測量 液位 電極

隨著汽車制造業(yè)向智能化、精密化、綠色化轉(zhuǎn)型,傳感器作為核心感知元件,成為推動生產(chǎn)效率提升與產(chǎn)品質(zhì)量升級的關(guān)鍵支撐。超聲波傳感器憑借不受光線、顏色影響、環(huán)境適應(yīng)性強、檢測精度高且成本可控的優(yōu)勢,基于超聲波(頻率高于20kH...

關(guān)鍵字: 傳感器 感知元件 超聲波

在無線通信技術(shù)飛速發(fā)展的當(dāng)下,無線接收電路的性能直接決定了信息傳輸?shù)馁|(zhì)量與效率,而選頻電路作為其核心組成部分,承擔(dān)著從復(fù)雜頻譜中篩選目標(biāo)信號、濾除干擾的關(guān)鍵職責(zé)。晶振作為電子電路中常見的頻率控制元件,憑借其高精度、高穩(wěn)定...

關(guān)鍵字: 無線通信 選頻電路 晶振

在現(xiàn)代電子測量與控制系統(tǒng)中,傳感器作為感知外界物理量并轉(zhuǎn)化為電信號的核心部件,其輸出信號往往存在天然短板——幅值微弱、分辨率不足且電流驅(qū)動能力有限,難以直接滿足后續(xù)模數(shù)轉(zhuǎn)換(ADC)、負(fù)載驅(qū)動等環(huán)節(jié)的需求。運算放大器(簡...

關(guān)鍵字: 傳感器 電流驅(qū)動 運算放大器

在數(shù)字化浪潮席卷全球的今天,“智聯(lián)世界”已從概念走向現(xiàn)實,而車聯(lián)網(wǎng)作為萬物互聯(lián)的核心載體,正以技術(shù)革新打破出行邊界,重塑產(chǎn)業(yè)生態(tài),開啟汽車與數(shù)字世界深度融合的全新紀(jì)元。車聯(lián)網(wǎng)(V2X)以車輛為核心節(jié)點,實現(xiàn)車與車、車與路...

關(guān)鍵字: 車聯(lián)網(wǎng) 通信 智聯(lián)

在消費電子、數(shù)據(jù)中心、新能源等領(lǐng)域飛速發(fā)展的今天,充電器與適配器的設(shè)計正面臨著“高效化、小型化、集成化”的三重挑戰(zhàn)。傳統(tǒng)硅基轉(zhuǎn)換器受限于材料物理特性,難以在功率輸出與體積控制之間實現(xiàn)平衡,而高能效氮化鎵(GaN)轉(zhuǎn)換器的...

關(guān)鍵字: 充電器 適配器 轉(zhuǎn)換器
關(guān)閉