分享2个Java转C#加密解密的算法

最近老是碰到和其他项目对接,对方项目采用JAVA,对于调用api时通常会 设计到对参数的加密解密。这时候就需要把对方的加密算法用C#实现一遍。

直接上代码。

Java

 private static byte[] iv = {1,2,3,4,5,6,7,8};
    public static String encryptDES(String encryptString, String encryptKey) throws Exception {
//      IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes("utf-8"), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(encryptString.getBytes("utf-8"));    

        return Base64_BAK.encode(encryptedData);
    }
    public static String decryptDES(String decryptString, String decryptKey) throws Exception {
        byte[] byteMi = new Base64_BAK().decode(decryptString);
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
//      IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
        SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes("utf-8"), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte decryptedData[] = cipher.doFinal(byteMi);
        String retrdecryptedData = new String(decryptedData,"UTF-8");
        return retrdecryptedData;
    }

  对字符进行编码的代码

class Base64_BAK {
    private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
    /**
     * data[]进行编码
     * @param data
     * @return
     */
        public static String encode(byte[] data) {
            int start = 0;
            int len = data.length;
            StringBuffer buf = new StringBuffer(data.length * 3 / 2);    

            int end = len - 3;
            int i = start;
            int n = 0;    

            while (i <= end) {
                int d = ((((int) data[i]) & 0x0ff) << 16)
                        | ((((int) data[i + 1]) & 0x0ff) << 8)
                        | (((int) data[i + 2]) & 0x0ff);    

                buf.append(legalChars[(d >> 18) & 63]);
                buf.append(legalChars[(d >> 12) & 63]);
                buf.append(legalChars[(d >> 6) & 63]);
                buf.append(legalChars[d & 63]);    

                i += 3;    

                if (n++ >= 14) {
                    n = 0;
                    buf.append(" ");
                }
            }    

            if (i == start + len - 2) {
                int d = ((((int) data[i]) & 0x0ff) << 16)
                        | ((((int) data[i + 1]) & 255) << 8);    

                buf.append(legalChars[(d >> 18) & 63]);
                buf.append(legalChars[(d >> 12) & 63]);
                buf.append(legalChars[(d >> 6) & 63]);
                buf.append("=");
            } else if (i == start + len - 1) {
                int d = (((int) data[i]) & 0x0ff) << 16;    

                buf.append(legalChars[(d >> 18) & 63]);
                buf.append(legalChars[(d >> 12) & 63]);
                buf.append("==");
            }    

            return buf.toString();
        }    

        private static int decode(char c) {
            if (c >= ‘A‘ && c <= ‘Z‘)
                return ((int) c) - 65;
            else if (c >= ‘a‘ && c <= ‘z‘)
                return ((int) c) - 97 + 26;
            else if (c >= ‘0‘ && c <= ‘9‘)
                return ((int) c) - 48 + 26 + 26;
            else
                switch (c) {
                case ‘+‘:
                    return 62;
                case ‘/‘:
                    return 63;
                case ‘=‘:
                    return 0;
                default:
                    throw new RuntimeException("unexpected code: " + c);
                }
        }    

        /**
         * Decodes the given Base64 encoded String to a new byte array. The byte
         * array holding the decoded data is returned.
         */    

        public static byte[] decode(String s) {    

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try {
                decode(s, bos);
            } catch (IOException e) {
                throw new RuntimeException();
            }
            byte[] decodedBytes = bos.toByteArray();
            try {
                bos.close();
                bos = null;
            } catch (IOException ex) {
                System.err.println("Error while decoding BASE64: " + ex.toString());
            }
            return decodedBytes;
        }    

        private static void decode(String s, OutputStream os) throws IOException {
            int i = 0;    

            int len = s.length();    

            while (true) {
                while (i < len && s.charAt(i) <= ‘ ‘)
                    i++;    

                if (i == len)
                    break;    

                int tri = (decode(s.charAt(i)) << 18)
                        + (decode(s.charAt(i + 1)) << 12)
                        + (decode(s.charAt(i + 2)) << 6)
                        + (decode(s.charAt(i + 3)));    

                os.write((tri >> 16) & 255);
                if (s.charAt(i + 2) == ‘=‘)
                    break;
                os.write((tri >> 8) & 255);
                if (s.charAt(i + 3) == ‘=‘)
                    break;
                os.write(tri & 255);    

                i += 4;
            }
    }

  对应的C#加密和解密算法如下

   static String encode(byte[] data)
        {
            int start = 0;
            int len = data.Length;
            StringBuilder buf = new StringBuilder(data.Length * 3 / 2);
            var legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray();
            int end = len - 3;
            int i = start;
            int n = 0;

            while (i <= end)
            {
                int d = ((((int)data[i]) & 0x0ff) << 16)
                        | ((((int)data[i + 1]) & 0x0ff) << 8)
                        | (((int)data[i + 2]) & 0x0ff);

                buf.Append(legalChars[(d >> 18) & 63]);
                buf.Append(legalChars[(d >> 12) & 63]);
                buf.Append(legalChars[(d >> 6) & 63]);
                buf.Append(legalChars[d & 63]);

                i += 3;

                if (n++ >= 14)
                {
                    n = 0;
                    buf.Append(" ");
                }
            }

            if (i == start + len - 2)
            {
                int d = ((((int)data[i]) & 0x0ff) << 16)
                        | ((((int)data[i + 1]) & 255) << 8);

                buf.Append(legalChars[(d >> 18) & 63]);
                buf.Append(legalChars[(d >> 12) & 63]);
                buf.Append(legalChars[(d >> 6) & 63]);
                buf.Append("=");
            }
            else if (i == start + len - 1)
            {
                int d = (((int)data[i]) & 0x0ff) << 16;

                buf.Append(legalChars[(d >> 18) & 63]);
                buf.Append(legalChars[(d >> 12) & 63]);
                buf.Append("==");
            }

            return buf.ToString();
        }
        private static string Encrypt(string str, string sKey, byte[] iv)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Encoding.Default.GetBytes(str);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);// 密匙
            //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
            des.IV = iv;// 初始化向量
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            var retB = encode(ms.ToArray());
            return retB;
        }

        private static string Decrypt(string pToDecrypt, string sKey,byte[] iv)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
            //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = iv;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            // 如果两次密匙不一样,这一步可能会引发异常
            cs.FlushFinalBlock();

            return System.Text.Encoding.Default.GetString(ms.ToArray());
        }

  Java加密解密算法

  public static String decryptDES(String decryptString, String decryptKey) throws Exception {
        String afterDecryptString = null;
        byte[] byteMi = new Base64().decode(decryptString);
        try {
            SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(2, key);
            byte[] decryptData = cipher.doFinal(byteMi);
            afterDecryptString = new String(decryptData, "UTF-8");
        } catch (Exception e) {
            log.error("decryptDES error", e);
            throw e;
        }
        return afterDecryptString;
    }

  C#代码

  public static string Decrypt(string pToDecrypt, string sKey)
        {

            //var inputByteArray = ASCIIEncoding.ASCII.GetBytes(pToDecrypt);
            byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);

            using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) {
                //des.Padding =PaddingMode.PKCS7;
                des.Mode = CipherMode.ECB;
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    cs.Close();
                }
                string str = Encoding.UTF8.GetString(ms.ToArray());
                ms.Close();
                return str;
            }
        }

  

原文地址:https://www.cnblogs.com/Playfunny/p/11428934.html

时间: 2024-10-12 08:49:47

分享2个Java转C#加密解密的算法的相关文章

JAVA实现RSA加密解密 非对称算法

首先RSA是一个非对称的加密算法,所以在使用该算法加密解密之前,必须先行生成密钥对,包括公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实例如下: public static Map<String, Object> genKeyPair() throws Exception { // 获取公钥私钥密钥对的生成器 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // 初始化确定密

兼容PHP和Java的des加密解密代码分享

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

Java使用RSA加密解密签名及校验

由于项目要用到非对称加密解密签名校验什么的,于是参考<Java加密解密的艺术>写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享! RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; imp

java纯数字加密解密实例

我们都知道,在用户加入信息时,一些比較敏感的信息,如身份证号,手机号,用户的登录password等信息,是不能直接明文存进数据库的.今天我们就以一个详细的样例来说明一下纯数字的java加密解密技术. 一般我们从页面获取到用户加入的信息之后,进行加密然后存入到数据库.须要比对信息时,加密之后的用户信息我们看不懂,所以相应的我们就要用解密技术.事实上软考中对加密解密技术进行了非常全面的说明,这里我们就用一个比較简单的实例来说明一下. 我们可能会习惯在service层进行加密,这个没有太强制的要求.以

java 采用MD5加密解密

MD5加密解密 package endecrypt; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 采用MD5加密解密 * @author tfq * @datetime 2011-10-13 */ public class MD5Util { /*** * MD5加码 生成3

JAVA使用DES加密解密

在使用DES加密解密的时候,遇到了一些问题,廖记一下.如有哪位大神亲临留言指点,不胜感激. 先上代码: public DESUtil() { } //密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.*/ private stati

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger开源类来实现,不过那个是有一个文章,不过他加密出来的是16进制结果的.根本不能和JAVA互通.连加密出来的都不和C#原生的加密出来的结果格式一样.所以还是没有好的解决方法. 接下来还是不断的找资料,找方法.找朋友找同事.个个都找.问题是有的,方法也是有的,所以总结各路大神之后写了这个类.实现了私钥加