zoukankan      html  css  js  c++  java
  • 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进制转换。通信~~~~

  • 相关阅读:
    Day01
    微前端技术框架qiankun技术分享
    终于有人把O2O、C2C、B2B、B2C的区别讲透了
    Electron-Vue项目使用Element的el-table组件不显示
    monaco editor各种功能实现总结
    electron-vue项目使用elementUI组件报错$attrs is readonly
    monaco-editor 使用总结
    闲谈Monaco Editor-基本使用
    【软件】MATHTYPE破解记
    C# EF
  • 原文地址:https://www.cnblogs.com/blogs2014/p/15252858.html
Copyright © 2011-2022 走看看