導航:首頁 > 源碼編譯 > 3desc演算法

3desc演算法

發布時間:2023-08-08 14:10:12

1. 3des加密原理

使用3Des加密演算法前,我們需要了解一下當前主流的加密模式:單向加密和雙向加密,兩者最大的區別在於加密的密文是否具有可逆性。

單向加密:將需要加密的數據進行加密,並且密文不可進行解密,像我們常用的加密演算法MD5就屬於這種。

雙向加密:和單向加密不同的是可以通過某些方式進行加解密的操作,其中分為對稱加密和非對稱加密。

對稱加密:指數據使用者必須擁有相同的密鑰才可以進行加密解密,就像彼此約定的一串暗號,本文介紹的3Des加密就屬於這種。

非對稱加密:通過一組包含公鑰和私鑰的密碼來加密解密,用公鑰加密,私鑰解密,首推的就是RSA加密

---------------------------------------------------------------------------------------------------------------------------------------

3Des加密演算法,由於可以逆推原文,所以主要通過本地的唯一密鑰來保證數據的安全性,我這邊通過生成隨機的256位加密字元串存儲在本地,代碼讀取時將其通過md5加密成32位的字元串(由於本地有原始密鑰,不必擔心md5加密不可逆),最後以這32位加密字元串作為密鑰進行加解密的操作。

2. 3des加密演算法是標準的嗎

3DES又稱Triple DES,是DES加密演算法的一種模式,它使用3條56位的密鑰對
3DES
數據進行三次加密。數據加密標准(DES)是美國的一種由來已久的加密標准,它使用對稱密鑰加密法,並於1981年被ANSI組織規范為ANSI X.3.92。DES使用56位密鑰和密碼塊的方法,而在密碼塊的方法中,文本被分成64位大小的文本塊然後再進行加密。比起最初的DES,3DES更為安全。
3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,P代表明文,C代表密文,這樣:
3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1(EK2(Dk3(C)))

3. CPU卡密鑰管理系統的相關演算法

在本系統,加密演算法主要採用非常成熟的、強度比較高的DES演算法。為了進一步提高系統安全強度,在實際系統中,採用的是以DES演算法為基礎的3DES演算法。關演算法簡介如下。 3DES演算法用兩個密鑰(KL和KR)對明文(X)進行3次DES加密/解密[2]。
3DES的加密方式:Y=DES(KL,DES-1(KR,DES(KL,X)))
對應的解密方式為:X=DES-1(KL,DES(KR,DES-1(KL,Y)))
其中DES(K,X)表示用密鑰K對數據X進行DES加密,DES-1(K,Y)表示用密鑰K對數據Y進行解密(以下同)。 為了支持分級加密傳遞功能,CPU卡還採用了密鑰分散演算法,它是指將一個雙長度(16位元組)的密鑰MK,對分散數據進行處理,推
導出一個雙長度的密鑰DK(DKLDKR)。其演算法如下[3]:
推導DK左半部分DKL的方法是:
·將分散數據的最右16個數字作為輸入數據;
·將MK作為加密密鑰;
·用MK對輸入數據進行3DEA運算。
推導DK右半部分DKR的方法:
·將分散數據的最右16個數字求反,作為輸入數據;
·將MK作為加密密鑰;
·用MK對輸入數據進行3DEA運算。 第一步,輸入種子A和種子B:由兩個獨立的人各輸入一個16位數(或少於16位),分別作為SeedA和SeedB;
第二步,計算種子C:SeedC=SeedA◎SeedB;
第三步,密鑰種子的初始化:
·KEYINIT=常量
·Seed=DES-1(DES(DES-1(KEYINIT,SeedC),SeedB),SeedA)
·設K3=Seed
第四步,密鑰種子的生成:
·K0=DES-1(DES(DES-1(K3,SeedC),SeedB),SeedA)K3
·K1=DES-1(DES(DES-1(K0,SeedC),SeedB),SeedA)
·K2=DES-1(DES(DES-1(K1,SeedC),SeedB),SeedA)
·K3=DES-1(DES(DES-1(K2,SeedC),SeedB),SeedA)
第五卡,密鑰種子的檢驗:
·K4=K0+K2不是弱DES密鑰;
·K5=K1+K3不是北DES密鑰;
·K4不等於K5;
第六卡,主密鑰生成:
·A=K0K1
·B=K2K3
·MK=A+B,MK即為生成的原始密鑰
重復執行從第四步以第六步,直到所有的原始密鑰全部生成。
本系統採用了成熟、安全性高的加密演算法和完美的體系結構,其安全性是由CPU的安全性和DES演算法的完全強度來保證的。經過國內某單位兩年多的實際運行,證明本系統較好地貫徹了「秘密在於密鑰」的思想,具有較高的完全性和先進性,主要表現為如下幾個特點:
(1)採用完全性高的CPU卡作為密鑰的產生、存儲和傳遞介質,保證了密鑰數據的安全性;CPU卡獨特的安全體系保證了其中的數據不會被非法操作;
(2)利用硬體加密技術,對整個過程中所使用的臨時變數進行加密處理,並對傳遞過程進行線路加密,保證了在生成和傳遞過程的安全性;
(3)分級傳遞結構,使系統具有一定的擴展性,既支持獨立系統,也可用於分布式系統;
(4)系統具有自癒合功能,對關鍵數據進行備份,保證了系統具有一定的抗毀能力;
(5)系統結構簡單、實現方便、性價比較高。

4. 什麼是3DES對稱加密演算法

DES加密經過下面的步驟
1、提供明文和密鑰,將明文按照64bit分塊(對應8個位元組),不足8個位元組的可以進行填充(填充方式多種),密鑰必須為8個位元組共64bit
填充方式:

當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些數據使其湊滿一個分組長度。
* NoPadding
API或演算法本身不對數據進行處理,加密數據由加密雙方約定填補演算法。例如若對字元串數據進行加解密,可以補充\0或者空格,然後trim

* PKCS5Padding
加密前:數據位元組長度對8取余,余數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後一個位元組,值為m,則從數據尾部刪除m個位元組,剩餘數據即為加密前的原文。
例如:加密字元串為為AAA,則補位為AAA55555;加密字元串為BBBBBB,則補位為BBBBBB22;加密字元串為CCCCCCCC,則補位為CCCCCCCC88888888。

* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的位元組數不同。PKCS5Padding明確定義了加密塊是8位元組,PKCS7Padding加密快可以是1-255之間。
2、選擇加密模式

**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式
**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式
**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式
**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。
**CTR模式** 全稱Counter模式,譯為計數器模式。
3、開始加密明文(內部原理--加密步驟,加密演算法實現不做講解)

image
1、將分塊的64bit一組組加密,示列其中一組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。
2、開始Feistel結構的16次轉換,第一次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,
運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於一次Feistel輪並不會加密右側,因此需要將上一輪輸出後的左右兩側對調後才正式完成一次Feistel加密,
3、DES演算法共計進行16次Feistel輪,最後一輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。
4、末置換是初始置換的逆過程,DES最後一輪後,左、右兩半部分並未進行交換,而是兩部分合並形成一個分組做為末置換的輸入
DES解密經過下面的步驟
1、拿到密文和加密的密鑰
2、解密:DES加密和解密的過程一致,均使用Feistel網路實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。
3、講解密後的明文去填充 (padding)得到的即為明文
Golang實現DES加密解密
package main

import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)

func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼
fmt.Printf("%s",txt) // hello world
}
// 加密函數
func DESEncode(orignData, key []byte)([]byte,error){

// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 明文分組,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())

// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這么做)
blockMode := cipher.NewCBCEncrypter(block,key)

// 創建密文長度的切片,用來存放密文位元組
crypted :=make([]byte,len(txt))

// 開始加密,將txt作為源,crypted作為目的切片輸入
blockMode.CryptBlocks(crypted,txt)

// 將加密後的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函數
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 設置解密模式,加密模式和解密模式要一樣
blockMode := cipher.NewCBCDecrypter(block,key)

// 設置切片長度,用來存放明文位元組
originData := make([]byte,len(cripter))

// 使用解密模式解密,將解密後的明文位元組放入originData 切片中
blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)

return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 獲取最後一位轉為整型,然後根據這個整型截取掉整型數量的長度
// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在設置加密模式為CBC的時候,我們需要設置一個初始化向量,這個量的意思 在對稱加密演算法中,如果只有一個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給一個初始化向量,第一個明文使用初始化向量混合並加密,第二個明文用第一個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下

CBC
3DES
DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的一種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。
對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這一點,PHP中卻不是這樣的,只要是8byte以上就行;而Java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)

5. 常用的對稱密碼演算法有哪些

對稱加密演算法用來對敏感數據等信息進行加密,常用的演算法包括:

DES(Data Encryption Standard):數據加密標准,速度較快,適用於加密大量數據的場合。

3DES(Triple DES):是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。

AES(Advanced Encryption Standard):高級加密標准,是下一代的加密演算法標准,速度快,安全級別高;

6. 如何用C實現3DES演算法..

//功能:實現DES及3DES加解密的演算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "des.h"

//函數聲明
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag);
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag);

//主函數
int main(int argc, char** argv)
{
char src16[16+1],key16[16+1],key48[48+1],dest16[16+1];

if(argc != 3)
{
fprintf(stderr,"Usage: [%s -e|-d s|3]\n",argv[0]);
exit(1);
}

if(strcmp(argv[2],"-s") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else if(strcmp(argv[2],"-3") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else
return -1;

return 0;
}

//做DES加密或解密運算
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)
{
int i,j;
unsigned char subKey[16][48+1],byte8[8+1],bits[64+1],strTmp[64+1];
unsigned char L0[32+1],R0[32+1],Lx[32+1],Rx[32+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(flag == 'e' || flag == 'E')
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}
else
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[15-i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}

return 0;
}

//做3DES加密或解密運算
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)
{
unsigned char strBCDKey[32+1],strByteKey[16+1];
unsigned char strMidDest1[16+1],strMidDest2[16+1];
unsigned char strLKey[16+1],strMKey[16+1],strRKey[16+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(strlen(strKey) < 32)
return -3;

if(flag == 'e' || flag == 'E')
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'e');
Do_DES(strMidDest1,strRKey,strMidDest2,'d');
Do_DES(strMidDest2,strLKey,strMidDest1,'e');

memcpy(strDest,strMidDest1,16);
}
else
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'d');
Do_DES(strMidDest1,strRKey,strMidDest2,'e');
Do_DES(strMidDest2,strLKey,strMidDest1,'d');

memcpy(strDest,strMidDest1,16);
}

return 0;
}

7. 屬於對稱加密演算法的有哪些

主要有DES演算法,3DES演算法,TDEA演算法,Blowfish演算法,RC5演算法,IDEA演算法。

對稱加密演算法的特點是演算法公開、計算量小、加密速度快、加密效率高。優點在於加解密的高速度和使用長密鑰時的難破解性,缺點是交易雙方都使用同樣鑰匙,安全性得不到保證。

對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。



(7)3desc演算法擴展閱讀

常見的加密演算法

DES演算法是密碼體制中的對稱密碼體制,把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位。

3DES是基於DES的對稱演算法,對一塊數據用三個不同的密鑰進行三次加密,強度更高。

RC2和RC4是對稱演算法,用變長密鑰對大量數據進行加密,比DES快。

IDEA演算法是在DES演算法的基礎上發展出來的,是作為迭代的分組密碼實現的,使用128位的密鑰和8個循環。

RSA是由RSA公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的,非對稱演算法。

DSA,即數字簽名演算法,是一種標準的 DSS(數字簽名標准),嚴格來說不算加密演算法。

AES是高級加密標准對稱演算法,是下一代的加密演算法標准,速度快,安全級別高,在21世紀AES 標準的一個實現是 Rijndael演算法。

Blowfish演算法是一個64位分組及可變密鑰長度的對稱密鑰分組密碼演算法,可用來加密64比特長度的字元串。

8. 2.2 DES/3DES演算法 -- 演算法介紹

DES 演算法和 DESSede 演算法統稱DES系列演算法,是對稱加密演算法領域的經典加密演算法。 DESSede (又稱 3DES )使用三次迭代增加演算法安全性。DES演算法是眾多對稱加密演算法的基礎,很多演算法都是基於該演算法演變而來。

雖然DES被取代了,但是DES的CBC工作模式是基礎性的演算法和工作模型,有很強的意義,在遺留系統中也有一些使用的。

DES的演算法是採用分組加密工作模式,流程比較復雜,大致流程如下:

DES 和 3DES 適合一般加密性場景,當前大部分是遺留系統在使用,還有一部分可能是系統沒有支持 AES 等其他加密手段被迫使用。

JDK僅支持 56位的密鑰長度 (出口限制),對稱加密系列演算法的特點是:密鑰長度越高安全性越高,因此JDK本身自帶的 DES 和 3DES 演算法僅適合學術和一般場景使用,Bouncy Castle提供了64位密鑰長度的支持。

3DES 是對 DES 的一種改良演算法,針對 DES 演算法密鑰短,迭代次數少的缺點做了改進。但是 3DES 演算法速度慢,密鑰計算時間長,加密效率不高,實際使用也不多。

DES 的 3 大安全痛點:

閱讀全文

與3desc演算法相關的資料

熱點內容
上門正骨用什麼app 瀏覽:756
安卓為什麼免費使用 瀏覽:397
加密貨幣都有哪些平台 瀏覽:625
python和matlab難度 瀏覽:388
python爬蟲很難學么 瀏覽:572
小米解壓積木可以組成什麼呢 瀏覽:816
為什麼滴滴出行app還能用 瀏覽:564
怎麼升級手機android 瀏覽:922
php權威編程pdf 瀏覽:994
扣扣加密技巧 瀏覽:720
蘋果如何創建伺服器錯誤 瀏覽:496
軟考初級程序員大題分值 瀏覽:474
js壓縮視頻文件 瀏覽:578
linux如何通過命令創建文件 瀏覽:991
應用加密app還能訪問應用嘛 瀏覽:435
安卓怎麼用支付寶交違章罰款 瀏覽:667
php面向對象的程序設計 瀏覽:506
數據挖掘演算法書籍推薦 瀏覽:895
投訴聯通用什麼app 瀏覽:152
web伺服器變更ip地址 瀏覽:956