C#和Java的Des加解密

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不一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值