• Tools
  • aes是什么意思?
    AES(AdvancedEncryptionStandard)是一种对称加密算法,也被称为Rijndael加密算法。它是一种高级密码学标准,被广泛应用于保护数据的机密性。AES算法采用分组密码技术,将明文分成固定长度的块,每个块的长度为128比特。对每个块进行加密后,得到密文,可以使用相同的密钥对密文进行解密,还原出明文。AES算法的密钥长度可以是128比特、192比特或256比特。密钥的长度越长,加密强度越高,但是加密和解密的速度也会变慢。AES算法的加密和解密速度相对较快,安全性较高,因此被广泛应用于数据的加密和解密。AES算法的加密过程分为四个步骤:SubBytes、ShiftRows、MixColumns和AddRoundKey。SubBytes阶段使用S盒替换每个块中的每个字节。S盒是一个16x16的字节替换表,将输入字节映射到输出字节,提供了一种非线性的替换机制。ShiftRows阶段对每个块中的每一行进行循环移位。第一行不进行移位,第二行左移一位,第三行左移两位,第四行左移三位。这个步骤提供了一种行移位的混淆机制。MixColumns阶段对每个块中的每一列进行线性变换。每个字节都被用作一个多项式的系数,在有限域上执行模多项式乘法。这个步骤提供了一种列混淆机制。AddRoundKey阶段将每个块中的每个字节与一个轮密钥进行异或。轮密钥是从原始密钥扩展生成的。这个步骤提供了一种密钥混淆机制。以上四个步骤可以组成一轮AES加密或解密。对于128比特密钥长度,AES加密需要10轮,对于192比特密钥长度,AES加密需要12轮,对于256比特密钥长度,AES加密需要14轮。AES算法的安全性基于它的密钥长度和算法的复杂度。AES算法的密钥长度越长,破解的难度就越大。目前,没有已知的攻击可以有效地破解AES算法。总之,AES算法是一种高级密码学标准,被广泛应用于数据的加密和解密。它采用分组密码技术,将明文分成固定长度的块,对每个块进行加密后,得到密文,可以使用相同的密钥对密文进行解密,还原出明文。AES算法的加密过程包括四个步骤:SubBytes、ShiftRows、MixColumns和AddRoundKey。AES算法的安全性基于它的密钥长度和算法的复杂度。
  • 怎样在ThinkPHP框架下实现AES加密和解密?
    在ThinkPHP框架下实现AES加密和解密可以使用PHP的openssl扩展库。具体步骤如下:加载openssl扩展库extension_loaded('openssl')ordie('请开启openssl扩展');生成随机向量$iv=openssl_random_pseudo_bytes(16);加密数据$ciphertext=openssl_encrypt($data,'AES-256-CBC',$key,OPENSSL_RAW_DATA,$iv);其中,$data是要加密的数据;'AES-256-CBC'是AES加密算法,采用CBC模式;$key是加密密钥;OPENSSL_RAW_DATA表示以原始数据格式输出;$iv是随机向量。解密数据$plaintext=openssl_decrypt($ciphertext,'AES-256-CBC',$key,OPENSSL_RAW_DATA,$iv);其中,$ciphertext是已加密的数据;'AES-256-CBC'表示AES加密算法,采用CBC模式;$key是解密密钥;OPENSSL_RAW_DATA表示以原始数据格式输入;$iv是随机向量。需要注意的是,$key的长度必须是16、24或32个字符,对应AES-128、AES-192和AES-256加密算法。如果$key的长度不足,可以使用补位函数进行填充。同时,在使用时还需要注意安全问题,比如存储密钥时需要加密或者其他安全措施等。
  • AES加密详解
    文章目录推荐AES简介对称加密加密模式填充模式常见填充模式PKCS5Padding到底是什么?偏移量字符集实际工作中的加密流程AES加密/解密注意的问题实战AES加解密AES默认实现类AES随机加密推荐AES加密—详解RSA加密—详解AES简介DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS)AES密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(DataEncryptionStandard),已经被多方分析且广为全世界所使用。为什么DES被废弃?我们知道数据加密标准(DataEncryptionStandard:DES)的密钥长度是56比特,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,DES将不能提供足够的安全性。简单来说,DES标准的秘钥长度要求太短,安全性不够。为什么AES算法被称为Rijndael算法?1997年1月2号,美国国家标准技术研究所(NationalInstituteofStandardsandTechnology:NIST)宣布希望征集高级加密标准(AdvancedEncryptionStandard:AES)[3],用以取代DES。AES得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS,下图分别为其中的5位作者。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。为什么AES算法安全性高?AES的区块长度固定为128位,密钥长度则可以是128bit,192bit或256位bit。换算成字节长度,就是密码必须是16个字节,24个字节,32个字节。AES密码的长度更长了,破解难度就增大了,所以就更安全。对称加密对称加密:也就是加密秘钥和解密秘钥是一样的。非对称加密:也就是加密秘钥和解密秘钥是不一样的。AES是对称加密算法,优点:加密速度快;缺点:如果秘钥丢失,就容易解密密文,安全性相对比较差RSA是非对称加密算法,优点:安全;缺点:加密速度慢AES加密需要:明文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES解密需要:密文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES的算法模式一般为AES/CBC/PKCS5Padding加密模式AES的加密模式有以下几种电码本模式(ECB)密码分组链接模式(CBC)计算器模式(CTR)密码反馈模式(CFB)输出反馈模式(OFB)密码分组链接模式(CBC):将整段明文切成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。电码本模式ECB(Electroniccodebook,ECB):需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。根据图示,在CBC模式下,使用AES加解密方式进行分组加解密时,需要用到的两个参数1、初始化向量,也就是偏移量2、加解密秘钥填充模式如电子密码本(ECB)和密文块链接(CBC)。为对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍,因此信息必须填充至满足要求。常见填充模式算法/模式/填充16字节加密后数据长度不满16字节加密后长度AES/CBC/NoPadding16不支持AES/CBC/PKCS5Padding3216AES/CBC/ISO10126Padding3216AES/CFB/NoPadding16原始数据长度AES/CFB/PKCS5Padding3216AES/CFB/ISO10126Padding3216AES/ECB/NoPadding16不支持AES/ECB/PKCS5Padding3216AES/ECB/ISO10126Padding3216AES/OFB/NoPadding16不支持AES/OFB/PKCS5Padding3216AES/OFB/ISO10126Padding3216AES/PCBC/NoPadding16不支持AES/PCBC/PKCS5Padding3216AES/PCBC/ISO10126Padding3216PKCS5Padding到底是什么?为什么JAVA里指定算法时,写的是AES/CBC/PKCS5Padding,每个都是什么含义,又有什么作用。AES,加解密算法CBC,数据分组模式PKCS5Padding,数据按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐,也可以叫补齐模式简单的说:拿到一个原始数据以后,首先需要对数据进行分组,分组以后如果长度不满足分组条件,需要进行补齐,最后形成多个分组,在使用加解密算法,对这多个分组进行加解密。所以这个过程中,AES,CBC,PKCS5Padding缺一不可。在对数据进行加解密时,通常将数据按照固定的大小(blocksize)分成多个组,那么随之就产生了一个问题,如果分到最后一组,不够一个blocksize了,要怎么办?此时就需要进行补齐操作。补齐规则:Thevalueofeachaddedbyteisthenumberofbytesthatareadded,i.e.Nbytes,eachofvalueNareadded.举例:36位的UUID,如果按照blocksize=16字节(即128比特),那么就需要补齐到48位,差12个字节。那么最后填充的12个字节的内容,都是字节表示的0x0c(即12)。偏移量偏移量的添加一般是为了增加AES加密的复杂度,增加数据的安全性。一般在AES_256中会使用到偏移量,而在AES_128加密中不会使用到。字符集在AES加密中,特别也要注意到字符集的问题。一般用到的字符集是utf-8和gbk。实际工作中的加密流程在实际的工作中,客户端跟服务器交互一般都是字符串格式,所以一个比较好的加密流程是:加密流程:明文通过密钥(有时也需要偏移量),利用AES加密算法,然后通过Base64转码,最后生成加密后的字符串。解密流程:加密后的字符串通过密钥(有时也需要偏移量),利用AES解密算法,然后通过Base64转码,最后生成解密后的字符串。AES加密/解密注意的问题AES加密/解密的时候,通常是用在服务端和客户端通讯的过程中,一端加密传输,另一端解密使用。虽然AES加密看似简单,但在使用过程过程中,仍然会出现在一端加密ok,但是另一端解密失败的情况。一旦出现AES解密失败,我们可以通过以下几个方面进行排查:1. AES 加密/解密 使用相同的密钥2. 若涉及到偏移量,则AES 加密/解密 使用的偏移量要一样3. AES 加密/解密 要使用相同加密数位,如都使用`AES_256`4. AES 加密/解密 使用相同的字符集5. AES 加密/解密 使用相同的加密,填充模式,如都使用`AES/CBC/PKCS5Padding`模式6. 由于不同开发语言(如C 和 Java)及不同开发环境(如 Java 和 Android)的影响,可能相同的加解密算法在实现上出现差异,若你们注意到这个差异,就可能导致加解密出现问题123456最后,当我们需要验证自己的AES解密算法是否与别人的加密方法为一套的时候。可以让加密方发你一份加密后的密文和加密前的明文,然后你用密文解密,看解密结果和加密方发你的是否一致。需要注意的是,加密方给你的明文要尽量简洁,如就中国二字,这样既能看出加密方和解密方的字符集是否一致,而且能避免复制粘贴等环节出现空格,回车等转义字符对验证结果的干扰。实战AES加解密首先定义加密、解密工具类import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES {    /**     * AES加密     *     * @param key     * @param iv     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] encryptAes(byte[] data, byte[] key, byte[] iv)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        return cipher.doFinal(data);    }    /**     * AES解密     *     * @param key     * @param iv     * @return     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] decryptAesToByteString(byte[] data, byte[] key, byte[] iv)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        return cipher.doFinal(data);    }}12345678910111213141516171819202122232425262728293031323334353637383940414243加密和解密的代码很像,唯一的不同点是,加密Cipher.ENCRYPT_MODE,解密用的是Cipher.DECRYPT_MODE下面我们写一个测试代码:        try {            //加密密码            String key = "zhaoyanjunzhaoy1";            //偏移量            String iv = "1234567890123456";            String message = "今天是周二,我好开心";            //加密            byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes(), iv.getBytes());            //解密            byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes(), iv.getBytes());            System.out.println("解密数据 = " + new String(decryResult));        } catch (IOException | GeneralSecurityException e) {            e.printStackTrace();        }123456789101112131415161718输出结果:解密数据 = 今天是周二,我好开心1可以看到数据已经正常解密了。AES默认实现类不带模式和填充来获取AES算法的时候,其默认使用AES/ECB/PKCS5Padding(输入可以不是16字节,也不需要填充向量),所以不需要偏移量参数Cipher cipher = Cipher.getInstance("AES");1我下面封装一个工具类import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES {    /**     * AES加密     *     * @param key     * @throws GeneralSecurityException     */    public static byte[] encryptAes(byte[] data, byte[] key) throws GeneralSecurityException {        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));        return cipher.doFinal(data);    }    /**     * AES解密     *     * @param key     * @return     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] decryptAesToByteString(byte[] data, byte[] key)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));        return cipher.doFinal(data);    }}12345678910111213141516171819202122232425262728293031323334353637测试代码public class T2 {    public static void main(String[] args) {        try {            //加密密码            String key = "zhaoyanjunzhaoy1";            //加密正文            String message = "今天是周二,我好开心";            //加密            byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes());            //解密            byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes());            System.out.println("解密数据 = " + new String(decryResult));        } catch (IOException | GeneralSecurityException e) {            e.printStackTrace();        }    }}12345678910111213141516171819202122测试结果解密数据 = 今天是周二,我好开心1AES随机加密在上面的例子中,我们在AES加密中,需要指定规定长度的密码,偏移量。在Java中还给我们提供了KeyGenerator类来随机生成一个密码和偏移量,解决了我们动脑想密码的问题。我们来看看随机加密怎么用。 /**     * AES加密/解密     *     * @throws GeneralSecurityException     */    public void encryptAes() throws GeneralSecurityException {        //原始数据        String message = "今天是周四,好开心哦";        byte[] data = message.getBytes();        //指定加密类型        KeyGenerator keygen = KeyGenerator.getInstance("AES");        //指定秘钥长度        keygen.init(256);        SecretKey secretKey = keygen.generateKey();        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");        cipher.init(Cipher.ENCRYPT_MODE, secretKey);        //获取秘钥        byte[] key = secretKey.getEncoded();        //获取偏移量        byte[] iv = cipher.getIV();        //解密数据        byte[] ciphertext = cipher.doFinal(data);        //解密数据        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        byte[] decryMessage = cipher.doFinal(ciphertext);        System.out.println("解密数据 = " + new String(decryMessage));    }123456789101112131415161718192021222324252627282930313233这种加密key,iv都是随机产生的,每次加密后的密文都不一样,适合一定的特殊场景。随机是怎么发生的,我们就看cipher.init(Cipher.ENCRYPT_MODE, secretKey);1在init方法的时候,JceSecurity.RANDOM产生随机数,源码如下:   public final void init(int opmode, Key key) throws InvalidKeyException {        init(opmode, key, JceSecurity.RANDOM);    }123具体细节就不看了,知道原理就行。
  • 1
最新文章
  • jpg怎么转换成ico图标
  • json是什么意思
  • 如何进行网站流量统计分析?
  • 网页定时刷新是干嘛的
  • user agent检测详解
  • 支付宝微信二维码如何合并?
  • 如何制作ico图标
  • 随机密码生成器安全吗?
  • Base64是什么
  • 时间戳是什么意思
冀ICP备2020020658号