问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Rijndael加密法

发布网友 发布时间:2022-11-09 14:44

我来回答

1个回答

热心网友 时间:2023-11-19 08:09

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦*采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 “Rhinedoll”)

AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。

对称密码*的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该*的设计要点。

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

AES的基本要求是,采用对称分组密码*,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,*生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国*正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES.

AES加密数据块大小最大是256bit,但是密钥大小在理论上没有上限。AES加密有很多轮的重复和变换。大致步骤如下:

1. 密钥扩展(KeyExpansion)

2. 初始轮(Initial Round)

3. 重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey

4. 最终轮(Final Round),最终轮没有MixColumns。

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.SecretKeySpec;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

public abstract class AesHelper {

    /**

    * 加密

    *

    * @param content 需要加密的内容

    * @param salt    加密密码

    * @return

    */

    public static byte[] encrypt(String content, String salt) {

        try {

            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

            random.setSeed(salt.getBytes());

            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            kgen.init(128, random);

            SecretKey secretKey = kgen.generateKey();

            byte[] enCodeFormat = secretKey.getEncoded();

            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

            Cipher cipher = Cipher.getInstance("AES");// 创建密码器

            byte[] byteContent = content.getBytes("utf-8");

            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

            byte[] result = cipher.doFinal(byteContent);

            return result; // 加密

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        }

        return null;

    }

    /**

    * 解密

    *

    * @param content 待解密内容

    * @param salt    解密密钥

    * @return

    */

    public static byte[] decrypt(byte[] content, String salt) {

        try {

            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

            secureRandom.setSeed(salt.getBytes());

            kgen.init(128, secureRandom);

            SecretKey secretKey = kgen.generateKey();

            byte[] enCodeFormat = secretKey.getEncoded();

            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

            Cipher cipher = Cipher.getInstance("AES");// 创建密码器

            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化

            byte[] result = cipher.doFinal(content);

            return result; // 加密

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        }

        return null;

    }

    public static String bytesToHexString(byte[] src) {

        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < src.length; i++) {

            String hex = Integer.toHexString(src[i] & 0xFF);

            if (hex.length() == 1) {

                hex = '0' + hex;

            }

            sb.append(hex.toUpperCase());

        }

        return sb.toString();

    }

    public static String encryptToStr(String content, String password){

        return bytesToHexString(encrypt(content,password));

    }

    public static byte[] decrypt(String content, String keyWord) {

        return decrypt(hexStringToBytes(content), keyWord);

    }

    public static byte[] hexStringToBytes(String hexString) {

        if (hexString.length() < 1)

            return null;

        byte[] result = new byte[hexString.length() / 2];

        for (int i = 0; i < hexString.length() / 2; i++) {

            int high = Integer.parseInt(hexString.substring(i * 2, i * 2 + 1), 16);

            int low = Integer.parseInt(hexString.substring(i * 2 + 1, i * 2 + 2), 16);

            result[i] = (byte) (high * 16 + low);

        }

        return result;

    }

}

public class TestMain {

    public void main(){

        String content = "carl.zhao";

        String Key = "http://www.csdn.net";

        //加密

        String encryptResult = AesHelper.encryptToStr(content, Key);

        //解密

        byte[] decryptResult = AesHelper.decrypt(encryptResult,Key);

        Assert.assertEquals(content, new String(decryptResult));

    }

}

输出结果:

@@eac7cf4369966a656d1355939632cab1611696f7aed973b20f13e8a0e08f1b2ae51d24b41678e12267cd7d8e549674b0fef081fbc0557ec7a7f1eb37bf28e4645a0f6863dae03c2278ea668b03b50102@@
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脚崴了挂什么科、急急急 linux 解压缩工具--tar命令 生日祝福语闺蜜 简短独特暖心 QQ有哪些隐藏的图标??他们分别是什么??怎么样点亮?? QQ业务的各种图标怎么点亮? qq怎么点亮图标和名字 诗中书万象=求下联 大爱如山藏万象下联 中国电子展:电位器和可调电阻的区别是什么?这四点很明显 电位器的接线方法是什么 电位器的工作原理如何 小舞怀孕,为什么让唐三在书房里睡? 加班还是不加班啊啊!怎么办好呢?!!! during the trial什么意思及同义词 during the day的同义词组是什么 在这个疫情期间你做了什么用英语过去式写? 推荐一下学习哲学的优秀网站! 中国有什么著名的哲学论坛或网站吗? 看哲学类需要在那个网站 请大家推荐一下比较好的哲学网站。 哪里有读哲学的网 找一些可以学习哲学的网站 学哲学的网站? 《大师的盛宴二十世纪最佳科幻小说选》pdf下载在线阅读,求百度网盘云资源 气排球5人站位规定 thingkpdap490这台笔记本值得推荐购买吗? 蠕虫之语效果 小动物怎样睡觉小班主题教案 蠕虫之语特性 哪个品牌的紫砂锅最正宗 打出来的人才读后感 物学网登录密码忘记了怎么办。 16进制 源码和加密后的 高手给个解密的方向吧! 看图写话一只母羊和一只小羊在田野里吃庄稼 一年级小明赶羊看图写话 超好看故事app怎么下载不了 《夜行超好看03》txt下载在线阅读全文,求百度网盘云资源 谁能介绍点好看的小说啊,我要下载到MP3里面的,要超级好看的 《奇情寐语超好看16》pdf下载在线阅读,求百度网盘云资源 《奇情寐语超好看16》pdf下载在线阅读全文,求百度网盘云资源 《夜行超好看03》pdf下载在线阅读,求百度网盘云资源 《奇情寐语超好看16》epub下载在线阅读全文,求百度网盘云资源 22款致炫x发动机有吸气的声音 酸枣面吃多了 会有副作用吗?什么*的人不适合吃酸枣面!~? 麻烦医生帮我解答!~谢谢!!! 酸枣面吃多了 会有副作用吗?什么*的人不适合吃酸枣面!~? 麻烦医生帮我解答!~谢谢!!! epc项目工程款好拿吗 新农村建设工程款好不好拿 宠物小精灵剧场版名称及每一部剧场版出场的神兽名称,要官方译名 开发商工程款好要吗 EPC项目资金会拖欠吗 7年级英语下册能力培养与测试英语作文假设现在是晚上8点钟你们全家人都在家里