Java代码:
package weaver.interfaces.encode;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import weaver.general.Base64;
import weaver.integration.logging.Logger;
import weaver.integration.logging.LoggerFactory;
/**
* DES加密解密,Base64转码。
* @author chengf
*
*/
public class DES_Base64 implements IEncode {
/**
* 密码
*/
private String pwd = null;
/**
* 构造器
*/
public DES_Base64() {
}
/**
* 构造器
* @param pwd 密码
*/
public DES_Base64(String pwd) {
this.pwd = pwd;
}
/**
* 将传入的明文转换为密文
*
* @param str 明文字符串
* @return 加密后的密文
*/
public String encode(String str) {
byte[] result = null;
try {
if (pwd == null) {
pwd = "ecology9";
}
DESKeySpec keySpec = new DESKeySpec(pwd.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteContent = str.getBytes();
result = cipher.doFinal(byteContent);
} catch (Exception e) {
newlog.error("加密异常!", e);
return null;
}
return new String(Base64.encode(result));
}
/**
* 将传入的密文转换为明文
*
* @param str 密文字符串
* @return 解密后的明文
*/
public String decode(String str) {
byte[] result = null;
byte[] content = Base64.decode(str.getBytes());
try {
if (pwd == null) {
pwd = "ecology9";
}
DESKeySpec keySpec = new DESKeySpec(pwd.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(content);
} catch (Exception e) {
newlog.error("解密异常!", e);
return null;
}
return new String(result);
}
/**
* 设置加密和解密的密钥
*
* @param pwd 加密密钥
* @return true:成功,false:失败
*/
public boolean setPwd(String pwd) {
this.pwd = pwd;
return true;
}
/**
* 设置加密和解密的向量
* @param iv 加密向量
* @return true:成功,false:失败
*/
public boolean setIv(String iv) {
return true;
}
/**
* 主程序
* @param args 参数
*/
public static void main(String[] args) {
DES_Base64 desBase64 = new DES_Base64();
String content = "测试test";
// DES的密钥长度必须是8位(小于8位则会报错,8位之后对加密结果不会产生影响)
String password = "ecology9";
desBase64.setPwd(password);
// 加密
String encodeResultStr = desBase64.encode(content);
//解密
String decodeResultStr = desBase64.decode(encodeResultStr);
}
}
C#代码:
public static class CrypgraphyDES
{
public static string EncryptDES(string valueString, string encryptKey)
{
if (valueString == null)
{
throw new ArgumentException("String to be encrypted can not be null.", "valueString");
}
byte[] key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
using (DESCryptoServiceProvider desprovider = new DESCryptoServiceProvider() { Mode = CipherMode.ECB })
using (MemoryStream memoryStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, desprovider.CreateEncryptor(key, key), CryptoStreamMode.Write))
using (StreamWriter writerStream = new StreamWriter(cryptoStream))
{
writerStream.Write(valueString);
writerStream.Flush();
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(memoryStream.ToArray());
}
}
public static string DecryptDES(string valueString, string encryptKey)
{
if (valueString == null)
{
throw new ArgumentException("String to be decrypted can not be null.", "valueString");
}
//DES加密解密结果一般要注意的地方:密钥、偏移量、块密码模式、填充模式
byte[] buffer = Convert.FromBase64String(valueString);
byte[] key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
using (DESCryptoServiceProvider desprovider = new DESCryptoServiceProvider() { Mode = CipherMode.ECB })
using (MemoryStream memoryStream = new MemoryStream(buffer))
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, desprovider.CreateDecryptor(key, key), CryptoStreamMode.Read))
using (StreamReader streamReader = new StreamReader(cryptoStream))
{
return (streamReader.ReadToEnd());
}
}
}
特别注意:C#中的DESCryptoServiceProvider 的 Mode = CipherMode.ECB,这个一定要设置,否则加密结果会与Java不一致。