AES加密 我就是我 2023-10-03 17:58 38阅读 0赞 ## 一、AES是什么 ## AES高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。2006年,已然成为对称密钥加密中最流行的算法之一。 主要分为五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。 ## 二、AES如何使用 ## import java.util.Arrays; import java.util.Random; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Hex; //工具类直接调用即可 public class AESUtil { private static byte[] getNRawKey(String seed, int size) throws Exception { byte[] s = seed.getBytes("utf-8"); Random sr = new Random(); sr.setSeed(Arrays.hashCode(s)); byte[] r = new byte[size]; sr.nextBytes(r); return r; } //传入字符串密钥和数据加密,不需要指定Iv(偏移量),返回结果使用hex编码 public static String nEncrypt(String seed, String cleartext) throws Exception { System.out.print(seed + "-"); byte[] result = nEncrypt(getNRawKey(seed, 16), cleartext.getBytes("utf-8")); return Hex.encodeHexString(result); } //传入字符串密钥和加密后数据解密,不需要指定Iv(偏移量) public static String nDecrypt(String seed, String encrypted) throws Exception { byte[] r = nDecrypt(getNRawKey(seed, 16), Hex.decodeHex(encrypted.toCharArray())); return new String(r, "utf-8"); } //传入字节密钥和数据进行加密,不需要指定Iv(偏移量),返回结果使用hex编码 public static byte[] nEncrypt(byte[] raw, byte[] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(clear); return encrypted; } //传入字节密钥和加密后数据解密,不需要指定Iv(偏移量 public static byte[] nDecrypt(byte[] raw, byte[] encrypted) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] decrypted = cipher.doFinal(encrypted); return decrypted; } //传入字节密钥和数据进行加密,需要指定Iv(偏移量),NoPadding不能自动填补iv和密钥缺少字节 public static byte[] encryptWithZero(byte[] key, byte[] iv, byte[] input) throws Exception { int p = input.length % key.length; if (p != 0) { byte[] tmp = new byte[input.length + key.length - p]; System.arraycopy(input, 0, tmp, 0, input.length); Arrays.fill(tmp, input.length, tmp.length, (byte) 0); input = tmp; } SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] encrypted = cipher.doFinal(input); return encrypted; } private static byte[] unpad0(byte[] in) { byte[] upData = in; int index = in.length - 1; for (; index >= 0; index--) { if (in[index] != 0) { break; } } if (index != in.length - 1) { upData = new byte[index + 1]; System.arraycopy(in, 0, upData, 0, upData.length); } return upData; } //传入字节密钥和数据进行解密,需要指定Iv(偏移量),NoPadding不能自动填补iv和密钥缺少字节 public static byte[] decryptWithZero(byte[] key, byte[] iv, byte[] input) throws Exception { SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] decrypted = cipher.doFinal(input); decrypted = unpad0(decrypted); return decrypted; } } ## 三、使用时踩过的坑 ## 如果使用NOPadding,在写密钥和偏移量时,要注意字节大小是16的倍数,否则会报错,建议写的时候使用下面代码查一下字节长度。 System.out.println("miyao".getBytes().length);
相关 AES加密 一、AES是什么 AES高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府 我就是我/ 2023年10月03日 17:58/ 0 赞/ 39 阅读
相关 AES 加密 util.encryption = function (params) \{ let \{ data, param, key \} = params const res 悠悠/ 2023年02月18日 03:05/ 0 赞/ 34 阅读
相关 AES 加密 import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.c 秒速五厘米/ 2022年12月29日 15:28/ 0 赞/ 184 阅读
相关 AES加密 package com.test.util.encrypt; import org.apache.commons.lang3.StringUtil 小咪咪/ 2022年07月15日 20:43/ 0 赞/ 251 阅读
相关 AES加密 AES加密是一种对称加密,即加密秘钥与解密秘钥相同 示例如下: public class Aes { //算法 private st 偏执的太偏执、/ 2022年04月14日 05:14/ 0 赞/ 276 阅读
相关 AES加密 import java.io.UnsupportedEncodingException; import java.security.InvalidKeyExce 小灰灰/ 2022年03月09日 14:46/ 0 赞/ 290 阅读
相关 AES加密 AES技术是一种对称的分组加密技术,使用128位分组加密数据,提供比WEP/TKIPS的RC4算法更高的加密强度。AES的加密码表和解密码表是分开的,并且支持子密钥加密,这种 ゞ 浴缸里的玫瑰/ 2022年02月15日 00:09/ 0 赞/ 297 阅读
相关 Python AES加密 与 JS AES加密 import execjs from Crypto.Cipher import AES from binascii import b2a_hex, a2 「爱情、让人受尽委屈。」/ 2021年12月20日 11:55/ 0 赞/ 380 阅读
相关 AES加密 介绍 AES是一种对称加密,使用同一个密钥来加密和解密一段密文 安装 pip install pycryptodome 基础语法 aes 今天药忘吃喽~/ 2021年12月09日 04:49/ 0 赞/ 335 阅读
相关 AES加密算法 AES加密算法是对称密钥加密中最流行的算法之一 这是我转自CSDN博客的详细解析: 一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链 比眉伴天荒/ 2021年09月10日 16:14/ 0 赞/ 521 阅读
还没有评论,来说两句吧...