aesjava,AESJavaScript

发布时间:2023-01-03

本文目录一览:

  1. JAVA AES算法,详细点。
  2. java如何用Aes加密和解密
  3. java实现aes加密或者解密,不用工具包的怎么做
  4. 如何使用java对密码加密 加密方式aes
  5. JAVA AES加密

JAVA AES算法,详细点。

/**
 *
 *
 */
package com.rsa;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class AESEncrypter {
    public static byte[] iv = new byte[] { 82, 22, 50, 44, -16, 124, -40, -114, -87, -40, 37, 23, -56, 23, -33, 75 };
    private static AESEncrypter aes = null;
    public static byte[] key1 = new byte[] { -42, 35, 67, -86, 19, 29, -11, 84, 94, 111, 75, -104, 71, 46, 86, -21, -119, 110, -11, -32, -28, 91, -33, -46, 99, 49, 2, 66, -101, -11, -8, 56 };
    private AESEncrypter() {
    }
    public static synchronized AESEncrypter getInstance() {
        if (aes == null) {
            aes = new AESEncrypter();
        }
        return aes;
    }
    public String encrypt(String msg) {
        String str = "";
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(key1));
            AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
            SecretKey key = kgen.generateKey();
            Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            str = asHex(ecipher.doFinal(msg.getBytes()));
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return str;
    }
    public String decrypt(String value) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(key1));
            AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
            SecretKey key = kgen.generateKey();
            Cipher dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
            return new String(dcipher.doFinal(asBin(value)));
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return "";
    }
    private String asHex(byte buf[]) {
        StringBuffer strbuf = new StringBuffer(buf.length * 2);
        int i;
        for (i = 0; i < buf.length; i++) {
            if (((int) buf[i] & 0xff) < 0x10)
                strbuf.append("0");
            strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
        }
        return strbuf.toString();
    }
    private byte[] asBin(String src) {
        if (src.length() < 1)
            return null;
        byte[] encrypted = new byte[src.length() / 2];
        for (int i = 0; i < src.length() / 2; i++) {
            int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);
            encrypted[i] = (byte) (high * 16 + low);
        }
        return encrypted;
    }
    public static void main(String args[]) {
        String str = AESEncrypter.getInstance().encrypt("192.168.30.193.123");
        System.out.println(str);
        System.out.println(AESEncrypter.getInstance().decrypt(str));
    }
}

java如何用Aes加密和解密

你解密的key必须是加密的key啊 你看看,你解密的时候又KeyGenerator.getInstance("AES").generateKey();这是重新搞了一个key啊,当然解不出来了 我估计你这代码人家原先是写在一起的吧,加密完了再直接解密给你看,人家只generateKey一次,自然很顺利,你分成了两个例子,居然分别generateKey,自然失败

java实现aes加密或者解密,不用工具包的怎么做

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.*;
import javax.crypto.spec.*;
/**
 *
 *
 * @author wchun
 *
 *
 * AES128 算法,加密模式为ECB,填充模式为 pkcs7(实际就是pkcs5)
 *
 *
 */
public class AES {
    static final String algorithmStr="AES/ECB/PKCS5Padding";
    static private KeyGenerator keyGen;
    static private Cipher cipher;
    static boolean isInited=false;
    //初始化
    static private void init()
    {
        //初始化keyGen
        try {
            keyGen=KeyGenerator.getInstance("AES");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        keyGen.init(128);
        //初始化cipher
        try {
            cipher=Cipher.getInstance(algorithmStr);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        isInited=true;
    }
    public static byte[] GenKey()
    {
        if(!isInited)//如果没有初始化过,则初始化
        {
            init();
        }
        return keyGen.generateKey().getEncoded();
    }
    public static byte[] Encrypt(byte[] content,byte[] keyBytes)
    {
        byte[] encryptedText=null;
        if(!isInited)//为初始化
        {
            init();
        }
        Key key=new SecretKeySpec(keyBytes,"AES");
        try {
            cipher.init(Cipher.ENCRYPT_MODE, key);
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            encryptedText=cipher.doFinal(content);
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return encryptedText;
    }
    //解密为byte[]
    public static byte[] DecryptToBytes(byte[] content,byte[] keyBytes)
    {
        byte[] originBytes=null;
        if(!isInited)
        {
            init();
        }
        Key key=new SecretKeySpec(keyBytes,"AES");
        try {
            cipher.init(Cipher.DECRYPT_MODE, key);
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //解密
        try {
            originBytes=cipher.doFinal(content);
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return originBytes;
    }
}

如何使用java对密码加密 加密方式aes

Java有相关的实现类:具体原理如下 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。 对于每个128位长度的明文分组的加密过程如下: (1)将128位AES明文分组放入状态矩阵中。 (2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。 (3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:

  • SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;
  • ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;
  • MixColumns变换:MixColumns变换对状态矩阵的列进行变换;
  • AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。 最后一轮的子加密步骤如下:
  • SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;
  • ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;
  • AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作; (4)经过10轮循环的状态矩阵中的内容就是加密后的密文。 AES的加密算法的伪代码如下。 在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的膨胀后的密钥,这44个字的膨胀后的密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。 三.AES的分组过程 对于任意长度的明文,AES首先对其进行分组,分组的方法与DES相同,即对长度不足的明文分组后面补充0即可,只是每一组的长度为128位。 AES的密钥长度有128比特,192比特和256比特三种标准,其他长度的密钥并没有列入到AES联邦标准中,在下面的介绍中,我们将以128位密钥为例。 四.状态矩阵 状态矩阵是一个4行、4列的字节矩阵,所谓字节矩阵就是指矩阵中的每个元素都是一个1字节长度的数据。我们将状态矩阵记为State,State中的元素记为Sij,表示状态矩阵中第i行第j列的元素。128比特的明文分组按字节分成16块,第一块记为“块0”,第二块记为“块1”,依此类推,最后一块记为“块15”,然后将这16块明文数据放入到状态矩阵中,将这16块明文数据放入到状态矩阵中的方法如图2-2-1所示。
块0   块4   块8   块12
块1   块5   块9   块13
块2   块6   块10  块14
块3   块7   块11  块15

图2-2-1 将明文块放入状态矩阵中 五.AddRoundKey变换 状态矩阵生成以后,首先要进行AddRoundKey变换,AddRoundKey变换将状态矩阵与膨胀后的密钥进行按位异或运算,如下所示。 其中,c表示列数,数组W为膨胀后的密钥,round为加密轮数,Nb为状态矩阵的列数。 它的过程如图2-2-2所示。 图2-2-2 AES算法AddRoundKey变换 六.10轮循环 经过AddRoundKey的状态矩阵要继续进行10轮类似的子加密过程。前9轮子加密过程中,每一轮要经过4种不同的变换,即SubBytes变换、ShiftRows变换、MixColumns变换和AddRoundKey变换,而最后一轮只有3种变换,即SubBytes变换、ShiftRows变换和AddRoundKey变换。AddRoundKey变换已经讨论过,下面分别讨论余下的三种变换。 1.SubBytes变换 SubBytes是一个独立作用于状态字节的非线性变换,它由以下两个步骤组成: (1)在GF(2^8)域,求乘法的逆运算,即对于α∈GF(2^8)求β∈GF(2^8),使αβ =βα = 1mod(x^8 + x^4 + x^3 + x + 1)。 (2)在GF(2^8)域做变换,变换使用矩阵乘法,如下所示: 由于所有的运算都在GF(2^8)域上进行,所以最后的结果都在GF(2^8)上。若g∈GF(2^8)是GF(2^8)的本原元素,则对于α∈GF(2^8),α≠0,则存在 β ∈ GF(2^8),使得: β = g^α mod(x^8 + x^4 + x^3 + x + 1) 由于g^255 = 1mod(x^8 + x^4 + x^3 + x + 1) 所以g^(255-α) = β^-1 mod(x^8 + x^4 + x^3 + x + 1) 根据SubBytes变换算法,可以得出SubBytes的置换表,如表2-2-1所示,这个表也叫做AES的S盒。该表的使用方法如下:状态矩阵中每个元素都要经过该表替换,每个元素为8比特,前4比特决定了行号,后4比特决定了列号,例如求SubBytes(0C)查表的0行C列得FE。 表2-2-1 AES的SubBytes置换表 它的变换过程如图2-2-3所示。 图2-2-3 SubBytes变换 AES加密过程需要用到一些数学基础,其中包括GF(2)域上的多项式、GF(2^8)域上的多项式的计算和矩阵乘法运算等,有兴趣的同学请参考相关的数学书籍。 2.ShiftRows变换 ShiftRows变换比较简单,状态矩阵的第1行不发生改变,第2行循环左移1字节,第3行循环左移2字节,第4行循环左移3字节。ShiftRows变换的过程如图2-2-4所示。 图2-2-4 AES的ShiftRows变换 3.MixColumns变换 在MixColumns变换中,状态矩阵的列看作是域GF(2^8)的多项式,模(x^4+1)乘以c(x)的结果: c(x)=(03)x^3+(01)x^2+(01)x+(02) 这里(03)为十六进制表示,依此类推。c(x)与x^4+1互质,故存在逆: d(x)=(0B)x^3+(0D)x^2+(0G)x+(0E)使c(x)•d(x) = (D1)mod(x^4+1)。 设有: 它的过程如图2-2-5所示。 图2-2-5 AES算法MixColumns变换 七.密钥膨胀 在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,膨胀后的密钥记为子密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的子密钥,这44个字的子密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。 密钥膨胀算法是以字为基础的(一个字由4个字节组成,即32比特)。128比特的原始密钥经过膨胀后将产生44个字的子密钥,我们将这44个密钥保存在一个字数组中,记为W[44]。128比特的原始密钥分成16份,存放在一个字节的数组:Key[0],Key[1]……Key[15]中。 在密钥膨胀算法中,Rcon是一个10个字的数组,在数组中保存着算法定义的常数,分别为: Rcon[0] = 0x01000000
Rcon[1] = 0x02000000
Rcon[2] = 0x04000000
Rcon[3] = 0x08000000
Rcon[4] = 0x10000000
Rcon[5] = 0x20000000
Rcon[6] = 0x40000000
Rcon[7] = 0x80000000
Rcon[8] = 0x1b000000
Rcon[9] = 0x36000000
另外,在密钥膨胀中包括其他两个操作RotWord和SubWord,下面对这两个操作做说明: RotWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3进行循环移位,即 RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 ) SubWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3使用AES的S盒,即 SubWord( B0,B1,B2,B3 ) = ( B’0,B’1,B’2,B’3 ) 其中,B’i = SubBytes(Bi),i = 0,1,2,3。 密钥膨胀的算法如下: 八.解密过程 AES的加密和解密过程并不相同,首先密文按128位分组,分组方法和加密时的分组方法相同,然后进行轮变换。 AES的解密过程可以看成是加密过程的逆过程,它也由10轮循环组成,每一轮循环包括四个变换分别为InvShiftRows变换、InvSubBytes变换、InvMixColumns变换和AddRoundKey变换; 这个过程可以描述为如下代码片段所示: 九.InvShiftRows变换 InvShiftRows变换是ShiftRows变换的逆过程,十分简单,指定InvShiftRows的变换如下。 Sr,(c+shift(r,Nb))modNb= Sr,c for 0 ≤ r < 4 and 0 ≤ c < Nb 图2-2-6演示了这个过程。 图2-2-6 AES算法InvShiftRows变换 十.InvSubBytes变换 InvSubBytes变换是SubBytes变换的逆变换,利用AES的S盒的逆作字节置换,表2-2-2为InvSubBytes变换的置换表。 表2-2-2 InvSubBytes置换表 十一.InvMixColumns变换 InvMixColumns变换与MixColumns变换类似,每列乘以d(x) d(x) = (0B)x^3 + (0D)x^2 + (0G)x + (0E) 下列等式成立: ( (03)x^3 + (01)x^2 + (01)x + (02) )⊙d(x) = (01) 上面的内容可以描述为以下的矩阵乘法: 十二.AddRoundKey变换 AES解密过程的AddRoundKey变换与加密过程中的AddRoundKey变换一样,都是按位与子密钥做异或操作。解密过程的密钥膨胀算法也与加密的密钥膨胀算法相同。最后状态矩阵中的数据就是明文。

JAVA AES加密

使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters Illegal key size or default parameters是指密钥长度是受限制的,java运行时环境读到的是受限的policy文件。文件位于${java_home}/jre/lib/security 这种限制是因为美国对软件出口的控制。 解决办法: 去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.网址如下。 下载包的readme.txt 有安装说明。就是替换${java_home}/jre/lib/security/ 下面的local_policy.jarUS_export_policy.jar jdk 5: