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

来源:互联网 发布:kenzo知乎 编辑:程序博客网 时间:2024/06/16 01:52

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加密后base64public 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");// 得到加密对象CipherenCipher.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 modeCipher 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#的加密和解密

 /// <summary>        /// 默认使用ECB模式进行加密         /// </summary>        /// <param name="strToEncrypt"></param>        /// <param name="sKey"></param>        /// <param name="paddingMode"></param>        /// <returns>返回的是二进制数据转换为Base64字符串</returns>        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;        }                 /// <summary>        /// 默认使用ECB模式进行解密        /// </summary>        /// <param name="strToDecrypt">输入的是Base64字符串的密文</param>        /// <param name="sKey"></param>        /// <param name="paddingMode"></param>        /// <returns></returns>        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


0 0
原创粉丝点击