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