一文带你了解常用的加解密算法(带java案例)

一、引言

加密算法和解密算法是数据保密性和安全性的关键组成部分。

它们用于将敏感信息转换为不可读的形式,以防止未经授权的访问者获得信息的内容。

二、常见的加密和解密算法

1、对称加密算法

对称加密算法使用相同的密钥进行加密和解密。

发送方使用密钥将原始数据转换为密文,接收方使用相同的密钥将密文还原为原始数据。

常见的对称加密算法包括DES(数据加密标准)、AES(高级加密标准)和RC4(Rivest Cipher 4)。

DESUtils
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class DESUtils {

    private static final String DES_ALGORITHM = "DES";

    public static String encrypt(String plaintext, String key) throws Exception {
        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
        DESKeySpec desKeySpec = new DESKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        Cipher cipher = Cipher.getInstance(DES_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

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

    public static String decrypt(String ciphertext, String key) throws Exception {
        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
        DESKeySpec desKeySpec = new DESKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        Cipher cipher = Cipher.getInstance(DES_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        byte[] decodedBytes = Base64.getDecoder().decode(ciphertext);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
    

    public static void main(String[] args) {
        try {
            String plaintext = "Hello, World!";
            String key = "secretkey";

            String encryptedText = DESUtils.encrypt(plaintext, key);
            System.out.println("Encrypted Text: " + encryptedText);

            String decryptedText = DESUtils.decrypt(encryptedText, key);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
AESUtils
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AESUtils {

    private static final String AES_ALGORITHM = "AES";
    private static final String AES_CIPHER_MODE = "AES/CBC/PKCS5Padding";

    public static String encrypt(String plaintext, String key, String iv) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));

        Cipher cipher = Cipher.getInstance(AES_CIPHER_MODE);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

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

    public static String decrypt(String ciphertext, String key, String iv) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));

        Cipher cipher = Cipher.getInstance(AES_CIPHER_MODE);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        byte[] decodedBytes = Base64.getDecoder().decode(ciphertext);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
    
    public static void main(String[] args) {
        try {
            String plaintext = "Hello, World!";
            String key = "0123456789abcdef";
            String iv = "fedcba9876543210";

            String encryptedText = AESUtils.encrypt(plaintext, key, iv);
            System.out.println("Encrypted Text: " + encryptedText);

            String decryptedText = AESUtils.decrypt(encryptedText, key, iv);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
RC4Utils
import java.nio.charset.StandardCharsets;

public class RC4Utils {

    public static String encrypt(String plaintext, String key) {
        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
        byte[] plaintextBytes = plaintext.getBytes(StandardCharsets.UTF_8);

        int[] S = initializeSBox(keyBytes);
        int[] keyStream = generateKeyStream(S, plaintextBytes.length);

        byte[] ciphertextBytes = new byte[plaintextBytes.length];
        for (int i = 0; i < plaintextBytes.length; i++) {
            ciphertextBytes[i] = (byte) (plaintextBytes[i] ^ keyStream[i]);
        }

        return bytesToHex(ciphertextBytes);
    }

    public static String decrypt(String ciphertext, String key) {
        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
        byte[] ciphertextBytes = hexToBytes(ciphertext);

        int[] S = initializeSBox(keyBytes);
        int[] keyStream = generateKeyStream(S, ciphertextBytes.length);

        byte[] plaintextBytes = new byte[ciphertextBytes.length];
        for (int i = 0; i < ciphertextBytes.length; i++) {
            plaintextBytes[i] = (byte) (ciphertextBytes[i] ^ keyStream[i]);
        }

        return new String(plaintextBytes, StandardCharsets.UTF_8);
    }

    private static int[] initializeSBox(byte[] key) {
        int[] S = new int[256];
        int keyLength = key.length;

        for (int i = 0; i < 256; i++) {
            S[i] = i;
        }

        int j = 0;
        for (int i = 0; i < 256; i++) {
            j = (j + S[i] + key[i % keyLength]) % 256;
            swap(S, i, j);
        }

        return S;
    }

    private static int[] generateKeyStream(int[] S, int length) {
        int i = 0;
        int j = 0;
        int[] keyStream = new int[length];

        for (int k = 0; k < length; k++) {
            i = (i + 1) % 256;
            j = (j + S[i]) % 256;
            swap(S, i, j);
            keyStream[k] = S[(S[i] + S[j]) % 256];
        }

        return keyStream;
    }

    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }

    private static byte[] hexToBytes(String hex) {
        int len = hex.length();
        byte[] bytes = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            bytes[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i + 1), 16));
        }
        return bytes;
    }
    
    public static void main(String[] args) {
        String plaintext = "Hello, World!";
        String key = "secretkey";

        String encryptedText = RC4Utils.encrypt(plaintext, key);
        System.out.println("Encrypted Text: " + encryptedText);

        String decryptedText = RC4Utils.decrypt(encryptedText, key);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}

2、非对称加密算法

非对称加密算法使用一对密钥,分别是公钥和私钥。公钥用于加密数据,而私钥用于解密数据。

这意味着任何人都可以使用公钥加密数据,但只有拥有私钥的人才能解密数据。

常见的非对称加密算法包括RSA(Rivest-Shamir-Adleman)和ECC(椭圆曲线加密)。

RSAUtils
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;

public class RSAUtils {

    private static final String RSA_ALGORITHM = "RSA";

    public static KeyPair generateKeyPair(int keySize) throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    public static String encrypt(String plaintext, PublicKey publicKey) throws Exception {
        byte[] plaintextBytes = plaintext.getBytes(StandardCharsets.UTF_8);

        java.security.Cipher cipher = java.security.Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(java.security.Cipher.ENCRYPT_MODE, publicKey);

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

    public static String decrypt(String ciphertext, PrivateKey privateKey) throws Exception {
        byte[] ciphertextBytes = Base64.getDecoder().decode(ciphertext);

        java.security.Cipher cipher = java.security.Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(java.security.Cipher.DECRYPT_MODE, privateKey);

        byte[] decryptedBytes = cipher.doFinal(ciphertextBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    public static String sign(String data, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data.getBytes(StandardCharsets.UTF_8));

        byte[] signatureBytes = signature.sign();
        return Base64.getEncoder().encodeToString(signatureBytes);
    }

    public static boolean verify(String data, String signature, PublicKey publicKey) throws Exception {
        Signature verifier = Signature.getInstance("SHA256withRSA");
        verifier.initVerify(publicKey);
        verifier.update(data.getBytes(StandardCharsets.UTF_8));

        byte[] signatureBytes = Base64.getDecoder().decode(signature);
        return verifier.verify(signatureBytes);
    }

    public static void main(String[] args) {
        try {
            String plaintext = "Hello, World!";

            // 生成RSA密钥对
            KeyPair keyPair = RSAUtils.generateKeyPair(2048);

            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();

            // 加密
            String encryptedText = RSAUtils.encrypt(plaintext, publicKey);
            System.out.println("Encrypted Text: " + encryptedText);

            // 解密
            String decryptedText = RSAUtils.decrypt(encryptedText, privateKey);
            System.out.println("Decrypted Text: " + decryptedText);

            // 签名
            String signature = RSAUtils.sign(plaintext, privateKey);
            System.out.println("Signature: " + signature);

            // 验证签名
            boolean isVerified = RSAUtils.verify(plaintext, signature, publicKey);
            System.out.println("Signature Verified: " + isVerified);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
ECCUtils
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPrivateKeySpec;
import java.security.spec.ECPublicKeySpec;
import java.util.Base64;

public class ECCUtils {

    private static final String ECC_ALGORITHM = "EC";

    public static KeyPair generateKeyPair(String curveName) throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ECC_ALGORITHM);
        ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec(curveName);
        keyPairGenerator.initialize(ecGenParameterSpec);
        return keyPairGenerator.generateKeyPair();
    }

    public static String encrypt(String plaintext, PublicKey publicKey) throws Exception {
        byte[] plaintextBytes = plaintext.getBytes(StandardCharsets.UTF_8);

        Cipher cipher = Cipher.getInstance(ECC_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

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

    public static String decrypt(String ciphertext, PrivateKey privateKey) throws Exception {
        byte[] ciphertextBytes = Base64.getDecoder().decode(ciphertext);

        Cipher cipher = Cipher.getInstance(ECC_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte[] decryptedBytes = cipher.doFinal(ciphertextBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    public static String sign(String data, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withECDSA");
        signature.initSign(privateKey);
        signature.update(data.getBytes(StandardCharsets.UTF_8));

        byte[] signatureBytes = signature.sign();
        return Base64.getEncoder().encodeToString(signatureBytes);
    }

    public static boolean verify(String data, String signature, PublicKey publicKey) throws Exception {
        Signature verifier = Signature.getInstance("SHA256withECDSA");
        verifier.initVerify(publicKey);
        verifier.update(data.getBytes(StandardCharsets.UTF_8));

        byte[] signatureBytes = Base64.getDecoder().decode(signature);
        return verifier.verify(signatureBytes);
    }
    
    public static void main(String[] args) {
        try {
            String plaintext = "Hello, World!";
            String curveName = "secp256r1";

            // 生成ECC密钥对
            KeyPair keyPair = ECCUtils.generateKeyPair(curveName);

            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();

            // 加密
            String encryptedText = ECCUtils.encrypt(plaintext, publicKey);
            System.out.println("Encrypted Text: " + encryptedText);

            // 解密
            String decryptedText = ECCUtils.decrypt(encryptedText, privateKey);
            System.out.println("Decrypted Text: " + decryptedText);

            // 签名
            String signature = ECCUtils.sign(plaintext, privateKey);
            System.out.println("Signature: " + signature);

            // 验证签名
            boolean isVerified = ECCUtils.verify(plaintext, signature, publicKey);
            System.out.println("Signature Verified: " + isVerified);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、哈希算法

哈希算法将任意长度的数据转换为固定长度的哈希值。哈希值是唯一的,即使原始数据的微小改变也会导致完全不同的哈希值。

哈希算法通常用于验证数据的完整性,例如在数字签名中。

常见的哈希算法有MD5(Message Digest Algorithm 5)和SHA(Secure Hash Algorithm)系列。

SHAUtils
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

// 注意,在实际应用中,密码哈希算法的选择应根据具体需求和安全性要求进行评估。
// 示例代码提供了SHA-1、SHA-256和SHA-512三种常见的哈希算法。
// 同时,建议对于密码哈希操作,还应该考虑使用“盐”(salt)来增加哈希的强度和安全性。
public class SHAUtils {

    public static String sha1(String input) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-1");
        byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashBytes);
    }

    public static String sha256(String input) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashBytes);
    }

    public static String sha512(String input) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashBytes);
    }
    
    public static void main(String[] args) {
        try {
            String input = "Hello, World!";

            String sha1Hash = SHAUtils.sha1(input);
            System.out.println("SHA-1: " + sha1Hash);

            String sha256Hash = SHAUtils.sha256(input);
            System.out.println("SHA-256: " + sha256Hash);

            String sha512Hash = SHAUtils.sha512(input);
            System.out.println("SHA-512: " + sha512Hash);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
MD5Utils
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

public class MD5Utils {

    public static String md5(String input) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashBytes);
    }
    
    public static void main(String[] args) {
        try {
            String input = "Hello, World!";

            String md5Hash = MD5Utils.md5(input);
            System.out.println("MD5: " + md5Hash);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、数字签名算法

数字签名算法使用非对称加密算法和哈希算法来验证数据的完整性和身份。

发送方使用私钥对数据进行加密,然后接收方使用发送方的公钥来解密数据,并使用相同的哈希算法生成哈希值。

接收方可以通过比较接收到的哈希值和自己重新计算的哈希值来验证数据的完整性和身份。

三、对称加密算法和非对称加密算法有什么区别?

对称加密算法和非对称加密算法在密钥管理和加密/解密操作方面存在着不同的特点和用途。

1、对称加密算法

  • 使用相同的密钥进行加密和解密操作。

  • 加密和解密速度通常比非对称加密算法更快。

  • 密钥的分发和管理相对较简单。

  • 适用于大量数据的加密和解密操作。

  • 主要用于保护数据的机密性。

2、非对称加密算法

  • 使用一对密钥,即公钥和私钥,进行加密和解密操作。

  • 公钥用于加密数据,私钥用于解密数据。

  • 加密和解密速度通常比对称加密算法慢。

  • 密钥的分发和管理相对较复杂。

  • 适用于数据的加密、签名和身份验证等操作。

  • 主要用于保护数据的机密性、完整性和身份验证。

四、在实际应用中,如何选择合适的密钥长度和安全参数?

  1. 安全性需求:首先要评估应用的安全性需求。对于敏感数据或高风险环境,需要选择更长的密钥长度和更强大的安全参数来提供更高的安全性。较短的密钥长度可能容易受到暴力破解或密码分析等攻击。

  2. 算法推荐标准:各个加密算法通常会有推荐的密钥长度和安全参数。例如,对于RSA算法,通常建议使用2048位或更长的密钥长度。对于哈希算法,如SHA-256和SHA-512,被广泛接受为安全的选择。

  3. 性能要求:较长的密钥长度和更强的安全参数可能会导致加密和解密操作的计算成本增加。因此,还需要考虑应用的性能要求。密钥长度和安全参数应该在提供足够安全性的同时,尽可能满足性能需求。

  4. 未来可用性:选择密钥长度时,还应考虑未来的可用性和持续安全性。随着计算能力的提升和密码分析技术的进步,较短的密钥长度可能会变得不够安全。因此,建议选择稍长一些的密钥长度,以便在未来仍然具有足够的安全性。

  5. 攻击风险:评估应用可能面临的攻击风险是选择密钥长度和安全参数的重要因素之一。如果应用面临高级攻击者或强大计算资源的威胁,应考虑选择更长的密钥长度和更强的安全参数。

  6. 合规要求:特定行业或法规可能对加密和安全性有特定的要求。例如,金融机构和医疗保健领域可能需要满足特定的数据加密标准。了解并遵循适用的合规性要求是选择密钥长度和安全参数的重要指导。

  7. 性能和资源限制:密钥长度和安全参数的选择可能会影响应用的性能和资源消耗。较长的密钥长度可能需要更长的加密和解密时间,并且可能需要更多的计算资源。因此,需要平衡安全性需求和性能限制,以确保应用的可用性和响应性。

  8. 密钥管理:选择较长的密钥长度可能会增加密钥管理的复杂性。确保密钥的安全存储、生成、分发和轮换是非常重要的。密钥管理策略应考虑密钥的保密性、完整性和可用性,以及密钥的生命周期管理。

  9. 安全性标准和认证:了解和遵循密码学和安全性标准是至关重要的。例如,NIST发布的标准(如FIPS 140-2)和国际标准(如ISO/IEC 27001)提供了有关密码学算法、密钥长度和安全参数的指导。此外,使用经过认证的密码学库和实施认证过的安全方案也是一种良好的做法。

  10. 抗量子计算:随着量子计算技术的发展,传统的非对称加密算法(如RSA和DSA)可能会受到量子计算攻击的威胁。因此,考虑使用抗量子计算攻击的加密算法,如基于椭圆曲线的加密算法(如ECDSA和ECDH),可以提供更长期的安全性。

  11. 密码策略和复杂性:除了选择密钥长度和安全参数外,还应考虑密码策略和密码复杂性要求。密码策略包括密码的最小长度、字符组合要求、密码过期和锁定策略等。确保密码的强度和复杂性可以增加系统的整体安全性。

  12. 安全审计和监控:选择合适的密钥长度和安全参数后,仍然需要建立安全审计和监控机制来监控系统的安全性。这包括实时监测安全事件、异常行为和攻击尝试,以及进行日志记录和安全审计,以及及时响应安全事件。

  13. 密钥交换协议:如果涉及到密钥交换协议(如Diffie-Hellman),则需要确保选择足够强大的安全参数。安全参数的选择应基于协议的要求和所使用的算法。合适的安全参数可以防止中间人攻击和密钥泄露。

  14. 密码强度和熵:密钥长度的强度可以通过熵来衡量。较高的熵意味着密钥空间更大,猜测密钥的难度更高。选择具有足够熵的密钥长度可以提供更高的安全性。

  15. 行业标准和最佳实践:不同行业和领域可能有特定的密码学标准和最佳实践。例如,金融行业可能会遵循PCI DSS(Payment Card Industry Data Security Standard)的要求,而云服务提供商可能会参考CSP(Cloud Security Provider)的建议。了解并遵循相关行业的标准是确保安全的重要一环。

  16. 安全评估和渗透测试:进行安全评估和渗透测试可以帮助确定所选择的密钥长度和安全参数是否足够强大。通过模拟真实攻击场景,可以检测潜在的漏洞和弱点,并提出改进建议。这些测试可以帮助验证所选择的安全参数是否满足预期的安全需求。

五、总结

加密和解密算法在保护数据的安全性方面发挥着重要作用。选择适当的算法取决于安全需求、计算资源和特定的应用场景。

为了确保数据的最佳安全性,通常会采用多种算法的组合来提供多层保护。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件加密解密算法(Java源码) java,file,算法,加密解密,java源码 package com.crypto.encrypt; import java.security.SecureRandom; import java.io.*; import javax.crypto.spec.DESKeySpec; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.Cipher; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypto.NoSuchPaddingException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import java.lang.reflect.Constructor; import java.security.spec.KeySpec; import java.lang.reflect.InvocationTargetException; public class EncryptData { private String keyfile=null; public EncryptData() { } public EncryptData(String keyfile) { this.keyfile=keyfile; } /** * 加密文件 * @param filename String 源路径 * @param filenamekey String 加密后的路径 */ public void createEncryptData(String filename,String filenamekey) throws IllegalStateException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, IOException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalStateException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, IOException { //验证keyfile if(keyfile==null || keyfile.equals("")) { throw new NullPointerException("无效的key文件路径"); } encryptData(filename,filenamekey); } /** * 加密类文件 * @param filename String 原始的类文件 * @param encryptfile String 加密后的类文件 * @throws IOException * @throws InvalidKeyException * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws IllegalStateException */ private void encryptData(String filename,String encryptfile) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, IllegalStateException, ClassNotFoundException, SecurityException, NoSuchMethodException, InvocationTargetException, IllegalArgumentException, IllegalAccessException, InstantiationException { byte data[]=Util.readFile(filename); // 执行加密操作 byte encryptedClassData[] = getencryptData(data); // 保存加密后的文件,覆盖原有的类文件。 Util.writeFile(encryptedClassData,encryptfile); } /** * 直接获得加密数据 * @param bytes byte[] * @throws IllegalStateException * @throws IllegalBlockSizeException * @throws BadPaddingException * @throws InvalidKeyException * @throws NoSuchPaddingException * @throws InvalidKeySpecException * @throws NoSuchAlgorithmException * @throws InstantiationException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException * @throws NoSuchMethodException * @throws SecurityException * @throws ClassNotFoundException * @throws IOException * @return byte[] */ public byte[] createEncryptData(byte[] bytes) throws IllegalStateException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IOException { bytes=getencryptData(bytes); return bytes; } private byte[] getencryptData(byte[] bytes) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, InvocationTargetException, IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, IllegalStateException { // 产生一个可信任的随机数源 SecureRandom sr = new SecureRandom(); //从密钥文件key Filename中得到密钥数据 byte[] rawKeyData = Util.readFile(keyfile); // 从原始密钥数据创建DESKeySpec对象 Class classkeyspec=Class.forName(Util.getValue("keyspec")); Constructor constructor = classkeyspec.getConstructor(new Class[]{byte[].class}); KeySpec dks = (KeySpec) constructor.newInstance(new Object[]{rawKeyData}); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Util.getAlgorithm()); SecretKey key = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(Util.getAlgorithm()); // 用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, key, sr); // 执行加密操作 bytes = cipher.doFinal(bytes); // 返回字节数组 return bytes; } /** * 设置key文件路径 * @param keyfile String */ public void setKeyFile(String keyfile) { this.keyfile=keyfile; } }
LVS(Linux Virtual Server)是一种基于 Linux 系统的负载均衡集群技术,它主要用于将网络流量分发到多个服务器上,以提高系统的可靠性、可扩展性和性能。 LVS 集群一般包括四个组件:调度器(LVS 调度器)、前端服务器(负载均衡器)、后端服务器(真实服务器)和存储服务器(用于共享数据)。首先,调度器接收来自客户端的请求,然后根据配置的调度算法(如轮询、加权轮询、最小连接数等)将请求分发到多个前端服务器。前端服务器接收到请求后,通过相应的负载均衡算法将请求转发到后端的真实服务器上进行处理。在整个过程中,存储服务器用于存放共享的数据,以确保所有的真实服务器都能获取到相同的数据,并提供一致的服务。 LVS 集群的优点是能够提高网站的稳定性和可靠性,当某一台服务器出现故障时,调度器会自动将请求分发到其他可用的服务器上,从而保证服务的连续性。同时,LVS 集群还能够通过增加前端服务器和后端服务器的数量来提高系统的性能和吞吐量,以满足不断增长的用户需求。 在实际应用中,LVS 集群需要合理配置,包括选择合适的调度算法、调整每台服务器的权重、选择适当的硬件设备等。此外,还需要及时监控集群的运行状态,及时发现和解决故障,以确保整个系统的正常运行。 总的来说,LVS 负载均衡集群是一种强大而高效的集群技术,能够帮助企业提高系统的可靠性和性能,是现代互联网应用中不可或缺的重要组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值