netcore对接java ase加密

参考:https://www.cnblogs.com/aishangyipiyema/p/9948011.html

参考:https://www.shuzhiduo.com/A/GBJrE78Wz0/

 

JAVA代码

package kevin.demo;


import com.sun.org.apache.xpath.internal.objects.XString;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;


public class Hello {



        //算法名称/加密模式/数据填充方式
        private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
        /**
         * 加密
         * @param content    加密的字符串
         * @param encryptKey key值
         * @return String 密文
         * @throws Exception
         */
        public static String encrypt(String content, String encryptKey){
            try {
                final BASE64Encoder encoder = new BASE64Encoder();

                KeyGenerator kGen = KeyGenerator.getInstance("AES");
                kGen.init(128);
                Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
                //根据加密规则拆分成字节,并加密
                SecretKeySpec ss=new SecretKeySpec(encryptKey.getBytes(), "AES");
                String wxd=parseByte2HexStr(ss.getEncoded());
                cipher.init(Cipher.ENCRYPT_MODE, ss);
                //密文utf8转码后存在字节数组中
                byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
                //采用base64算法进行转码
                return  encoder.encode(b);
            } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) {
                return null;
            }
        }
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

        /**
         * 解密
         *
         * @param encryptStr 解密的字符串
         * @param decryptKey 解密的key值
         * @return String 明文
         * @throws Exception
         */
        public static String decrypt(String encryptStr, String decryptKey)  {
            final BASE64Decoder decoder = new BASE64Decoder();
            try {
                KeyGenerator kGen = KeyGenerator.getInstance("AES");//根据AES生成密钥
                kGen.init(128);
                Cipher cipher = Cipher.getInstance(ALGORITHMSTR);//加密规则
                //根据加密规则拆分成字节,并解密,获取解密方案
                cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
                //采用base64算法进行转码
                byte[] encryptBytes = new byte[0];
                try {
                    encryptBytes = decoder.decodeBuffer(encryptStr);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                byte[] decryptBytes = cipher.doFinal(encryptBytes);
                return new String(decryptBytes, StandardCharsets.UTF_8);
            } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) {

                return null;
            }
        }



    public static void main(String[] args) {
        String dd=encrypt("wxd5617","1234560123456789");
        String dd2=decrypt(dd,"1234560123456789");
        System.out.println(dd);

        System.out.println(dd2);
        }
    }

 

 

NetCore代码

using System;
using System.Security.Cryptography;
using System.Text;

namespace JAVAAESForCshap
{

    public static class EncryptDecryptTool
    {
        /// <summary>
        /// 这个key来自java代码的wxd
        /// </summary>
        private const string key = "31323334353630313233343536373839";

        /// <summary>
        /// MD5哈希计算
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        //public static byte[] ConvertStringToMD52(string key)
        //{

        //    //byte[] ByteData = Encoding.UTF8.GetBytes(key);
        //    //MD5 oMd5 = MD5.Create();
        //    //byte[] HashData = oMd5.ComputeHash(ByteData);

        //    return Convert.ToString(key, 2); 
        //}


        private static byte[] ConvertStringToMD5(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }

        /// <summary>
        /// AES加密 
        /// </summary>
        /// <param name="toEncrypt"></param>
        /// <returns></returns>
        public static string Encrypt(string toEncrypt)
        {
            byte[] keyArray = ConvertStringToMD5(key);
            byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.Key = keyArray;
            rDel.Mode = CipherMode.ECB;
            rDel.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="toDecrypt"></param>
        /// <returns></returns>
        public static string Decrypt(string toDecrypt)
        {
            byte[] keyArray = ConvertStringToMD5(key);
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.Key = keyArray;
            rDel.Mode = CipherMode.ECB;
            rDel.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = rDel.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Encoding.UTF8.GetString(resultArray);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            /*
             OoU0cxhvu/kgut0FAJ0IWg==
            wxd5617
             */
            //var dd = AesEncrypt("wxd5617", "1234560123456789");
            //Console.WriteLine(dd);
            //var dd2= AesDecrypt(dd, "1234560123456789");
            //Console.WriteLine(dd2);
            var dd = EncryptDecryptTool.Encrypt("wxd5617");
            Console.WriteLine(dd);
            if (dd == "OoU0cxhvu/kgut0FAJ0IWg==")
            {
                Console.WriteLine("加密一致");
            }

        }
    }
}

 

 

参考链接1,是java对key有进行特殊处理,而这个特殊处理辨识md5哈希加密。

而实际场景中,java代码,key直接转为数组进行加密的,因java和c#数组排列不同——具体参考文章2.所以进行16进制转换。通信~~~~

 

posted @ 2021-09-10 19:41  淘小人  阅读(243)  评论(0编辑  收藏  举报