zoukankan      html  css  js  c++  java
  • C#对接JAVA系统遇到的AES加密坑

    起因对接合作伙伴的系统,需要对数据进行AES加密

    默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午。最后网上查了下AES在JAVA里面的实现完整代码如下:

    public static String AesEncrypt(String content,String encyKey) {			
    		try {			 		
    			KeyGenerator kgen = KeyGenerator.getInstance("AES");
    			SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");   
    			secureRandom.setSeed(encyKey.getBytes());   
    			kgen.init(128, secureRandom);
    			Cipher cipher=Cipher.getInstance("AES");		
    			cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(kgen.generateKey().getEncoded(),"AES"));			
    			byte[] byteContent = content.getBytes("utf-8");
    	        byte[] result = cipher.doFinal(byteContent);	        
    			BASE64Encoder  encode = new BASE64Encoder (); 
    			String strResult=encode.encode(result);
    			return strResult;
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
    		return null;
      }
    

     根据博主:http://www.cnblogs.com/amylis_chen/p/6107162.html#commentform  的经验有了思路

    解决办法,通过JAVA代码生成AES的密钥,再通过C#代码进行AES加密

    //JAVA代码生成密钥
    		String encyKey="合作伙伴提供的密钥 ";
    		KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
            java.security.SecureRandom random = java.security.SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(encyKey.getBytes()); 
            kgen.init(128, random);  
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            BASE64Encoder coder = new BASE64Encoder();        
            System.out.println(coder.encode(enCodeFormat));
    

    C#代码进行AES加密

     class Program
        {
            static void Main(string[] args)
            {
                //默认密钥向量
                var result = AESEncode("123456", "JAVA代码输出的密钥");
                Console.WriteLine(result);
                Console.ReadLine();
    
            }
            public static string AESEncode(string encryptString, string encryptKey)
            {
                if (string.IsNullOrEmpty(encryptString)) return null;
                Byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptString);
                RijndaelManaged rm = new RijndaelManaged
                {
                    Key = Convert.FromBase64String(encryptKey),
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7
                };
                ICryptoTransform cTransform = rm.CreateEncryptor();
                Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
                return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            }
        }
    

    其他解决办法:让对方提供一个大包的dll进行调用

  • 相关阅读:
    haskell的分数运算
    我的自画像
    秋 天 19:4320:05
    不要逼孩子考100分
    看图写话
    转载:挺住,意味着一切
    Wpf UI框架 MaterialDesign 的使用记录
    通过蓝牙的RSSI计算两端之间的距离(一维定位)
    java tcp socket readline 阻塞问题处理
    Android Back返回键 退出
  • 原文地址:https://www.cnblogs.com/cainiaoji/p/6676500.html
Copyright © 2011-2022 走看看