java与C#的Encrypt3DES加密互换

1 篇文章 0 订阅
1 篇文章 0 订阅

跨平台加解密一直就是一个坑,坑了一堆的程序猿,我内心是痛苦的。其实最佳方式就是给出双方加密前后的的字符串做对照,一目了然。

java加密代码:

//加密
	 public static String Encrypt3DES(String value,String key) throws Exception{
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), CRYPT_ALGORITHM);
            Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            
            byte[] encryptedByte = cipher.doFinal(value.getBytes("UTF-8"));
            byte[] encodedByte = UrlBase64.encode(encryptedByte);
            return new String(encodedByte,"UTF-8");
        } catch(Exception e) {
        	sysLog.error("PCThreeDESUtil.encrypt : encrypt was failed!", e);
            throw e;
        }
    }


 //解密
	 public static String Decrypt3Des(String value,String key) throws Exception {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), CRYPT_ALGORITHM);
            Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
            byte[] decodedByte = UrlBase64.decode(value.getBytes("UTF-8"));
            byte[] decryptedByte = cipher.doFinal(decodedByte);            
            return new String(decryptedByte,"UTF-8");
        } catch(Exception e) {
        	sysLog.error("PCThreeDESUtil.decrypt : decrypt was failed!", e);
            throw e;
        }
    }

注意:java的Base64和UrlBase64的区别

Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法,将字符映射表中用作补位“=”换成“.”,并用“-”代替“+”,用“_”代替“/”。使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输。

 

C#代码:

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="a_strString"></param>
        /// <param name="a_strKey">key3Des</param>
        /// <returns></returns>
        public static string Encrypt3DES(string a_strString, string a_strKey)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

            DES.Key = Encoding.UTF8.GetBytes(a_strKey);
            DES.Mode = CipherMode.ECB;
            DES.Padding = PaddingMode.PKCS7;

            ICryptoTransform DESEncrypt = DES.CreateEncryptor();

            byte[] Buffer = Encoding.UTF8.GetBytes(a_strString);
            string s= Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)).Replace('+', '-').Replace('/', '_').Replace('=','.');
            return s;
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="a_strString"></param>
        /// <param name="a_strKey">key3Des</param>
        /// <returns></returns>
        public static string Decrypt3DES(string a_strString, string a_strKey)
        {
            a_strString = a_strString.Replace('-', '+').Replace('_', '/').Replace('.','=');
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

            DES.Key = Encoding.UTF8.GetBytes(a_strKey);
            DES.Mode = CipherMode.ECB;
            DES.Padding = PaddingMode.PKCS7;

            ICryptoTransform DESDecrypt = DES.CreateDecryptor();

            string result = "";
            try
            {
                byte[] Buffer = Convert.FromBase64String(a_strString);
                result = Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
            }
            catch (Exception e)
            {

            }
            return result;
        }

如果上面java使用的是Base64的编码。就把机密最后的Replace('+', '-').Replace('/', '_').Replace('=','.')去掉。解密同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值