C#DES加密,JavaDES解密,另轉C#和Java實現Des完整代碼
阿新 • • 發佈:2018-03-31
sso output uri sta RM light ash for str
而不是 [java] view plain copy
C#DES加密,JavaDES解密,另轉C#和Java實現Des完整代碼
轉載 2014年06月17日 17:36:09[java] view plain copy
- <span style="font-family: Arial, Helvetica, sans-serif;">今天,由於開發需要C#做DES加密,Java做DES解密,在實現時有這樣一個問題:C#做DES有加密向量IV,Java常見方式是沒有的。在解密時需要使用</span>
[java] view plain copy
- Cipher cipher = Cipher.getInstance ( "DES/CBC/PKCS5Padding" );
- cipher.init(Cipher. DECRYPT_MODE , SecretKey mySecretKey , IvParameterSpec myIV);
而不是 [java] view plain copy
- Cipher cipher = Cipher.getInstance ( "DES" );
- cipher.init(Cipher. DECRYPT_MODE , Key key );
1、Java實現DES加解密(兼容C#DES加解密)
[java] view plain copy
- package decryption;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.Key;
- import javax.crypto.Cipher;
- import javax.crypto.CipherInputStream;
- import javax.crypto.CipherOutputStream;
- import javax.crypto.SecretKey;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.DESKeySpec;
- import javax.crypto.spec.IvParameterSpec;
- public class Decryption {
- Key key ;
- SecretKey mySecretKey;
- IvParameterSpec myIV;
- public Decryption() {
- }
- public Decryption(String str) {
- setKey(str); // 生成密匙
- }
- public Key getKey() {
- return key ;
- }
- public void setKey(Key key) {
- this . key = key;
- }
- /**
- * 根據參數生成 KEY
- */
- public void setKey(String strKey) {
- // try {
- // KeyGenerator _generator = KeyGenerator.getInstance ( "DES" );
- // _generator.init( new SecureRandom(strKey.getBytes()));
- // this . key = _generator.generateKey();
- // _generator = null ;
- // } catch (Exception e) {
- // throw new RuntimeException(
- // "Error initializing SqlMap class. Cause: " + e);
- // }
- try {
- DESKeySpec dks = new DESKeySpec(strKey.getBytes("UTF-8"));
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
- SecretKey securekey = keyFactory.generateSecret(dks);
- this.mySecretKey=securekey;
- byte[] Keys =strKey.getBytes();
- IvParameterSpec iv = new IvParameterSpec(Keys);
- this.myIV=iv;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- /**
- * 文件 file 進行加密並保存目標文件 destFile 中
- *
- * @param file
- * 要加密的文件 如 c:/test/srcFile.txt
- * @param destFile
- * 加密後存放的文件名 如 c:/ 加密後文件 .txt
- */
- public void encryptFile(String file, String destFile) throws Exception {
- //Cipher cipher = Cipher.getInstance ( "DES" );
- // cipher.init(Cipher.ENCRYPT_MODE, getKey());
- // cipher.init(Cipher. ENCRYPT_MODE , this . key );
- Cipher cipher = Cipher.getInstance ( "DES/CBC/PKCS5Padding" );
- cipher.init(Cipher. ENCRYPT_MODE , mySecretKey ,myIV);
- InputStream is = new FileInputStream(file);
- OutputStream out = new FileOutputStream(destFile);
- CipherInputStream cis = new CipherInputStream(is, cipher);
- byte [] buffer = new byte [1024];//原文件長度和緩沖區大小沒有關系
- int r;
- while ((r = cis.read(buffer)) > 0) {
- out.write(buffer, 0, r);
- }
- cis.close();
- is.close();
- out.close();
- }
- /**
- * 文件采用 DES 算法解密文件
- *
- * @param file
- * 已加密的文件 如 c:/ 加密後文件 .txt *
- * @param destFile
- * 解密後存放的文件名 如 c:/ test/ 解密後文件 .txt
- */
- public void decryptFile(String file, String dest) throws Exception {
- // Cipher cipher = Cipher.getInstance ( "DES" );
- // cipher.init(Cipher. DECRYPT_MODE , this . key );
- Cipher cipher = Cipher.getInstance ( "DES/CBC/PKCS5Padding" );
- cipher.init(Cipher. DECRYPT_MODE , mySecretKey ,myIV);
- InputStream is = new FileInputStream(file);
- OutputStream out = new FileOutputStream(dest);
- CipherOutputStream cos = new CipherOutputStream(out, cipher);
- byte [] buffer = new byte [1024];//原文件長度和緩沖區大小沒有關系
- int r;
- while ((r = is.read(buffer)) >= 0) {
- cos.write(buffer, 0, r);
- }
- cos.close();
- out.close();
- is.close();
- }
- public static void main(String[] args) throws Exception {
- Decryption des = new Decryption( "12345678" );
- //des.encryptFile("C:/Users/user/Desktop/TS1402883420_F1_D16_6_T9_50_20.mp4","C:/Users/user/Desktop/456.mp4");
- //des.decryptFile("C:/Users/user/Desktop/456.mp4","C:/Users/user/Desktop/789.mp4");
- des.decryptFile("C:/Users/user/Desktop/CSharpEncrypt.mp4","C:/Users/user/Desktop/xyz.mp4");
- }
- }
2、C#DES加解密
[csharp] view plain copy
- using System.Security.Cryptography;
- using System.IO;
- using System.Text;
- using System;
- namespace DES_CSharp
- {
- public class Security
- {
- //默認密鑰向量
- private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
- /// <summary>
- /// DES加密字符串
- /// </summary>
- /// <param name="encryptString">待加密的字符串</param>
- /// <param name="encryptKey">加密密鑰,要求為8位</param>
- /// <returns>加密成功返回加密後的字符串,失敗返回源串</returns>
- public static string EncryptDES(string encryptString, string encryptKey)
- {
- try
- {
- byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
- byte[] rgbIV = Keys;
- byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
- DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
- MemoryStream mStream = new MemoryStream();
- CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
- cStream.Write(inputByteArray, 0, inputByteArray.Length);
- cStream.FlushFinalBlock();
- return Convert.ToBase64String(mStream.ToArray());
- }
- catch
- {
- return encryptString;
- }
- }
- /// <summary>
- /// DES解密字符串
- /// </summary>
- /// <param name="decryptString">待解密的字符串</param>
- /// <param name="decryptKey">解密密鑰,要求為8位,和加密密鑰相同</param>
- /// <returns>解密成功返回解密後的字符串,失敗返源串</returns>
- public static string DecryptDES(string decryptString, string decryptKey)
- {
- try
- {
- byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
- byte[] rgbIV = Keys;
- byte[] inputByteArray = Convert.FromBase64String(decryptString);
- DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
- MemoryStream mStream = new MemoryStream();
- CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
- cStream.Write(inputByteArray, 0, inputByteArray.Length);
- cStream.FlushFinalBlock();
- return Encoding.UTF8.GetString(mStream.ToArray());
- }
- catch
- {
- return decryptString;
- }
- }
- #region 加密方法 圖片加密
- /// <summary>
- /// 圖片加密
- /// </summary>
- /// <param name="filePath">源文件</param>
- /// <param name="savePath">保存為文件名稱</param>
- /// <param name="keyStr">密鑰,要求為8位</param>
- public static void EncryptFile(string filePath, string savePath, string keyStr)
- {
- //通過des加密
- DESCryptoServiceProvider des = new DESCryptoServiceProvider();
- //通過流打開文件
- FileStream fs = File.OpenRead(filePath);
- //獲取文件二進制字符
- byte[] inputByteArray = new byte[fs.Length];
- //讀流文件
- fs.Read(inputByteArray, 0, (int)fs.Length);
- //關閉流
- fs.Close();
- //獲得加密字符串二進制字符
- byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
- ////計算指定字節組指定區域哈希值
- //SHA1 ha = new SHA1Managed();
- //byte[] hb = ha.ComputeHash(keyByteArray);
- ////加密密鑰數組
- //byte[] sKey = new byte[8];
- ////加密變量
- //byte[] sIV = new byte[8];
- //for (int i = 0; i < 8; i++)
- // sKey[i] = hb[i];
- //for (int i = 8; i < 16; i++)
- // sIV[i - 8] = hb[i];
- byte[] sKey = keyByteArray;
- byte[] sIV = keyByteArray;
- //獲取加密密鑰
- des.Key = sKey;
- //設置加密初始化向量
- des.IV = sIV;
- MemoryStream ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- fs = File.OpenWrite(savePath);
- foreach (byte b in ms.ToArray())
- {
- fs.WriteByte(b);
- }
- fs.Close();
- cs.Close();
- ms.Close();
- }
- #endregion
- #region 解密方法 圖片解密
- /// <summary>
- /// 圖片解密
- /// </summary>
- /// <param name="filePath">源文件</param>
- /// <param name="savePath">保存文件</param>
- /// <param name="keyStr">密鑰,要求為8位</param>
- public static void DecryptFile(string filePath, string savePath, string keyStr)
- {
- //通過des解密
- DESCryptoServiceProvider des = new DESCryptoServiceProvider();
- //通過流讀取文件
- FileStream fs = File.OpenRead(filePath);
- //獲取文件二進制字符
- byte[] inputByteArray = new byte[fs.Length];
- //讀取流文件
- fs.Read(inputByteArray, 0, (int)fs.Length);
- //關閉流
- fs.Close();
- //密鑰數組
- byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
- ////定義哈希變量
- //SHA1 ha = new SHA1Managed();
- ////計算指定字節組指定區域哈希值
- //byte[] hb = ha.ComputeHash(keyByteArray);
- ////加密密鑰數組
- //byte[] sKey = new byte[8];
- ////加密變量
- //byte[] sIV = new byte[8];
- //for (int i = 0; i < 8; i++)
- // sKey[i] = hb[i];
- //for (int i = 8; i < 16; i++)
- // sIV[i - 8] = hb[i];
- byte[] sKey = keyByteArray;
- byte[] sIV = keyByteArray;
- //獲取加密密鑰
- des.Key = sKey;
- //加密變量
- des.IV = sIV;
- MemoryStream ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- fs = File.OpenWrite(savePath);
- foreach (byte b in ms.ToArray())
- {
- fs.WriteByte(b);
- }
- fs.Close();
- cs.Close();
- ms.Close();
- }
- #endregion
- #region 加密方法 圖片加密
- /// <summary>
- /// 圖片加密
- /// </summary>
- /// <param name="filePath">加密文件字節數組</param>
- /// <param name="savePath">保存為文件名稱</param>
- /// <param name="keyStr">密鑰,要求為8位</param>
- public static void EncryptFile(byte[] inputByteArray, string savePath, string keyStr)
- {
- try
- {
- //通過des加密
- DESCryptoServiceProvider des = new DESCryptoServiceProvider();
- //獲得加密字符串二進制字符
- byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
- //計算指定字節組指定區域哈希值
- SHA1 ha = new SHA1Managed();
- byte[] hb = ha.ComputeHash(keyByteArray);
- //加密密鑰數組
- byte[] sKey = new byte[8];
- //加密變量
- byte[] sIV = new byte[8];
- for (int i = 0; i < 8; i++)
- sKey[i] = hb[i];
- for (int i = 8; i < 16; i++)
- sIV[i - 8] = hb[i];
- //獲取加密密鑰
- des.Key = sKey;
- //設置加密初始化向量
- des.IV = sIV;
- MemoryStream ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- FileStream fs = File.OpenWrite(savePath);
- foreach (byte b in ms.ToArray())
- {
- fs.WriteByte(b);
- }
- fs.Close();
- cs.Close();
- ms.Close();
- }
- catch (Exception ex)
- {
- System.Diagnostics.Trace.Write(ex.Message);
- }
- }
- #endregion
- #region 解密方法 圖片解密
- /// <summary>
- /// 圖片解密
- /// </summary>
- /// <param name="filePath">源文件</param>
- /// <param name="savePath">保存文件</param>
- /// <param name="keyStr">密鑰,要求為8位</param>
- /// <returns>返回解密後的文件字節數組</returns>
- public static byte[] DecryptFile(string filePath, string keyStr)
- {
- try
- {
- //通過des解密
- DESCryptoServiceProvider des = new DESCryptoServiceProvider();
- //通過流讀取文件
- FileStream fs = File.OpenRead(filePath);
- //獲取文件二進制字符
- byte[] inputByteArray = new byte[fs.Length];
- //讀取流文件
- fs.Read(inputByteArray, 0, (int)fs.Length);
- //關閉流
- fs.Close();
- //密鑰數組
- byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
- //定義哈希變量
- SHA1 ha = new SHA1Managed();
- //計算指定字節組指定區域哈希值
- byte[] hb = ha.ComputeHash(keyByteArray);
- //加密密鑰數組
- byte[] sKey = new byte[8];
- //加密變量
- byte[] sIV = new byte[8];
- for (int i = 0; i < 8; i++)
- sKey[i] = hb[i];
- for (int i = 8; i < 16; i++)
- sIV[i - 8] = hb[i];
- //獲取加密密鑰
- des.Key = sKey;
- //加密變量
- des.IV = sIV;
- MemoryStream ms = new MemoryStream();
- CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- byte[] b = ms.ToArray();
- cs.Close();
- ms.Close();
- return b;
- }
- catch (Exception ex)
- {
- System.Diagnostics.Trace.Write(ex.Message);
- return null;
- }
- }
- #endregion
- }
- }
3、JavaDES加解密
[java] view plain copy- package test;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.Key;
- import java.security.SecureRandom;
- import javax.crypto.Cipher;
- import javax.crypto.CipherInputStream;
- import javax.crypto.CipherOutputStream;
- import javax.crypto.KeyGenerator;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- public class DESUtil {
- Key key ;
- public DESUtil() {
- }
- public DESUtil(String str) {
- setKey(str); // 生成密匙
- }
- public Key getKey() {
- return key ;
- }
- public void setKey(Key key) {
- this . key = key;
- }
- /**
- * 根據參數生成 KEY
- */
- public void setKey(String strKey) {
- try {
- KeyGenerator _generator = KeyGenerator.getInstance ( "DES" );
- _generator.init( new SecureRandom(strKey.getBytes()));
- this . key = _generator.generateKey();
- _generator = null ;
- } catch (Exception e) {
- throw new RuntimeException(
- "Error initializing SqlMap class. Cause: " + e);
- }
- }
- /**
- * 加密 String 明文輸入 ,String 密文輸出
- */
- public String encryptStr(String strMing) {
- byte [] byteMi = null ;
- byte [] byteMing = null ;
- String strMi = "" ;
- BASE64Encoder base64en = new BASE64Encoder();
- try {
- byteMing = strMing.getBytes( "UTF8" );
- byteMi = this .encryptByte(byteMing);
- strMi = base64en.encode(byteMi);
- } catch (Exception e) {
- throw new RuntimeException(
- "Error initializing SqlMap class. Cause: " + e);
- } finally {
- base64en = null ;
- byteMing = null ;
- byteMi = null ;
- }
- return strMi;
- }
- /**
- * 解密 以 String 密文輸入 ,String 明文輸出
- *
- * @param strMi
- * @return
- */
- public String decryptStr(String strMi) {
- BASE64Decoder base64De = new BASE64Decoder();
- byte [] byteMing = null ;
- byte [] byteMi = null ;
- String strMing = "" ;
- try {
- byteMi = base64De.decodeBuffer(strMi);
- byteMing = this .decryptByte(byteMi);
- strMing = new String(byteMing, "UTF8" );
- } catch (Exception e) {
- throw new RuntimeException(
- "Error initializing SqlMap class. Cause: " + e);
- } finally {
- base64De = null ;
- byteMing = null ;
- byteMi = null ;
- }
- return strMing;
- }
- /**
- * 加密以 byte[] 明文輸入 ,byte[] 密文輸出
- *
- * @param byteS
- * @return
- */
- private byte [] encryptByte( byte [] byteS) {
- byte [] byteFina = null ;
- Cipher cipher;
- try {
- cipher = Cipher.getInstance ( "DES" );
- cipher.init(Cipher. ENCRYPT_MODE , key );
- byteFina = cipher.doFinal(byteS);
- } catch (Exception e) {
- throw new RuntimeException(
- "Error initializing SqlMap class. Cause: " + e);
- } finally {
- cipher = null ;
- }
- return byteFina;
- }
- /**
- * 解密以 byte[] 密文輸入 , 以 byte[] 明文輸出
- *
- * @param byteD
- * @return
- */
- private byte [] decryptByte( byte [] byteD) {
- Cipher cipher;
- byte [] byteFina = null ;
- try {
- cipher = Cipher.getInstance ( "DES" );
- cipher.init(Cipher. DECRYPT_MODE , key );
- byteFina = cipher.doFinal(byteD);
- } catch (Exception e) {
- throw new RuntimeException(
- "Error initializing SqlMap class. Cause: " + e);
- } finally {
- cipher = null ;
- }
- return byteFina;
- }
- /**
- * 文件 file 進行加密並保存目標文件 destFile 中
- *
- * @param file
- * 要加密的文件 如 c:/test/srcFile.txt
- * @param destFile
- * 加密後存放的文件名 如 c:/ 加密後文件 .txt
- */
- public void encryptFile(String file, String destFile) throws Exception {
- Cipher cipher = Cipher.getInstance ( "DES" );
- // cipher.init(Cipher.ENCRYPT_MODE, getKey());
- cipher.init(Cipher. ENCRYPT_MODE , this . key );
- InputStream is = new FileInputStream(file);
- OutputStream out = new FileOutputStream(destFile);
- CipherInputStream cis = new CipherInputStream(is, cipher);
- byte [] buffer = new byte [1024];
- int r;
- while ((r = cis.read(buffer)) > 0) {
- out.write(buffer, 0, r);
- }
- cis.close();
- is.close();
- out.close();
- }
- /**
- * 文件采用 DES 算法解密文件
- *
- * @param file
- * 已加密的文件 如 c:/ 加密後文件 .txt *
- * @param destFile
- * 解密後存放的文件名 如 c:/ test/ 解密後文件 .txt
- */
- public void decryptFile(String file, String dest) throws Exception {
- Cipher cipher = Cipher.getInstance ( "DES" );
- cipher.init(Cipher. DECRYPT_MODE , this . key );
- InputStream is = new FileInputStream(file);
- OutputStream out = new FileOutputStream(dest);
- CipherOutputStream cos = new CipherOutputStream(out, cipher);
- byte [] buffer = new byte [1024];
- int r;
- while ((r = is.read(buffer)) >= 0) {
- cos.write(buffer, 0, r);
- }
- cos.close();
- out.close();
- is.close();
- }
- public static void main(String[] args) throws Exception {
- DESUtil des = new DESUtil( "1234567" );
- // DES 加密文件
- // des.encryptFile("G:/test.doc", "G:/ 加密 test.doc");
- // DES 解密文件
- // des.decryptFile("G:/ 加密 test.doc", "G:/ 解密 test.doc");
- String str1 = " 要加密的字符串 test" ;
- // DES 加密字符串
- String str2 = des.encryptStr(str1);
- // DES 解密字符串
- String deStr = des.decryptStr(str2);
- System. out .println( " 加密前: " + str1);
- System. out .println( " 加密後: " + str2);
- System. out .println( " 解密後: " + deStr);
- }
- }
C#DES加密,JavaDES解密,另轉C#和Java實現Des完整代碼