當前位置:首頁 » 密碼管理 » 3des加密解密

3des加密解密

發布時間: 2022-05-02 12:19:27

Ⅰ 什麼是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會有問題)

Ⅱ 如何用Java進行3DES加密解

importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjavax.crypto.Cipher;publicclassRSAEncrypt{;staticKeyPairkeyPair;staticRSAPrivateKeyprivateKey;staticRSAPublicKeypublicKey;static{try{keyPairGen=KeyPairGenerator.getInstance("RSA");keyPairGen.initialize(512);keyPair=keyPairGen.generateKeyPair();//GeneratekeysprivateKey=(RSAPrivateKey)keyPair.getPrivate();publicKey=(RSAPublicKey)keyPair.getPublic();}catch(NoSuchAlgorithmExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicstaticvoidmain(String[]args){RSAEncryptencrypt=newRSAEncrypt();Filefile=newFile("C:\\DocumentsandSettings\\Administrator.DCB5E0D91E0D436\\桌面\\sdf.txt");FilenewFile=newFile("C:\\DocumentsandSettings\\Administrator.DCB5E0D91E0D436\\桌面\\sdf1.txt");encrypt.encryptFile(encrypt,file,newFile);Filefile1=newFile("C:\\DocumentsandSettings\\Administrator.DCB5E0D91E0D436\\桌面\\sdf1.txt");FilenewFile1=newFile("C:\\DocumentsandSettings\\Administrator.DCB5E0D91E0D436\\桌面\\sdf2.txt");encrypt.decryptFile(encrypt,file1,newFile1);}publicvoidencryptFile(RSAEncryptencrypt,Filefile,FilenewFile){try{InputStreamis=newFileInputStream(file);OutputStreamos=newFileOutputStream(newFile);byte[]bytes=newbyte[53];while(is.read(bytes)>0){byte[]e=encrypt.encrypt(RSAEncrypt.publicKey,bytes);bytes=newbyte[53];os.write(e,0,e.length);}os.close();is.close();System.out.println("writesuccess");}catch(Exceptione){e.printStackTrace();}}publicvoiddecryptFile(RSAEncryptencrypt,Filefile,FilenewFile){try{InputStreamis=newFileInputStream(file);OutputStreamos=newFileOutputStream(newFile);byte[]bytes1=newbyte[64];while(is.read(bytes1)>0){byte[]de=encrypt.decrypt(RSAEncrypt.privateKey,bytes1);bytes1=newbyte[64];os.write(de,0,de.length);}os.close();is.close();System.out.println("writesuccess");}catch(Exceptione){e.printStackTrace();}}/***//****EncryptString.***@returnbyte[]*/protectedbyte[]encrypt(RSAPublicKeypublicKey,byte[]obj){if(publicKey!=null){try{Ciphercipher=Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,publicKey);returncipher.doFinal(obj);}catch(Exceptione){e.printStackTrace();}}returnnull;}/***//****Basicdecryptmethod***@returnbyte[]*/protectedbyte[]decrypt(RSAPrivateKeyprivateKey,byte[]obj){if(privateKey!=null){try{Ciphercipher=Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE,privateKey);returncipher.doFinal(obj);}catch(Exceptione){e.printStackTrace();}}returnnull;}}加解密需要依靠以下四個屬性,你可以把它存文件,存資料庫都無所謂:;staticKeyPairkeyPair;staticRSAPrivateKeyprivateKey;staticRSAPublicKeypublicKey;以上只是示例,怎麼存放根據自己情況追問:你能具體的注釋下么,追答:每一句話都注釋?追問:不用每一句,每個方法注釋下,還有就是怎麼使用哇,哪個文件時本來存在的,哪個是加密之後的,這個類我運行了之後,還出現了文檔打不開的問題追答:哦,好的importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjavax.crypto.Cipher;publicclassRSAEncrypt{;staticKeyPairkeyPair;staticRSAPrivateKeyprivateKey;staticRSAPublicKeypublicKey;static{try{//實例類型keyPairGen=KeyPairGenerator.getInstance("RSA");//初始化長度keyPairGen.initialize(512);//生成KeyPairkeyPair=keyPairGen.generateKeyPair();//GeneratekeysprivateKey=(RSAPrivateKey)keyPair.getPrivate();publicKey=(RSAPublicKey)keyPair.getPublic();}catch(NoSuchAlgorithmExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}/***加密文件*@paramencryptRSAEncrypt對象*@paramfile源文件*@paramnewFile目標文件*/publicvoidencryptFile(RSAEncryptencrypt,Filefile,FilenewFile);/***解密文件*@paramencryptRSAEncrypt對象*@paramfile源文件*@paramnewFile目標文件*/publicvoiddecryptFile(RSAEncryptencrypt,Filefile,FilenewFile);/***加密實現**@returnbyte[]加密後的位元組數組*/protectedbyte[]encrypt(RSAPublicKeypublicKey,byte[]obj);/***解密實現**@returnbyte[]解密後的位元組數組*/protectedbyte[]decrypt(RSAPrivateKeyprivateKey,byte[]obj)我測試了下,.doc.txt均可以加密因為加密解密均是根據那四個屬性來的,所以你需要寫個每次運行先讀取屬性,你可以寫入文件若文件不存在則新生成一組,當加密完成後把四個屬性寫入文件。我以上寫的只是測試,加解密未分開的

Ⅲ 3DES的演算法介紹

3DES又稱Triple DES,是DES加密演算法的一種模式,它使用3條56位的密鑰對數據進行三次加密。數據加密標准(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)))

Ⅳ 如何用Java進行3DES加密解密

Java進行3DES加密解密代碼如下:

<preclass="java"name="code">publicstaticStringbyte2hex(byte[]b){

Stringhs="";

Stringstmp="";

for(intn=0;n<b.length;n++){

stmp=Integer.toHexString(b[n]&0xFF);

if(stmp.length()==1)

hs+=("0"+stmp);

else

hs+=stmp;

}

returnhs.toUpperCase();

}</pre><br>

<pre></pre>

<p><br>

3DES的加密密鑰長度要求是24個位元組,本例中因為給定的密鑰只有16個位元組,所以需要填補至24個位元組。</p>

<p>其中"DESede/ECB/NoPadding",除此之外,3DES還支持"<spanstyle="color:#0000ff">DESede/CBC/PKCS5Padding</span>"模式。</p>

Ⅳ 3des加密 密鑰

Des的密鑰是8個位元組,但實際上只有7個用上,也就是56位。
3des是用3個或2個des密鑰加密一串明文,最少112位最多168位。也就是14~21個字母或數字元號。
從安全性上來說密鑰位數不足是不能加密的,但有些軟體為了保證用戶可用,會自動使用某種策略自動填充滿,一般是重復填充或採用特定字元,如果你只填了1234作為密鑰,有可能真正用於加密的密鑰是123412341234123412341或者123400000000000000000類似的。
另外請注意,最好去做3des的密鑰位數不是7或8,因為des的加密解密是同一個過程,這樣搞在填充後實際上是只使用了一次des加密••••••還不如5位6位好••••••
如果是你編程時碰到的問題,把你的源碼發來看看再說。

Ⅵ java進行3des加密傳過來的數據,php怎麼解密

<?php
/**
* 3DES加解密類
* @Author: 黎志斌
* @version: v1.0
* 2016年7月21日
*/
class Encrypt
{
//加密秘鑰,
private $_key;
private $_iv;
public function __construct($key, $iv)
{
$this->_key = $key;
$this->_iv = $iv;
}

/**
* 對字元串進行3DES加密
* @param string 要加密的字元串
* @return mixed 加密成功返回加密後的字元串,否則返回false
*/
public function encrypt3DES($str)
{
$td = mcrypt_mole_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
if ($td === false) {
return false;
}
//檢查加密key,iv的長度是否符合演算法要求
$key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
$iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));

//加密數據長度處理
$str = $this->strPad($str, mcrypt_enc_get_block_size($td));

if (mcrypt_generic_init($td, $key, $iv) !== 0) {
return false;
}
$result = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
return $result;
}

/**
* 對加密的字元串進行3DES解密
* @param string 要解密的字元串
* @return mixed 加密成功返回加密後的字元串,否則返回false
*/
public function decrypt3DES($str)
{
$td = mcrypt_mole_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
if ($td === false) {
return false;
}

//檢查加密key,iv的長度是否符合演算法要求
$key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
$iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));

if (mcrypt_generic_init($td, $key, $iv) !== 0) {
return false;
}

$result = mdecrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);

return $this->strUnPad($result);
}

/**
* 返回適合演算法長度的key,iv字元串
* @param string $str key或iv的值
* @param int $td_len 符合條件的key或iv長度
* @return string 返回處理後的key或iv值
*/
private function fixLen($str, $td_len)
{
$str_len = strlen($str);
if ($str_len > $td_len) {
return substr($str, 0, $td_len);
} else if($str_len < $td_len) {
return str_pad($str, $td_len, '0');
}
return $str;
}

/**
* 返回適合演算法的分組大小的字元串長度,末尾使用\0補齊
* @param string $str 要加密的字元串
* @param int $td_group_len 符合演算法的分組長度
* @return string 返回處理後字元串
*/
private function strPad($str, $td_group_len)
{
$padding_len = $td_group_len - (strlen($str) % $td_group_len);
return str_pad($str, strlen($str) + $padding_len, "\0");
}

/**
* 返回適合演算法的分組大小的字元串長度,末尾使用\0補齊
* @param string $str 要加密的字元串
* @return string 返回處理後字元串
*/
private function strUnPad($str)
{
return rtrim($str);
}
}
$key = 'ABCEDFGHIJKLMNOPQ';
$iv = '0123456789';
$des = new Encrypt($key, $iv);
$str = "abcdefghijklmnopq";
echo "source: {$str},len: ",strlen($str),"\r\n";
$e_str = $des->encrypt3DES($str);
echo "entrypt: ", $e_str, "\r\n";
$d_str = $des->decrypt3DES($e_str);
echo "dntrypt: {$d_str},len: ",strlen($d_str),"\r\n";

Ⅶ 怎麼用php進行3des解密

<?php
classCrypt3Des{
var$key;
functionCrypt3Des($key){
$this->key=$key;
}

functionencrypt($input){
$size=mcrypt_get_block_size(MCRYPT_3DES,'ecb');
$input=$this->pkcs5_pad($input,$size);
$key=str_pad($this->key,24,'0');
$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');
$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
@mcrypt_generic_init($td,$key,$iv);
$data=mcrypt_generic($td,$input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
//$data=base64_encode($this->PaddingPKCS7($data));
$data=base64_encode($data);
return$data;
}

functiondecrypt($encrypted){
$encrypted=base64_decode($encrypted);
$key=str_pad($this->key,24,'0');
$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');
$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
$ks=mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td,$key,$iv);
$decrypted=mdecrypt_generic($td,$encrypted);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
$y=$this->pkcs5_unpad($decrypted);
return$y;
}

functionpkcs5_pad($text,$blocksize){
$pad=$blocksize-(strlen($text)%$blocksize);
return$text.str_repeat(chr($pad),$pad);
}

functionpkcs5_unpad($text){
$pad=ord($text{strlen($text)-1});
if($pad>strlen($text)){
returnfalse;
}
if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){
returnfalse;
}
returnsubstr($text,0,-1*$pad);
}

functionPaddingPKCS7($data){
$block_size=mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
$padding_char=$block_size-(strlen($data)%$block_size);
$data.=str_repeat(chr($padding_char),$padding_char);
return$data;
}
}

用法:

$crypt=newCrypt3Des('密鑰');
$code="加密後的字元串";
echo$crypt->decrypt($code);

echo出來的就是結果

Ⅷ 3des加密原理

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

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

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

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

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

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

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

Ⅸ 為什麼3DES加密演算法中間一步是解密,而不是加密|

3DES加密過程中的第二步使用的解密沒有密碼方面的意義。它的唯一好處是讓3DES的使用者能夠解密原來單重DES使用者加密的數據

熱點內容
非易失存儲技術 發布:2025-05-10 17:47:17 瀏覽:705
androidstudiosvn 發布:2025-05-10 17:47:14 瀏覽:112
php下載csv 發布:2025-05-10 17:46:30 瀏覽:406
為什麼每次登錄淘寶都要輸密碼 發布:2025-05-10 17:44:57 瀏覽:573
戰艦世界國服腳本不能用 發布:2025-05-10 17:44:46 瀏覽:746
asp判斷資料庫 發布:2025-05-10 17:41:03 瀏覽:284
刮痘痘解壓 發布:2025-05-10 17:35:34 瀏覽:22
android退出動畫 發布:2025-05-10 17:34:02 瀏覽:512
福源密碼寧波哪裡有 發布:2025-05-10 17:27:04 瀏覽:848
javaclasstoobject 發布:2025-05-10 17:25:06 瀏覽:917