• AES加密解密在JAVA和ANDROID下互通


    <span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样。于是百度搜索发现还真是!</span>

    贴上AES加密核心:

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv)
    ;

    CBC是工作模式,AES一共同拥有电子password本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种模式。PKCS5Padding是填充模式,还有其他的填充模式:然后,cipher.init()一共同拥有三个參数:Cipher.ENCRYPT_MODE, key, zeroIv,zeroIv就是初始化向量,一个8为字符数组。工作模式、填充模式、初始化向量这三种因素一个都不能少。否则,假设你不指定的话。那么就要程序就要调用默认实现。

    知道原因就好办,各种调试測试之后完毕AES在JAVA和安桌互通。

    现贴上核心代码:

    /** 填充模式 */
    	private static final String transformation = "AES/CBC/PKCS5Padding";	
    	/**
    	 * 加密
    	 * 
    	 * @param content 须要加密的内容
    	 * @param password 加密密码
    	 * @return
    	 */
    	public static String encrypt(String content, String password) {
    		try {
    			IvParameterSpec zeroIv = new IvParameterSpec(password.getBytes());
    			SecretKeySpec key1 = new SecretKeySpec(password.getBytes(),"AES");
    			Cipher cipher = Cipher.getInstance(transformation);
    			cipher.init(Cipher.ENCRYPT_MODE, key1, zeroIv);
    			byte[] encryptedData = cipher.doFinal(content.getBytes());
    	        String encryptResultStr = parseByte2HexStr(encryptedData);
    	        return encryptResultStr;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param content 待解密内容
    	 * @param password 解密密钥
    	 * @return
    	 */
    	public static String decrypt(String content, String password) {
    		try {
    			
    			byte[] decryptFrom = parseHexStr2Byte(content);
    			IvParameterSpec zeroIv = new IvParameterSpec(password.getBytes());
    			SecretKeySpec key1 = new SecretKeySpec(password.getBytes(),"AES");
    			Cipher cipher = Cipher.getInstance(transformation);
    			cipher.init(Cipher.DECRYPT_MODE, key1, zeroIv);
    			byte decryptedData[] = cipher.doFinal(decryptFrom);
    			 return new String(decryptedData);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	/**将二进制转换成16进制 
    	 * @param buf 
    	 * @return 
    	 */  
    	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();  
    	}  
    	
    	/**将16进制转换为二进制 
    	 * @param hexStr 
    	 * @return 
    	 */  
    	public static byte[] parseHexStr2Byte(String hexStr) {  
            if (hexStr.length() < 1)  
                    return null;  
            byte[] result = new byte[hexStr.length()/2];  
            for (int i = 0;i< hexStr.length()/2; i++) {  
                    int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);  
                    int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  
                    result[i] = (byte) (high * 16 + low);  
            }  
            return result;  
    	}  
    最后我想说一下,花了积分最后还是解决不了互通。我仅仅想说不带这样骗积分的。



  • 相关阅读:
    拥有最多糖果的孩子
    求1+2+…+n
    网络-中间代理
    Header中的Referer属性表示
    ios13.4post请求出现网错错误 network err
    10.8&10.10
    9.23&9.27
    9.16&9.19
    校内模拟赛划水报告(9.9,9.11)
    男人八题 划水题解
  • 原文地址:https://www.cnblogs.com/llguanli/p/8416992.html
Copyright © 2020-2023  润新知