>  기사  >  Java  >  Java로 구현된 일반적인 암호화 및 암호 해독 알고리즘

Java로 구현된 일반적인 암호화 및 암호 해독 알고리즘

PHPz
PHPz원래의
2023-06-18 09:22:531499검색

Java는 매우 인기 있는 프로그래밍 언어이며 다양한 분야에서 널리 사용됩니다. 실제 응용 프로그램에서 데이터 암호화 및 암호 해독은 매우 일반적인 요구 사항입니다. Java는 다양한 암호화 및 암호 해독 알고리즘을 제공합니다. 이 기사에서는 몇 가지 일반적인 알고리즘을 간략하게 소개합니다.

1. 대칭 암호화 알고리즘

개인 키 암호화 알고리즘이라고도 하는 대칭 암호화 알고리즘은 암호화 및 복호화에 동일한 키를 사용합니다. 일반적인 대칭 암호화 알고리즘에는 DES, 3DES, AES 등이 포함됩니다.

  1. DES 알고리즘

DES(데이터 암호화 표준)는 키 길이가 56비트인 고전적인 대칭 암호화 알고리즘입니다. DES 알고리즘을 사용하는 경우 먼저 키를 생성한 다음 키를 사용하여 일반 텍스트를 암호화하여 암호문을 얻은 다음 키를 사용하여 암호문을 해독하여 일반 텍스트를 얻습니다. Java에서는 JCE(Java Cryptography Extension)에서 제공하는 DES 암호화 및 복호화 기능을 사용할 수 있습니다. 샘플 코드는 다음과 같습니다.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;

public class DESUtil {
    private static final String ALGORITHM = "DES";

    public static String encrypt(String content, String key) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        byte[] byteContent = content.getBytes();
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(byteContent);
        return parseByte2HexStr(result);
    }

    public static String decrypt(String content, String key) throws Exception {
        byte[] decryptFrom = parseHexStr2Byte(content);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(decryptFrom);
        return new String(result);
    }

    private static String parseByte2HexStr(byte[] buf) {
        StringBuilder sb = new StringBuilder();
        for (byte b : buf) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    private static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        String content = "Hello World!";
        String key = "12345678";
        String encrypt = encrypt(content, key);
        System.out.println("加密后:" + encrypt);
        String decrypt = decrypt(encrypt, key);
        System.out.println("解密后:" + decrypt);
    }
}
  1. 3DES 알고리즘

3DES(Triple DES) 알고리즘은 DES 알고리즘을 기반으로 강화된 암호화 알고리즘으로, 키 길이는 168비트입니다. 3DES 알고리즘의 암호화 및 복호화 프로세스는 DES 알고리즘과 유사하며 Java에서 제공하는 JCE 라이브러리를 사용하여 구현할 수 있습니다. 샘플 코드는 다음과 같습니다.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;

public class TripleDESUtil {
    private static final String ALGORITHM = "DESede";

    private static byte[] initKey() throws NoSuchAlgorithmException {
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
        kg.init(168); // 3DES的密钥长度为168位
        SecretKey secretKey = kg.generateKey();
        return secretKey.getEncoded();
    }

    public static String encrypt(String content, byte[] key) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        byte[] byteContent = content.getBytes();
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(byteContent);
        return parseByte2HexStr(result);
    }

    public static String decrypt(String content, byte[] key) throws Exception {
        byte[] decryptFrom = parseHexStr2Byte(content);
        SecretKeySpec skeySpec = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(decryptFrom);
        return new String(result);
    }

    private static String parseByte2HexStr(byte[] buf) {
        StringBuilder sb = new StringBuilder();
        for (byte b : buf) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    private static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        String content = "Hello World!";
        byte[] key = initKey();
        String encrypt = encrypt(content, key);
        System.out.println("加密后:" + encrypt);
        String decrypt = decrypt(encrypt, key);
        System.out.println("解密后:" + decrypt);
    }
}
  1. AES 알고리즘

AES(Advanced Encryption Standard) 알고리즘은 고급 암호화 표준이며 현재 가장 널리 사용되는 대칭 암호화 알고리즘 중 하나입니다. AES 알고리즘의 키 길이는 일반적으로 128비트, 192비트 또는 256비트입니다. Java에서는 JCE 라이브러리에서 제공하는 AES 암호화 및 복호화 기능을 사용할 수도 있습니다. 샘플 코드는 다음과 같습니다.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;

public class AESUtil {
    private static final String ALGORITHM = "AES";

    private static byte[] initKey() throws NoSuchAlgorithmException {
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
        kg.init(128); // AES的密钥长度为128位、192位、256位
        SecretKey secretKey = kg.generateKey();
        return secretKey.getEncoded();
    }

    public static String encrypt(String content, byte[] key) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        byte[] byteContent = content.getBytes();
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(byteContent);
        return parseByte2HexStr(result);
    }

    public static String decrypt(String content, byte[] key) throws Exception {
        byte[] decryptFrom = parseHexStr2Byte(content);
        SecretKeySpec skeySpec = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] result = cipher.doFinal(decryptFrom);
        return new String(result);
    }

    private static String parseByte2HexStr(byte[] buf) {
        StringBuilder sb = new StringBuilder();
        for (byte b : buf) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    private static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        String content = "Hello World!";
        byte[] key = initKey();
        String encrypt = encrypt(content, key);
        System.out.println("加密后:" + encrypt);
        String decrypt = decrypt(encrypt, key);
        System.out.println("解密后:" + decrypt);
    }
}

2. 비대칭 암호화 알고리즘

비대칭 암호화 알고리즘은 공개키 암호화 알고리즘이라고도 하며, 암호화와 복호화에 서로 다른 키를 사용합니다. 일반적인 비대칭 암호화 알고리즘에는 RSA 알고리즘이 포함됩니다.

  1. RSA 알고리즘

RSA 알고리즘은 비대칭 암호화 알고리즘이자 큰 정수를 기반으로 하는 정수론 암호화 알고리즘입니다. RSA 알고리즘의 특징은 공개키는 공개하고 키는 비공개로 하여 보안성이 높다는 점이다. Java에서는 JCE 라이브러리에서 제공하는 RSA 암호화 및 복호화 기능을 사용할 수도 있습니다. 샘플 코드는 다음과 같습니다.

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

public class RSAUtil {
    private static final String ALGORITHM = "RSA";

    private static KeyPair getKeyPair(int keySize) throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    public static String encrypt(String content, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] byteContent = content.getBytes();
        byte[] result = cipher.doFinal(byteContent);
        return parseByte2HexStr(result);
    }

    public static String decrypt(String content, PrivateKey privateKey) throws Exception {
        byte[] decryptFrom = parseHexStr2Byte(content);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(decryptFrom);
        return new String(result);
    }

    private static String parseByte2HexStr(byte[] buf) {
        StringBuilder sb = new StringBuilder();
        for (byte b : buf) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    private static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        String content = "Hello World!";
        KeyPair keyPair = getKeyPair(1024);
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        String encrypt = encrypt(content, publicKey);
        System.out.println("加密后:" + encrypt);
        String decrypt = decrypt(encrypt, privateKey);
        System.out.println("解密后:" + decrypt);
    }
}

위는 Java로 구현된 몇 가지 일반적인 암호화 및 복호화 알고리즘입니다. 실제 애플리케이션에서는 실제 상황에 따라 자신에게 적합한 암호화 및 복호화 알고리즘을 선택하고 특정 요구에 따라 조정 및 최적화해야 합니다.

위 내용은 Java로 구현된 일반적인 암호화 및 암호 해독 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.