支付网站怎么设计的,网页程序开发语言,海林建设局网站,黄页网站大全文章目录 概述常用的对称加密算法AESECB模式CBC模式 (推荐)ECB VS CBC 附#xff1a;AES工具类总结 概述
对称加密算法是一种加密技术#xff0c;使用相同的密钥来进行加密和解密数据。在这种算法中#xff0c;发送方使用密钥将明文#xff08;未加密的数据#xff09;转… 文章目录 概述常用的对称加密算法AESECB模式CBC模式 (推荐)ECB VS CBC 附AES工具类总结 概述
对称加密算法是一种加密技术使用相同的密钥来进行加密和解密数据。在这种算法中发送方使用密钥将明文未加密的数据转换为密文加密的数据而接收方使用相同的密钥将密文还原为明文。
对称加密算法的安全性依赖于密钥的保密性因为任何持有相同密钥的人都能够解密数据。
常见的对称加密算法包括AES高级加密标准和DES数据加密标准。虽然对称加密算法在性能上通常比非对称加密算法更高效但在密钥管理和分发方面存在挑战。
通俗来讲可以这么理解 对称加密算法就像是一把钥匙可以打开一个锁。在这里你有一个钥匙密钥用它来锁住加密你的信息然后你可以用同样的钥匙密钥来解锁解密它。这意味着发送方和接收方都使用相同的密钥来加密和解密信息。 常用的对称加密算法
常用的对称加密算法包括 AESAdvanced Encryption Standard这是目前最常用的对称加密算法之一。它使用128、192或256位密钥来加密数据并已被广泛采用于许多安全应用中。 DESData Encryption Standard虽然已被AES所取代但仍然在一些遗留系统中使用。DES使用56位密钥对数据进行加密。 3DESTriple Data Encryption Standard3DES是DES的改进版本它对数据应用三次DES算法提高了安全性。但由于计算成本高昂现在已经不太常用。 Blowfish这是一个可扩展的对称加密算法可以使用变长密钥从32位到448位。它曾经很流行但由于一些安全性方面的考虑现在使用较少。 RC4Rivest Cipher 4尽管曾被广泛使用但由于存在一些严重的安全漏洞现在已经不建议使用。 从程序的角度看所谓加密就是这样一个函数它接收密码和明文然后输出密文
secret encrypt(key, message);而解密则相反它接收密码和密文然后输出明文
plain decrypt(key, secret); 从程序的角度看所谓加密就是这样一个函数它接收密码和明文然后输出密文
secret encrypt(key, message);而解密则相反它接收密码和密文然后输出明文
plain decrypt(key, secret); 加密和解密确实可以被视为类似上面的函数但实际上它们可能会更为复杂一些尤其是在实现对称加密算法时。 在使用对称加密算法时这两个函数通常被称为加密函数和解密函数。例如在使用AES算法时加密函数会接收密钥key和明文message然后输出密文ciphertext。而解密函数则接收密钥key和密文ciphertext然后输出明文message 算法密钥长度工作模式填充模式AES128/192/256ECB/CBC/PCBC/CTR/…NoPadding/PKCS5Padding/PKCS7Padding/…DES56/64ECB/CBC/PCBC/CTR/…NoPadding/PKCS5Padding/…………… 密钥长度直接决定加密强度而工作模式和填充模式可以看成是对称加密算法的参数和格式选择。 这些对称加密算法在不同的场景中都有各自的优缺点选择合适的算法取决于安全性需求、性能和应用环境。AES通常被认为是最安全和高效的对称加密算法之一因此在许多情况下被首选使用。 AES
AES算法是目前应用最广泛的加密算法。
ECB模式
先用ECB模式加密并解密. 代码如下
package com.artisan.securityalgjava.aes;import java.security.*;
import java.util.Base64;import javax.crypto.*;
import javax.crypto.spec.*;/*** author 小工匠* version 1.0* mark: show me the code , change the world*/
public class AesECBExample {public static void main(String[] args) throws Exception {// 原文:String message Hello, Artisan!;System.out.println(Message: message);// 128位密钥 16 bytes Key:byte[] key 1234567890abcdef.getBytes(UTF-8);// 加密:byte[] data message.getBytes(UTF-8);byte[] encrypted encrypt(key, data);System.out.println(Encrypted: Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted decrypt(key, encrypted);System.out.println(Decrypted: new String(decrypted, UTF-8));}// 加密方法public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建加密对象Cipher cipher Cipher.getInstance(AES/ECB/PKCS5Padding);// 创建密钥规范SecretKey keySpec new SecretKeySpec(key, AES);// 初始化加密对象cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 执行加密操作return cipher.doFinal(input);}// 解密方法public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建解密对象Cipher cipher Cipher.getInstance(AES/ECB/PKCS5Padding);// 创建密钥规范SecretKey keySpec new SecretKeySpec(key, AES);// 初始化解密对象cipher.init(Cipher.DECRYPT_MODE, keySpec);// 执行解密操作return cipher.doFinal(input);}
}
ECB模式是最简单的AES加密模式它只需要一个固定长度的密钥固定的明文会生成固定的密文这种一对一的加密方式会导致安全性降低
CBC模式 (推荐)
package com.artisan.securityalgjava.aes;import java.security.*;
import java.util.Base64;import javax.crypto.*;
import javax.crypto.spec.*;/*** author 小工匠* version 1.0* mark: show me the code , change the world* desc: AES CBC模式加解密示例*/
public class AesCBCExample {public static void main(String[] args) throws Exception {// 原文:String message Hello, Artisan!;System.out.println(Message: message);// 256位密钥 32 bytes Key:byte[] key 1234567890abcdef1234567890abcdef.getBytes(UTF-8);// 加密:byte[] data message.getBytes(UTF-8);byte[] encrypted encrypt(key, data);System.out.println(Encrypted: Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted decrypt(key, encrypted);System.out.println(Decrypted: new String(decrypted, UTF-8));}/*** 加密* param key* param input* return* throws GeneralSecurityException*/public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建AES加密器Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding);// 创建密钥规范SecretKeySpec keySpec new SecretKeySpec(key, AES);// CBC模式需要生成一个16 bytes的初始化向量SecureRandom sr SecureRandom.getInstanceStrong();byte[] iv sr.generateSeed(16);IvParameterSpec ivps new IvParameterSpec(iv);// 初始化加密器cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);// 执行加密操作byte[] data cipher.doFinal(input);// IV不需要保密把IV和密文一起返回return join(iv, data);}/*** 解密* param key* param input* return* throws GeneralSecurityException*/public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 把input分割成IV和密文byte[] iv new byte[16];byte[] data new byte[input.length - 16];System.arraycopy(input, 0, iv, 0, 16);System.arraycopy(input, 16, data, 0, data.length);// 创建AES解密器Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding);// 创建密钥规范SecretKeySpec keySpec new SecretKeySpec(key, AES);IvParameterSpec ivps new IvParameterSpec(iv);// 初始化解密器cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);// 执行解密操作return cipher.doFinal(data);}/*** 拼接两个字节数组* param bs1* param bs2* return*/public static byte[] join(byte[] bs1, byte[] bs2) {byte[] r new byte[bs1.length bs2.length];System.arraycopy(bs1, 0, r, 0, bs1.length);System.arraycopy(bs2, 0, r, bs1.length, bs2.length);return r;}}
在CBC模式下需要一个随机生成的16字节IV参数必须使用SecureRandom生成。因为多了一个IvParameterSpec实例因此初始化方法需要调用Cipher的一个重载方法并传入IvParameterSpec。
观察输出可以发现每次生成的IV不同密文也不同, 如下图所示 代码实现了AES CBC模式的加密和解密功能。在加密过程中生成了一个16字节的初始化向量IV在解密时使用了这个IV来确保安全性。
因此CBC模式它需要一个随机数作为IV参数这样对于同一份明文每次生成的密文都不同 . ECB VS CBC
AES有几种不同的模式其中最常见的两种是ECBElectronic Codebook模式和CBCCipher Block Chaining模式。
ECB模式电子密码本模式
特点 将明文分成块每个块使用相同的密钥进行加密。相同的明文块在加密后会得到相同的密文块。每个块的加密是独立的不受其他块的影响。 优点 简单容易并行化处理。适用于对称加密需求较简单的场景。 缺点 容易受到重放攻击的影响因为相同的明文块会产生相同的密文块没有隐藏明文块之间的关系。不适合加密大量数据或需要保护隐私的数据因为无法隐藏明文块之间的模式。
CBC模式密码块链接模式
特点 在加密前会对明文块进行异或运算并与前一个密文块进行混合然后再加密。需要一个初始化向量IV来增加随机性防止重放攻击。密文块的加密依赖于前一个密文块因此密文块之间存在依赖关系。 优点 对于相同的明文块使用不同的IV会产生不同的密文块增加了安全性。可以加密大量数据并且可以隐藏明文块之间的模式。 缺点 加密速度较ECB模式慢因为需要依赖前一个密文块。不太容易并行化处理因为每个块的加密都依赖于前一个块的加密结果。
综上所述ECB模式简单快速适合简单的加密需求但安全性较差不适合加密大量数据或需要保护隐私的数据。而CBC模式相对更安全能够隐藏明文块之间的模式适合加密大量数据或需要保护隐私的数据但加密速度较慢。 附AES工具类
package com.artisan.securityalgjava.aes;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;/*** author 小工匠* version 1.0* mark: show me the code , change the world* desc: AES加密解密工具类, 提供了AES加密解密的功能使用了CBC模式和PBKDF2算法生成密钥*/
public class AESCipher {/*** 密钥生成算法*/private static final String SECRET_KEY_ALGORITHM PBKDF2WithHmacSHA256;/*** 加密算法*/private static final String ENCRYPTION_ALGORITHM AES/CBC/PKCS5Padding;/*** 密钥长度*/private static final int KEY_SIZE 256;/*** 迭代次数*/private static final int ITERATION_COUNT 65536;/*** 初始化向量长度*/private static final int IV_SIZE 16;/*** 生成密钥** param password* param salt* return* throws Exception*/private static SecretKeySpec generateKey(String password, byte[] salt) throws Exception {SecretKeyFactory factory SecretKeyFactory.getInstance(SECRET_KEY_ALGORITHM);KeySpec spec new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_SIZE);SecretKey tmp factory.generateSecret(spec);return new SecretKeySpec(tmp.getEncoded(), AES);}/*** 加密** param plaintext* param password* return* throws Exception*/public static String encrypt(String plaintext, String password) throws Exception {// 生成盐byte[] salt new byte[16];// 生成初始化向量byte[] iv new byte[IV_SIZE];byte[] encryptedBytes;// 生成盐和初始化向量SecureRandom random new SecureRandom();random.nextBytes(salt);random.nextBytes(iv);// 生成密钥SecretKeySpec keySpec generateKey(password, salt);Cipher cipher Cipher.getInstance(ENCRYPTION_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));// 执行加密操作encryptedBytes cipher.doFinal(plaintext.getBytes());// 将盐、初始化向量和密文拼接并返回Base64编码字符串byte[] combined new byte[salt.length iv.length encryptedBytes.length];System.arraycopy(salt, 0, combined, 0, salt.length);System.arraycopy(iv, 0, combined, salt.length, iv.length);System.arraycopy(encryptedBytes, 0, combined, salt.length iv.length, encryptedBytes.length);return Base64.getEncoder().encodeToString(combined);}/*** 解密** param encryptedText* param password* return* throws Exception*/public static String decrypt(String encryptedText, String password) throws Exception {// 解析Base64编码字符串并分离盐、初始化向量和密文byte[] combined Base64.getDecoder().decode(encryptedText);byte[] salt Arrays.copyOfRange(combined, 0, 16);byte[] iv Arrays.copyOfRange(combined, 16, 32);byte[] encryptedBytes Arrays.copyOfRange(combined, 32, combined.length);// 生成密钥SecretKeySpec keySpec generateKey(password, salt);Cipher cipher Cipher.getInstance(ENCRYPTION_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));// 执行解密操作并返回明文字符串byte[] decryptedBytes cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}/*** 测试方法** param args* throws Exception*/public static void main(String[] args) throws Exception {// 测试加密解密功能String encrypted encrypt(组热么共和国的啥范德萨, dddd);System.out.println(Encrypted: encrypted);String decrypted decrypt(encrypted, dddd);System.out.println(Decrypted: decrypted);}
} 总结
对称加密算法使用同一个密钥进行加密和解密适用于需要高效加解密的场景。常见的对称加密算法包括DES、AES和3DES等。
对称加密算法使用同一个密钥进行加密和解密常用的算法包括DES、AES和3DES等。 DESData Encryption StandardDES是一种较早的对称加密算法使用56位密钥进行加密和解密。由于密钥长度较短DES已经不再被推荐使用因为它容易受到穷举攻击。 AESAdvanced Encryption StandardAES是目前广泛使用的对称加密算法之一。它使用128位、192位或256位密钥进行加密和解密。AES算法的安全性和性能较高因此被广泛应用于各种安全领域。 3DESTriple Data Encryption Standard3DES是对DES算法的改进通过对数据应用三次DES算法来提高安全性。3DES使用的密钥长度为56位因此它的安全性较DES提高了很多。但由于AES的出现和3DES的计算复杂性3DES的使用逐渐减少。 密钥长度由算法设计决定。对于AES算法它支持的密钥长度为128位、192位和256位。一般来说密钥长度越长加密的安全性越高但同时也带来了更高的计算成本。 在使用对称加密算法时需要指定以下参数
算法名称即使用的加密算法例如DES、AES和3DES等。工作模式指定了加密算法在加密大块数据时的工作模式常见的工作模式包括ECB、CBC、CFB、OFB等。填充模式指定了在加密数据块大小不足时如何填充数据常见的填充模式包括PKCS5Padding、NoPadding等。
选择合适的算法名称、工作模式和填充模式可以根据具体的安全需求和性能要求进行调整。