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

當前位置:首頁 > 智能硬件 > 人工智能AI
[導讀]   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加密或解密,得到相應的密文或明文。假設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對應KL(左8字節(jié)),K2對應KR(右8字節(jié)),K3對應KL(左8字節(jié))。

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

  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的具體算法過程很復雜,實話說我也不懂,我只能借用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代碼

 ?。踦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];

  [key appendData:key1];

 ?。踜ey appendData:key2];

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

 ?。踜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(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;

  }  

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉