java与.net des加解密 方法解析

java的des的加密和解密以及c#的加密和解密的方法:

DES加密
DES是一种对称加密(Data Encryption Standard)算法 ,两个关键点,第一个是加密算法,第二个是数据补位。

加密算法常见的有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即为加密结果。

一、java的des加密和解密


//des加密后base64
	public String DESEncrypt(String inputData, String inputKey)
			throws Exception {
		byte[] DESkey = inputKey.getBytes();// 设置密钥
		DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
		Key key = keyFactory.generateSecret(keySpec);// 得到密钥对象

		Cipher enCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");// 得到加密对象Cipher
		enCipher.init(Cipher.ENCRYPT_MODE, key);// 设置工作模式为加密模式,给出密钥和向量
		byte[] pasByte = enCipher.doFinal(inputData.getBytes("utf-8"));
		BASE64Encoder base64Encoder = new BASE64Encoder();
		return base64Encoder.encode(pasByte);
	}
      //先反base64,然后
	public static String DESDecrypt(String inputData, String inputKey)
			throws Exception {
		BASE64Decoder base64Decoder = new BASE64Decoder();
		byte[] byteInputData = base64Decoder.decodeBuffer(inputData);

		byte[] DESkey = inputKey.getBytes();// 设置密钥
		DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
		Key key = keyFactory.generateSecret(keySpec);// 得到密钥对象

		// using DES in ECB mode
		Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
		// 用密匙初始化Cipher对象
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte decryptedData[] = cipher.doFinal(byteInputData);
		String value = new String(decryptedData, "UTF-8");
		return value;// decryptedData;
	}

	public String GetUtcTime(String format) throws Exception {
		if (format == "") {
			format = "yyyy-MM-dd hh:mm";
		}
		DateFormat gmtFormat = new SimpleDateFormat(format);
		TimeZone gmtTime = TimeZone.getTimeZone("UTC");
		gmtFormat.setTimeZone(gmtTime);
		Calendar calendar = java.util.Calendar.getInstance();
		return gmtFormat.format(calendar.getTime());
	}



二、c#的加密和解密

 /// 
        /// 默认使用ECB模式进行加密 
        /// 
        /// 
        /// 
        /// 
        /// 返回的是二进制数据转换为Base64字符串
        public static string DESEncrypt(string strToEncrypt, string sKey, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            var result = string.Empty;
            using (var objDesCryptoServiceProvider = new DESCryptoServiceProvider())
            {
                byte[] inputByteArray = Encoding.UTF8.GetBytes(strToEncrypt);
                objDesCryptoServiceProvider.Key = Encoding.UTF8.GetBytes(sKey);
                objDesCryptoServiceProvider.Mode = CipherMode.ECB;
                objDesCryptoServiceProvider.Padding = paddingMode;
                byte[] bysEncrypted =
                    objDesCryptoServiceProvider.CreateEncryptor().TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
                result = Convert.ToBase64String(bysEncrypted);
            }
            return result;
        }

         
        /// 
        /// 默认使用ECB模式进行解密
        /// 
        /// 输入的是Base64字符串的密文
        /// 
        /// 
        /// 
        public static string DESDecrypt(string strToDecrypt, string sKey, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            var result = string.Empty;
            using (var objDesCryptoServiceProvider = new DESCryptoServiceProvider())
            { 
                byte[] inputByteArray = Convert.FromBase64String(strToDecrypt); 
                objDesCryptoServiceProvider.Key = Encoding.UTF8.GetBytes(sKey); 
                objDesCryptoServiceProvider.Mode = CipherMode.ECB; 
                objDesCryptoServiceProvider.Padding = paddingMode;
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, objDesCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(inputByteArray, 0, inputByteArray.Length);
                        cs.FlushFinalBlock();
                        result = Encoding.UTF8.GetString(ms.ToArray()).Replace('\0', ' ');//Zeros模式下去掉多余的补位
                    }
                }
            }
            return result;
        } 


三、java打包成jar供外部调用

http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 

首先下载fat jar,地址:http://sourceforge.net/project/showfiles.php?group_id=115990&package_id=125924
下载后,解压缩,有一个plugins文件夹,里面有个jar包。

将这个文件夹放入myeclipse的dropins目录,这里我的路径是D:/Program Files/Genuitec/MyEclipse 8.5/dropins,仅供参考。重启eclipse后,右键点击项目,可以看见一个带前面有绿色加号的选项->Build Fat Jar,就表示安装成功了。
如果你要把你的项目打包成一个可执行jar,右键点击项目->Build Fat Jar,出现一个界面。界面各属性如下设置:
Jar-name:你要生成的jar的名字
Manifest:最重要的配置文件,但这一步不需要你关心,不要改动
Main-Class:你的jar从哪个main函数启动
Class-path:通常是一个点“.”,如果你使用了外部类,那么还需设置外部类。

例如我的项目使用了jpcap.jar和jpcap.dll,那么我的path是“. jpcap.jar jpcap.dll”,千万记得那个点不能省略,同时外部类前面都要有个空格。这些属性会写入Manifest。
点下一步,出现一个界面让你选择将什么打包进去,选择你需要的类就可以了,那些外部依赖的包因为我们前面已经设置了,因此不要选。完成后会在你的工程目录下生成一个可执行的jar包,这个时候你再记得把你的外部类拷过来(即和这个jar包在同一目录下),OK!

 


参考:

des 在线tools https://www.tools4noobs.com/online_tools/encrypt/ 

java中的des   http://www.cnblogs.com/xyzlmn/archive/2010/05/06/1729039.html

JAVA和.NET使用DES对称加密的区别 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html


你可能感兴趣的:(java)