【权限管理】常用加密和解密算法AES、RSA 和 SHA-256介绍和实例

AESRSASHA-256 是三种常见的加密算法,广泛应用于数据加密、数字签名、哈希处理等安全领域。它们的工作原理和应用场景各不相同,下面是它们的详细介绍:

1. AES(高级加密标准)

AESAdvanced Encryption Standard)是对称加密算法之一,用于加密和解密数据。它被广泛应用于保护敏感数据,例如文件加密、通信加密和存储加密。

  • 对称加密:AES 使用相同的密钥来进行加密和解密。密钥的安全性非常重要,泄露密钥意味着加密的安全性被破坏。
  • 密钥长度:AES 支持多种密钥长度,常见的有 128 位、192 位和 256 位。密钥长度越长,算法的安全性越高,但加密和解密速度可能会变慢。
  • 块加密:AES 是块加密算法,它将数据分成固定大小的块(通常是 128 位),然后对每个块进行加密操作。
工作原理

AES 是一种迭代加密算法,主要通过以下步骤进行加密:

  1. 密钥扩展:根据提供的密钥生成一系列子密钥。
  2. 初始加密轮:将数据块与子密钥进行异或操作,生成初步加密数据。
  3. 轮加密:经过多轮(10、12或14轮,取决于密钥长度)处理,每轮包含字节替换、行移位、列混合和子密钥加。
  4. 最终加密轮:与轮加密相似,但不进行列混合操作。
应用场景
  • 文件加密
  • 数据库加密
  • 网络通信加密(如 HTTPS)
  • VPN 和 IPsec 协议中的加密
  • 对敏感数据(如密码、用户信息)进行对称加密
Java 实现示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESExample {

    // 生成 AES 密钥
    public static String generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 128位密钥
        SecretKey secretKey = keyGen.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }

    // AES 加密
    public static String encrypt(String plainText, String base64Key) throws Exception {
        byte[] decodedKey = Base64.getDecoder().decode(base64Key);
        SecretKeySpec keySpec = new SecretKeySpec(decodedKey, "AES");

        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);

        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // AES 解密
    public static String decrypt(String encryptedText, String base64Key) throws Exception {
        byte[] decodedKey = Base64.getDecoder().decode(base64Key);
        SecretKeySpec keySpec = new SecretKeySpec(decodedKey, "AES");

        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);

        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        String key = generateKey();
        System.out.println("Generated Key: " + key);

        String plainText = "Hello, AES!";
        String encryptedText = encrypt(plainText, key);
        System.out.println("Encrypted Text: " + encryptedText);

        String decryptedText = decrypt(encryptedText, key);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}
运行结果
  • 生成的密钥:Generated Key: <base64_encoded_key>
  • 加密后的文本:Encrypted Text: <base64_encoded_cipher_text>
  • 解密后的文本:Decrypted Text: Hello, AES!

2. RSA(Rivest–Shamir–Adleman)

RSA 是一种广泛使用的非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,而私钥则用于解密数据。RSA 的安全性基于大数分解问题的困难性,即将一个非常大的整数分解为其质因数非常困难。

  • 非对称加密:RSA 使用两把不同的密钥进行加密和解密。公钥是公开的,任何人都可以使用它来加密信息。私钥则是保密的,只有密钥的持有者才能用它解密信息。
  • 密钥长度:RSA 的密钥长度通常较长,常见的有 1024 位、2048 位、4096 位等。密钥越长,安全性越高,但运算速度也会变慢。
  • 加密过程
    1. 公钥加密:发送方使用接收方的公钥加密消息。
    2. 私钥解密:接收方使用自己的私钥解密收到的消息。
工作原理

RSA 的安全性基于因式分解难题。它使用两个大质数来生成公钥和私钥:

  1. 密钥生成:选择两个大质数 p 和 q,计算它们的乘积 n = p * q。然后计算欧拉函数 φ(n),并选择一个小的整数 e,使得 e 与 φ(n) 互质。接着计算 d,使得 e * d ≡ 1 (mod φ(n))。公钥是 (n, e),私钥是 (n, d)。
  2. 加密:消息 m 通过公式 c = m^e mod n 被加密成密文 c。
  3. 解密:密文 c 通过公式 m = c^d mod n 被解密回明文 m。
应用场景
  • 数字签名:RSA 常用于数字签名中,用于验证消息的完整性和身份。
  • 加密通信:在 SSL/TLS 协议中,RSA 用于加密密钥交换过程。
  • 数字证书:RSA 作为公钥加密算法,广泛应用于 X.509 数字证书中。
Java 实现示例
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

public class RSAExample {

    // 生成 RSA 密钥对
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048); // 2048位密钥
        return keyGen.generateKeyPair();
    }

    // RSA 加密
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // RSA 解密
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        KeyPair keyPair = generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        String plainText = "Hello, RSA!";
        String encryptedText = encrypt(plainText, publicKey);
        System.out.println("Encrypted Text: " + encryptedText);

        String decryptedText = decrypt(encryptedText, privateKey);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}
 运行结果
  • 加密后的文本:Encrypted Text: <base64_encoded_cipher_text>
  • 解密后的文本:Decrypted Text: Hello, RSA!

3. SHA-256(安全哈希算法 256 位)

SHA-256SHA-2(Secure Hash Algorithm 2)系列中的一种哈希算法,用于生成数据的固定长度的哈希值(即消息摘要)。SHA-256 产生 256 位(32 字节)的输出。

  • 单向函数:SHA-256 是一种单向哈希函数,意味着它可以将任何长度的输入数据映射为固定长度的输出(256 位),但是从输出无法推导出输入。
  • 碰撞抗性:SHA-256 被设计成防止哈希碰撞,即不同的输入数据生成相同的哈希值。这使得它在安全领域非常重要。
  • 输入长度:SHA-256 可以处理任意长度的输入数据,但输出始终是 256 位。
工作原理

SHA-256 使用一种迭代的处理方式来生成哈希值:

  1. 消息预处理:消息通过填充、附加长度信息等步骤进行预处理,使得数据长度符合要求。
  2. 分组处理:将消息分为固定长度的块(512 位),然后通过多轮的计算,逐步更新哈希值。
  3. 输出生成:最终的哈希值是一个固定大小的 256 位输出,代表消息的唯一标识。
应用场景
  • 数据完整性验证:用于文件校验和下载验证。
  • 数字签名:在数字签名中,SHA-256 用于确保签名的消息不被篡改。
  • 区块链:比特币和其他加密货币中使用 SHA-256 来处理区块链的工作量证明(PoW)过程。
  • 密码存储:用于生成数据的不可逆哈希值
Java 实现示例
import java.security.MessageDigest;
import java.util.Base64;

public class SHA256Example {

    // 生成 SHA-256 哈希
    public static String hash(String plainText) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashedBytes = digest.digest(plainText.getBytes());

        // 转换为 Base64 编码字符串
        return Base64.getEncoder().encodeToString(hashedBytes);
    }

    public static void main(String[] args) throws Exception {
        String plainText = "Hello, SHA-256!";
        String hashValue = hash(plainText);
        System.out.println("Hash Value: " + hashValue);
    }
}
运行结果
  • 哈希值:Hash Value: <base64_encoded_hash_value> 

总结

特性AESRSASHA-256
类型对称加密算法非对称加密算法哈希算法
密钥相同的密钥用于加密和解密公钥和私钥成对使用无密钥,输出固定长度的哈希值
应用数据加密、文件加密、通信加密数字签名、加密通信、密钥交换数据完整性验证、数字签名、区块链
性能快速,适合大规模数据加密慢,适用于加密小数据和生成数字签名快速,常用于数据验证和完整性检查
安全性密钥泄露即安全性破坏公钥可以公开,私钥必须保密一次性,无法从哈希值推导原始数据,防止碰撞

AES 适用于需要快速加密和解密大量数据的场景,RSA 适合用于小数据的加密、数字签名和身份验证,而 SHA-256 则适用于验证数据完整性和生成固定长度的消息摘要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值