成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java和.NET使用DES對稱加密的區別

開發 后端
Java和.NET的系統類庫里都有封裝DES對稱加密的實現方式,但是對外暴露的接口卻各不相同,甚至有時會讓自己難以解決其中的問題,比如Java加密后的結果在.NET中解密不出來等,由于最近項目有跨Java和.NET的加解密,經過我的分析調試,終于讓它們可以互相加密解密了。

Java和.NET的系統類庫里都有封裝DES對稱加密的實現方式,但是對外暴露的接口卻各不相同,甚至有時會讓自己難以解決其中的問題,比如Java加密后的結果在.NET中解密不出來等,由于最近項目有跨Java和.NET的加解密,經過我的分析調試,終于讓它們可以互相加密解密了。

DES加密

DES是一種對稱加密(Data Encryption Standard)算法,以前我寫過一篇文章:.NET中加密解密相關知識,有過簡單描述。

DES算法一般有兩個關鍵點,第一個是加密算法,第二個是數據補位。

加密算法常見的有ECB模式和CBC模式:

ECB模式:電子密本方式,這是JAVA封裝的DES算法的默認模式,就是將數據按照8個字節一段進行DES加密或解密得到一段8個字節的密文或者明文,最后一段不足8個字節,則補足8個字節(注意:這里就涉及到數據補位了)進行計算,之后按照順序將計算所得的數據連在一起即可,各段數據之間互不影響。

CBC模式:密文分組鏈接方式,這是.NET封裝的DES算法的默認模式,它比較麻煩,加密步驟如下:

1、首先將數據按照8個字節一組進行分組得到D1D2......Dn(若數據不是8的整數倍,就涉及到數據補位了)

2、第一組數據D1與向量I異或后的結果進行DES加密得到第一組密文C1(注意:這里有向量I的說法,ECB模式下沒有使用向量I)

3、第二組數據D2與第一組的加密結果C1異或以后的結果進行DES加密,得到第二組密文C2

4、之后的數據以此類推,得到Cn

5、按順序連為C1C2C3......Cn即為加密結果。

數據補位一般有NoPadding和PKCS7Padding(JAVA中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding實際只是協議不一樣,根據相關資料說明:PKCS5Padding明確定義了加密塊是8字節,PKCS7Padding加密快可以是1-255之間。但是封裝的DES算法默認都是8字節,所以可以認為他們一樣。數據補位實際是在數據不滿8字節的倍數,才補充到8字節的倍數的填充過程。

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分別為不填充和填充0的方式。

PKCS7Padding(PKCS5Padding)填充方式:為.NET和JAVA的默認填充方式,對加密數據字節長度對8取余為r,如r大于0,則補8-r個字節,字節為8-r的值;如果r等于0,則補8個字節8。比如:

加密字符串為為AAA,則補位為AAA55555;加密字符串為BBBBBB,則補位為BBBBBB22;加密字符串為CCCCCCCC,則補位為CCCCCCCC88888888。

.NET中的DES加密

對于.NET,框架在System.Security.Cryptography命名空間下提供了DESCryptoServiceProvider作為System.Security.Cryptography.DES加密解密的包裝接口,它提供了如下的4個方法:

  1. public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)  
  2.  
  3. public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)  
  4.  
  5. public override void GenerateIV()  
  6.  
  7. public override void GenerateKey() 

從.NET類庫封裝情況,加解密需要傳入一個Key和IV向量。而且Key必須為8字節的數據,否則會直接拋異常出來,當使用ECB模式下,不管傳入什么IV向量,加密結果都一樣。示例代碼如下:

  1. public static string EncryptWithJava(string key, string str)  
  2. {  
  3.     if (key.Length < 8 || string.IsNullOrEmpty(str))  
  4.     {  
  5.         throw new Exception("加密key小于8或者加密字符串為空!");  
  6.     }  
  7.     byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(08));  
  8.     byte[] bIV = IV;  
  9.     byte[] bStr = Encoding.UTF8.GetBytes(str);  
  10.     try 
  11.     {  
  12.         DESCryptoServiceProvider desc = new DESCryptoServiceProvider();  
  13.         desc.Padding = PaddingMode.PKCS7;//補位  
  14.         desc.Mode = CipherMode.ECB;//CipherMode.CBC  
  15.         using (MemoryStream mStream = new MemoryStream())  
  16.         {  
  17.             using (CryptoStream cStream = new CryptoStream(mStream, desc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))  
  18.             {  
  19.                 cStream.Write(bStr, 0, bStr.Length);  
  20.                 cStream.FlushFinalBlock();  
  21.                 StringBuilder ret = new StringBuilder();  
  22.                 byte[] res = mStream.ToArray();  
  23.                 foreach (byte b in res)  
  24.                 {  
  25.                     ret.AppendFormat("{0:x2}", b);  
  26.                 }  
  27.                 return ret.ToString();  
  28.             }  
  29.         }  
  30.     }  
  31.     catch 
  32.     {  
  33.         return string.Empty;  
  34.     }  

由于為ECB模式,因此IV這里設置什么值都是可以的,當為CBC模式下,則需要設置為其他值,比如:public static byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },才能正常加密解密。

JAVA中的DES加密

JAVA的javax.crypto.Cipher包下,提供了加密解密的功能,它的靜態getInstance方法,可以返回一個Cipher對象,一般有public static final Cipher getInstance(String transformation)方法,transformation為:algorithm/mode/padding,分別表示算法名稱,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名稱,如為:"DES/CBC/PKCS5Padding","DES"等。JAVA中默認的算法為ECB,默認填充方式為PKCS5Padding。Cipher的Init方法用來初始化加密對象,常見的有:

  1. public final void init(int opmode, Key key, AlgorithmParameterSpec params)  
  2. public final void init(int opmode,Key key, SecureRandom random) 

用SecureRandom時,一般用于不需要IV的算法模式,示例代碼如下:
 

  1. public static String encrypt2(String src) throws Exception {  
  2.        SecureRandom sr = new SecureRandom();  
  3.        DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8"));  
  4.        SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");  
  5.        SecretKey sk = skf.generateSecret(ks);  
  6.        Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES");  
  7.        IvParameterSpec iv2 = new IvParameterSpec(IV);  
  8.        cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式  
  9.        //cip.init(Cipher.ENCRYPT_MODE, sk, sr);//沒有傳遞IV  
  10.        String dest = byteToHex(cip.doFinal(src.getBytes("UTF-8")));  
  11.        return dest;  
  12.     } 

 當默認用DES,JAVA會用ECB模式,因此這里IV向量沒有作用,這里,但當用CBC模式下,如果還是用SecureRandom,則每次加密的結果都會不一樣,因為JAVA內部會用隨機的IV來初始化Cipher對象,如示例代碼,由于Cipher.getInstance("DES/CBC/PKCS5Padding")使用了CBC,因此我這里用的javax.crypto.spec.IvParameterSpec包下的IvParameterSpec來初始化向量IV:

  1. Private final static byte[] IV = new byte[] {0x010x010x010x010x010x010x010x01}; 

 

總 結

對于.NET和JAVA在使用DES對稱加密時,需要大家指定一樣的算法和填充模式,并且JAVA在寫DES加解密算法時,還需要根據創建Cipher對象的不同,正確使用IV向量。在不同系統需要互相數據時,必須要明確的是加密算法,Key和算法模式,再根據不同模式是否需要IV向量,最后是填充模式。

本文是經過自己翻閱資料和反復調試代碼而出來的,如有問題,請指正。

原文鏈接:http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html

責任編輯:林師授 來源: Lawson的博客
相關推薦

2023-07-30 17:44:24

CryptoJS加密字符串

2019-08-02 10:43:57

2023-09-04 14:00:28

加密密鑰私鑰

2023-11-22 16:08:48

2009-08-04 11:08:33

ASP.NET數據加密

2009-10-29 13:46:14

VB.NET DES加

2022-06-05 23:30:25

AES加密算法

2020-05-27 10:10:56

對稱加密Hash算法數字簽名

2024-12-31 08:00:00

SpringBoot開發加密

2014-07-07 10:04:32

2019-09-11 08:37:16

2019-12-11 16:56:37

HTTPS對稱加密Java

2019-09-23 12:16:02

通信安全加密哈希

2022-10-21 07:33:12

2023-08-01 07:24:05

2010-07-28 10:09:01

2023-12-13 12:27:46

2009-08-13 18:12:11

C#數據加密

2009-01-13 10:13:05

Ja.NETJava整合.NET整合

2009-09-04 17:27:46

C# DES
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区 | 性视频网 | 99精品99久久久久久宅男 | 毛片一级片 | 国产精品美女久久久久aⅴ国产馆 | 老司机免费视频 | 色视频成人在线观看免 | 精品久久久网站 | 青青草视频网 | 国产高清免费 | 日韩免费一区二区 | 91久久精品国产 | 草草视频在线观看 | 成人欧美一区二区三区黑人孕妇 | 国产免费观看一区 | 欧美精品综合在线 | 九色国产| 精品一区二区视频 | 国产1区| 一级毛片在线播放 | 欧美成人第一页 | 国产精品久久久久无码av | 国产乱码精品一区二区三区中文 | 欧美视频二区 | 91麻豆精品国产91久久久久久 | 亚洲一区免费在线 | 免费国产视频 | 97国产在线观看 | 国产激情一区二区三区 | 秋霞影院一区二区 | 最近中文字幕在线视频1 | 国产精品视频导航 | 成人在线不卡 | 毛片国产| 成人午夜精品 | 亚洲欧美日韩精品久久亚洲区 | 涩涩视频网站在线观看 | 欧美精品91| 成人黄色电影免费 | 欧美高清性xxxxhdvideosex | 国产精品不卡 |