JAVA和net的DES3加密的区别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Security.Cryptography;

/// <summary>
///Des3Encode 的摘要说明
/// </summary>
public class Des3Encode
{   
 public Des3Encode()
 {
  //
  //TODO: 在此处添加构造函数逻辑
  //

 }

    /// <summary>
    /// DES3加密解密
    /// </summary>
    public class Des3
    {
        #region CBC模式**

        /// <summary>
        /// DES3 CBC模式加密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">IV</param>
        /// <param name="data">明文的byte数组</param>
        /// <returns>密文的byte数组</returns>
        public static byte[] Des3EncodeCBC(byte[] key, byte[] iv, byte[] data)
        {
            //复制于MSDN

            try
            {
                // Create a MemoryStream.
                MemoryStream mStream = new MemoryStream();

                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.CBC;             //默认值
                tdsp.Padding = PaddingMode.PKCS7;       //默认值
 
                // Create a CryptoStream using the MemoryStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(mStream,
                    tdsp.CreateEncryptor(key, iv),
                    CryptoStreamMode.Write);

                // Write the byte array to the crypto stream and flush it.
                cStream.Write(data, 0, data.Length);
                cStream.FlushFinalBlock();

                // Get an array of bytes from the
                // MemoryStream that holds the
                // encrypted data.
                byte[] ret = mStream.ToArray();

                // Close the streams.
                cStream.Close();
                mStream.Close();

                // Return the encrypted buffer.
                return ret;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }

        /// <summary>
        /// DES3 CBC模式解密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">IV</param>
        /// <param name="data">密文的byte数组</param>
        /// <returns>明文的byte数组</returns>
        public static byte[] Des3DecodeCBC(byte[] key, byte[] iv, byte[] data)
        {
            try
            {
                // Create a new MemoryStream using the passed
                // array of encrypted data.
                MemoryStream msDecrypt = new MemoryStream(data);

                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.CBC;
                tdsp.Padding = PaddingMode.PKCS7;

                // Create a CryptoStream using the MemoryStream
                // and the passed key and initialization vector (IV).
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                    tdsp.CreateDecryptor(key, iv),
                    CryptoStreamMode.Read);

                // Create buffer to hold the decrypted data.
                byte[] fromEncrypt = new byte[data.Length];

                // Read the decrypted data out of the crypto stream
                // and place it into the temporary buffer.
                csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

                //Convert the buffer into a string and return it.
                return fromEncrypt;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }

        #endregion

        #region ECB模式

        /// <summary>
        /// DES3 ECB模式加密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">IV(当模式为ECB时,IV无用)</param>
        /// <param name="str">明文的byte数组</param>
        /// <returns>密文的byte数组</returns>
        public static byte[] Des3EncodeECB(byte[] key, byte[] iv, byte[] data)
        {
            try
            {
                // Create a MemoryStream.
                MemoryStream mStream = new MemoryStream();

                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.ECB;
                tdsp.Padding = PaddingMode.PKCS7;
                // Create a CryptoStream using the MemoryStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(mStream,
                    tdsp.CreateEncryptor(key, iv),
                    CryptoStreamMode.Write);

                // Write the byte array to the crypto stream and flush it.
                cStream.Write(data, 0, data.Length);
                cStream.FlushFinalBlock();

                // Get an array of bytes from the
                // MemoryStream that holds the
                // encrypted data.
                byte[] ret = mStream.ToArray();

                // Close the streams.
                cStream.Close();
                mStream.Close();

                // Return the encrypted buffer.
                return ret;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }

        }

        /// <summary>
        /// DES3 ECB模式解密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">IV(当模式为ECB时,IV无用)</param>
        /// <param name="str">密文的byte数组</param>
        /// <returns>明文的byte数组</returns>
        public static byte[] Des3DecodeECB(byte[] key, byte[] iv, byte[] data)
        {
            try
            {
                // Create a new MemoryStream using the passed
                // array of encrypted data.
                MemoryStream msDecrypt = new MemoryStream(data);

                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.ECB;
                tdsp.Padding = PaddingMode.PKCS7;

                // Create a CryptoStream using the MemoryStream
                // and the passed key and initialization vector (IV).
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                    tdsp.CreateDecryptor(key, iv),
                    CryptoStreamMode.Read);

                // Create buffer to hold the decrypted data.
                byte[] fromEncrypt = new byte[data.Length];

                // Read the decrypted data out of the crypto stream
                // and place it into the temporary buffer.
                csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

                //Convert the buffer into a string and return it.
                return fromEncrypt;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }

        #endregion

        /// <summary>
        /// 类测试
        /// </summary>
        public static string strEnCODE()
        {
            System.Text.Encoding utf8 = System.Text.Encoding.UTF8;

            //key为abcdefghijklmnopqrstuvwx的Base64编码
           // byte[] key = Convert.FromBase64String("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4");
            byte[] key = System.Text.Encoding.Default.GetBytes("123456");
            byte[] iv = utf8.GetBytes("12345678");
            //byte[] iv = new byte[] {0,1,2,3,4,5,6,7};      //当模式为ECB时,IV无用
            byte[] data = utf8.GetBytes("717");

            //System.Console.WriteLine("ECB模式:");
            //byte[] str1 = Des3.Des3EncodeECB(key, iv, data);
            //byte[] str2 = Des3.Des3DecodeECB(key, iv, str1);
            //System.Console.WriteLine(Convert.ToBase64String(str1));
            //System.Console.WriteLine(System.Text.Encoding.UTF8.GetString(str2));
            //System.Console.WriteLine();

            System.Console.WriteLine("CBC模式:");
            byte[] str3 = Des3.Des3EncodeCBC(key, iv, data); //加密
            //byte[] str4 = Des3.Des3DecodeCBC(key, iv, str3); //解密
            System.Console.WriteLine(Convert.ToBase64String(str3));
            //System.Console.WriteLine(utf8.GetString(str4));
            System.Console.WriteLine();
            string RESULT_STR3 = byte2hex(str3); //转16进制  
            return RESULT_STR3;
        }

                    /**
             * 2进制转换为16进制
             *
             * @param b
             * @return
             */
        public static String byte2hex(byte[] b)
        { // 二进制转16进制字符串
            String hs = "";
            String stmp = "";
            for (int n = 0; n < b.Length; n++)
            {
                stmp = (Convert.ToString((b[n] & 0XFF), 16));
                if (stmp.Length == 1)
                    hs = hs + "0" + stmp;
                else
                    hs = hs + stmp;
                /*if (n < b.length - 1)
                    hs = hs + ":";*/
            }
            return hs.ToUpper(); //转大写
            // return hs.ToLower(); //转小写
        }

    }
}

/

/JAVA的

package com.suntek.gw.app.bill.util.crypt;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class Des3Encode { 
    // 向量 
    private final static String iv = "12345678"; 
    // 加解密统一使用的编码方式 
    private final static String encoding = "utf-8"; 
 
    /**
     * 3DES加密
     * 
     * @param plainText 普通文本
     * @return
     * @throws Exception 
     */ 
    public static String encode(String plainText,String secretKey) throws Exception { 
        Key deskey = null; 
        DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 
        deskey = keyfactory.generateSecret(spec); 
 
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
        cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); 
        byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding)); 
        return EnCodeHelper.byte2hex(encryptData); 
    } 
 
    
 

    /**
     * 3DES解密
     * 
     * @param encryptText 加密文本
     * @return
     * @throws Exception
     */ 
    public static String decode(String encryptText,String secretKey) throws Exception { 
        Key deskey = null; 
        DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 
        deskey = keyfactory.generateSecret(spec); 
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
        cipher.init(Cipher.DECRYPT_MODE, deskey, ips); 
 
        byte[] decryptData = cipher.doFinal(EnCodeHelper.hex2byte(encryptText)); 
 
        return new String(decryptData, encoding); 
    } 
   
   
    public static void main(String[] args) {
  try {
   String encode = encode("0231","23");
   System.out.println(encode);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
   
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值