添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具。

密钥长度问题

默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误
Invalid AES key length

你需要下载一个支持更长密钥的包。这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6,可以从这里下载,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

下载之后,解压后,可以看到其中包含两个包:

local_policy.jar
US_export_policy.jar
看一下你的 JRE 环境,将 JRE 环境中 lib\lib\security 中的同名包替换掉。

废话不多说,上代码

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
 * 算法工具
 * @author Babylon [email protected]
 * @date 2014-8-15 上午8:41:49
public class AlgorithmUtil {
    public final static String ENCODING = "UTF-8";
    /**将二进制转换成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;   
     * 生成密钥 
     * 自动生成base64 编码后的AES128位密钥 
     * @throws NoSuchAlgorithmException 
     * @throws UnsupportedEncodingException 
    public static String getAESKey() throws Exception {  
        KeyGenerator kg = KeyGenerator.getInstance("AES");  
        kg.init(128);//要生成多少位,只需要修改这里即可128, 192或256  
        SecretKey sk = kg.generateKey();  
        byte[] b = sk.getEncoded();
        return parseByte2HexStr(b);
     * AES 加密 
     * @param base64Key   base64编码后的 AES key
     * @param text  待加密的字符串
     * @return 加密后的byte[] 数组
     * @throws Exception
    public static byte[] getAESEncode(String base64Key, String text) throws Exception{  
        byte[] key = parseHexStr2Byte(base64Key);
        SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");  
        Cipher cipher = Cipher.getInstance("AES");  
        cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);  
        byte[] bjiamihou = cipher.doFinal(text.getBytes(ENCODING));  
        return bjiamihou;  
     * AES解密
     * @param base64Key   base64编码后的 AES key
     * @param text  待解密的字符串
     * @return 解密后的byte[] 数组
     * @throws Exception
    public static byte[] getAESDecode(String base64Key, byte[] text) throws Exception{  
        byte[] key = parseHexStr2Byte(base64Key);
        SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");  
        Cipher cipher = Cipher.getInstance("AES");  
        cipher.init(Cipher.DECRYPT_MODE, sKeySpec);  
        byte[] bjiemihou = cipher.doFinal(text);  
        return bjiemihou;
import com.util.AlgorithmUtil;
 * 算法测试
 * @author babylon
 * 2016年5月16日
public class AlgorithmTest {
    public static void main(String[] args) {
        try {
            String hexKey = new AlgorithmUtil().getAESKey();
            System.out.println("16进制秘钥:"+hexKey);
            byte[] encoded = AlgorithmUtil.getAESEncode(hexKey, "我要把你嘿嘿嘿");
            // 注意,这里的encoded是不能强转成string类型字符串的
            byte[] decoded = AlgorithmUtil.getAESDecode(hexKey, encoded);
            System.out.println(new String(decoded, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();

博主发现执行算法总有些延迟,还没非对称RSA快,希望有识之士能提供些见解。
RSA算法: http://blog.csdn.net/jack85986370/article/details/51423322

最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具。废话不多说,上代码import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;impor
做国外电表DLMS加解密必用的算法,费劲我几个月的整理修改,总算把这GCM-AES-128的加解密算法和密钥传输的包裹算法弄好。算是商业机密吧,呵呵!据说有厂家为数据传输加解密前前后后搞了2年。 压缩包里有三个代码文件,附有测试程序和测试数据。 同行的人,肯定认为这10分值的。
Base64.encodeBase64String(secretKey.getEncoded())是apache的commons-codec库,二进制经base64编码为字符串 //cfb package com.dddd.codec; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; impo...
在网上找了一大堆资料,总有把AES加密有点弄懂了。这里推荐一个人写的博客。再次非常感谢这大侠。http://hi.baidu.com/mallor/item/89dad214d1f1fe0dd1d66d33 写的详单详细。 我再啰嗦一下,我对AES的心得。 其实AES就是
package com.gwghk.frontoffice.util; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec;  * @author Dean.li public class AES { /**将二进制转换成16进制       * @param bu
AES算法简介 AES是一种对称加密算法,或称分组对称加密算法。 是Advanced Encryption Standard高级加密标准,简称AES AES的基本要求是,采用对称分组密码体制。分组密码算法通常由密钥扩展算法加密解密算法两部分组成 AES加密数据块分组长度必须为128比特(bit),密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足...
安全检查时要求账号和密码加密后才能存到数据库中,要求加密算法如下: 1)分组密码算法AES(密钥长度在128及以上)(GCM或CBC模式) 2)流密码算法AES(密钥长度在128及以上)(OFB或CTR模式)、chacha20 3)非对称加密算法:RSA(2048及以上)、ECC(256以上) 4)哈希算法:SHA2、SHA3 5)密钥交换算法:DSA/DH(密钥长度2048及以上)...
AES(Advanced Encryption Standard)是一种对称加密算法,它可以加密解密数据。AES 128AES算法中使用的一种密钥长度,表示密钥长度是128。 C语言是一种高级编程语言,非常适合用于开发安全性高的应用程序。因此,C语言与AES128加密解密算法的结合可以实现可靠且高效的数据加密解密AES 128算法加密过程如下: 1. 将明文数据分为16字节的块。 2. 将每个块与密钥进行异或运算。 3. 进行11轮加密,每轮的操作包括字节替换、行移、列混淆和密钥加法。 4. 最后一轮不进行列混淆操作。 5. 将所有的加密块组合起来,形成密文数据。 AES 128算法解密过程与加密过程相似,但操作的顺序与加密过程相反。解密过程如下: 1. 将密文数据分为16字节的块。 2. 进行11轮解密,每轮的操作包括逆字节替换、逆行移、逆列混淆和密钥加法。 3. 最后一轮不进行逆列混淆操作。 4. 将每个块与密钥进行异或运算。 5. 将所有的解密块组合起来,形成明文数据。 C语言实现AES 128算法可以使用现成的开源库,如OpenSSL等。也可以自己编写代码实现。实现过程需要理解字节序转换、数组操作等基本概念,以及AES算法的具体细节。此外,为了保证加密算法的可靠性,还需进行严格的测试和验证。