最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

Java 中常見的加密算法,DES、3DES、AES、RSA

2023-05-23 14:17 作者:程序員徐公  | 我要投稿

加密算法是一種將數(shù)據(jù)轉(zhuǎn)換為不可讀形式的算法,以保護(hù)數(shù)據(jù)的機(jī)密性和完整性。加密算法被廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)庫、電子商務(wù)等領(lǐng)域,用于保護(hù)敏感數(shù)據(jù)的安全性,如用戶密碼、信用卡信息、醫(yī)療記錄等。在 Java 中,有許多常見的加密算法,本文將對加密算法的基本概念和常見的加密算法進(jìn)行介紹,并附上代碼示例。

在這里插入圖片描述

加密算法的基本概念

加密算法是一種將明文轉(zhuǎn)換為密文的算法。明文是指未經(jīng)加密的數(shù)據(jù),而密文是指經(jīng)過加密算法處理后的不可讀數(shù)據(jù)。加密算法可以分為對稱加密算法和非對稱加密算法兩類。

對稱加密算法是指使用同一個(gè)密鑰進(jìn)行加密和解密,常見的對稱加密算法有 DES、3DES、AES 等。對稱加密算法的優(yōu)點(diǎn)是加密和解密速度快,適用于大數(shù)據(jù)量的加密和解密。但是,對稱加密算法的缺點(diǎn)是密鑰需要在加密和解密雙方之間共享,密鑰的安全性無法得到保障。

非對稱加密算法是指使用不同的密鑰進(jìn)行加密和解密,常見的非對稱加密算法有 RSA、DSA 等。非對稱加密算法的優(yōu)點(diǎn)是密鑰可以在不同的實(shí)體之間共享,密鑰的安全性可以得到保障。但是,非對稱加密算法的缺點(diǎn)是加密和解密速度較慢,適用于小數(shù)據(jù)量的加密和解密。

Java 中常見的加密算法

DES

DES(Data Encryption Standard)是一種對稱加密算法,它使用 56 位密鑰將 64 位明文加密為 64 位密文。DES 算法已經(jīng)被證明不夠安全,因此已經(jīng)被 AES 算法所取代。在 Java 中,可以使用 javax.crypto 包中的類來實(shí)現(xiàn) DES 加密和解密。

下面是使用 DES 加密和解密的示例代碼:

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

public?class?DESUtil?{
????private?static?final?String?KEY_ALGORITHM?=?"DES";
????private?static?final?String?CIPHER_ALGORITHM?=?"DES/ECB/PKCS5Padding";

????/**
?????*?生成?DES?密鑰
?????*/

????public?static?byte[]?generateKey()?throws?NoSuchAlgorithmException?{
????????KeyGenerator?keyGenerator?=?KeyGenerator.getInstance(KEY_ALGORITHM);
????????keyGenerator.init(new?SecureRandom());
????????SecretKey?secretKey?=?keyGenerator.generateKey();
????????return?secretKey.getEncoded();
????}

????/**
?????*?使用?DES?加密數(shù)據(jù)
?????*/

????public?static?byte[]?encrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????cipher.init(Cipher.ENCRYPT_MODE,?secretKeySpec);
????????return?cipher.doFinal(data);
????}

????/**
?????*?使用?DES?解密數(shù)據(jù)
?????*/

????public?static?byte[]?decrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????cipher.init(Cipher.DECRYPT_MODE,?secretKeySpec);
????????return?cipher.doFinal(data);
????}
}

使用示例:

public?class?Main?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//?生成?DES?密鑰
????????byte[]?key?=?DESUtil.generateKey();

????????//?明文
????????byte[]?plainText?=?"Hello,?world!".getBytes();

????????//?使用?DES?加密數(shù)據(jù)
????????byte[]?cipherText?=?DESUtil.encrypt(plainText,?key);

????????//?使用?DES?解密數(shù)據(jù)
????????byte[]?decryptedText?=?DESUtil.decrypt(cipherText,?key);

????????//?輸出結(jié)果
????????System.out.println("明文:"?+?new?String(plainText));
????????System.out.println("密文:"?+?new?String(cipherText));
????????System.out.println("解密后的明文:"?+?new?String(decryptedText));
????}
}

3DES

3DES(Triple DES)是一種對稱加密算法,它使用三個(gè) 56 位的密鑰對數(shù)據(jù)進(jìn)行加密和解密。3DES 算法比 DES 算法更安全,但是加密和解密速度較慢。在 Java 中,可以使用 javax.crypto 包中的類來實(shí)現(xiàn) 3DES 加密和解密。

下面是使用 3DES 加密和解密的示例代碼:

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

public?class?TripleDESUtil?{
????private?static?final?String?KEY_ALGORITHM?=?"DESede";
????private?static?final?String?CIPHER_ALGORITHM?=?"DESede/ECB/PKCS5Padding";

????/**
?????*?生成?3DES?密鑰
?????*/

????public?static?byte[]?generateKey()?throws?NoSuchAlgorithmException?{
????????KeyGenerator?keyGenerator?=?KeyGenerator.getInstance(KEY_ALGORITHM);
????????keyGenerator.init(new?SecureRandom());
????????SecretKey?secretKey?=?keyGenerator.generateKey();
????????return?secretKey.getEncoded();
????}

????/**
?????*?使用?3DES?加密數(shù)據(jù)
?????*/

????public?static?byte[]?encrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????cipher.init(Cipher.ENCRYPT_MODE,?secretKeySpec);
????????return?cipher.doFinal(data);
????}

????/**
?????*?使用?3DES?解密數(shù)據(jù)
?????*/

????public?static?byte[]?decrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????cipher.init(Cipher.DECRYPT_MODE,?secretKeySpec);
????????return?cipher.doFinal(data);
????}
}

使用示例:

public?class?Main?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//?生成?3DES?密鑰
????????byte[]?key?=?TripleDESUtil.generateKey();

????????//?明文
????????byte[]?plainText?=?"Hello,?world!".getBytes();

????????//?使用?3DES?加密數(shù)據(jù)
????????byte[]?cipherText?=?TripleDESUtil.encrypt(plainText,?key);

????????//?使用?3DES?解密數(shù)據(jù)
????????byte[]?decryptedText?=?TripleDESUtil.decrypt(cipherText,?key);

????????//?輸出結(jié)果
????????System.out.println("明文:"?+?new?String(plainText));
????????System.out.println("密文:"?+?new?String(cipherText));
????????System.out.println("解密后的明文:"?+?new?String(decryptedText));
????}
}

AES

AES(Advanced Encryption Standard)是一種對稱加密算法,它使用 128、192 或 256 位密鑰將數(shù)據(jù)加密為密文。AES 算法比 DES 和 3DES 算法更安全,加密和解密速度也更快。在 Java 中,可以使用 javax.crypto 包中的類來實(shí)現(xiàn) AES 加密和解密。

下面是使用 AES 加密和解密的示例代碼:

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

public?class?AESUtil?{
????private?static?final?String?KEY_ALGORITHM?=?"AES";
????private?static?final?String?CIPHER_ALGORITHM?=?"AES/ECB/PKCS5Padding";

????/**
?????*?生成?AES?密鑰
?????*/

????public?static?byte[]?generateKey(int?keySize)?throws?NoSuchAlgorithmException?{
????????KeyGenerator?keyGenerator?=?KeyGenerator.getInstance(KEY_ALGORITHM);
????????keyGenerator.init(keySize,?new?SecureRandom());
????????SecretKey?secretKey?=?keyGenerator.generateKey();
????????return?secretKey.getEncoded();
????}

????/**
?????*?使用?AES?加密數(shù)據(jù)
?????*/

????public?static?byte[]?encrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
????????Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
????????cipher.init(Cipher.ENCRYPT_MODE,?secretKeySpec);
????????return?cipher.doFinal(data);
????}

????/**
?????*?使用?AES?解密數(shù)據(jù)
?????*/

????public?static?byte[]?decrypt(byte[]?data,?byte[]?key)?throws?Exception?{
????????SecretKeySpec?secretKeySpec?=?new?SecretKeySpec(key,?KEY_ALGORITHM);
Cipher?cipher?=?Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE,?secretKeySpec);
return?cipher.doFinal(data);
}
}

使用示例:

public?class?Main?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//?生成?AES?密鑰
????????byte[]?key?=?AESUtil.generateKey(128);

????????//?明文
????????byte[]?plainText?=?"Hello,?world!".getBytes();

????????//?使用?AES?加密數(shù)據(jù)
????????byte[]?cipherText?=?AESUtil.encrypt(plainText,?key);

????????//?使用?AES?解密數(shù)據(jù)
????????byte[]?decryptedText?=?AESUtil.decrypt(cipherText,?key);

????????//?輸出結(jié)果
????????System.out.println("明文:"?+?new?String(plainText));
????????System.out.println("密文:"?+?new?String(cipherText));
????????System.out.println("解密后的明文:"?+?new?String(decryptedText));
????}
}

RSA

RSA 是一種非對稱加密算法,它使用公鑰和私鑰對數(shù)據(jù)進(jìn)行加密和解密。公鑰可以公開,任何人都可以使用公鑰加密數(shù)據(jù),但是只有持有私鑰的人才能夠解密數(shù)據(jù)。在 Java 中,可以使用 java.security 包中的類來實(shí)現(xiàn) RSA 加密和解密。

下面是使用 RSA 加密和解密的示例代碼:

import?javax.crypto.Cipher;
import?java.security.KeyPair;
import?java.security.KeyPairGenerator;

public?class?RSAUtil?{
????private?static?final?String?KEY_ALGORITHM?=?"RSA";
????private?static?final?int?KEY_SIZE?=?1024;

????/**
?????*?生成?RSA?密鑰對
?????*/

????public?static?KeyPair?generateKeyPair()?throws?Exception?{
????????KeyPairGenerator?keyPairGenerator?=?KeyPairGenerator.getInstance(KEY_ALGORITHM);
????????keyPairGenerator.initialize(KEY_SIZE);
????????return?keyPairGenerator.generateKeyPair();
????}

????/**
?????*?使用公鑰加密數(shù)據(jù)
?????*/

????public?static?byte[]?encrypt(byte[]?data,?byte[]?publicKey)?throws?Exception?{
????????Cipher?cipher?=?Cipher.getInstance(KEY_ALGORITHM);
????????cipher.init(Cipher.ENCRYPT_MODE,?KeyUtil.getPublicKey(publicKey));
????????return?cipher.doFinal(data);
????}

????/**
?????*?使用私鑰解密數(shù)據(jù)
?????*/

????public?static?byte[]?decrypt(byte[]?data,?byte[]?privateKey)?throws?Exception?{
????????Cipher?cipher?=?Cipher.getInstance(KEY_ALGORITHM);
????????cipher.init(Cipher.DECRYPT_MODE,?KeyUtil.getPrivateKey(privateKey));
????????return?cipher.doFinal(data);
????}
}

import?java.security.Key;
import?java.security.KeyFactory;
import?java.security.spec.PKCS8EncodedKeySpec;
import?java.security.spec.X509EncodedKeySpec;

public?class?KeyUtil?{
????private?static?final?String?KEY_ALGORITHM?=?"RSA";

????/**
?????*?將公鑰的字節(jié)數(shù)組轉(zhuǎn)換為?Key?對象
?????*/

????public?static?Key?getPublicKey(byte[]?publicKey)?throws?Exception?{
????????X509EncodedKeySpec?keySpec?=?new?X509EncodedKeySpec(publicKey);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????return?keyFactory.generatePublic(keySpec);
????}

????/**
?????*?將私鑰的字節(jié)數(shù)組轉(zhuǎn)換為?Key?對象
?????*/

????public?static?Key?getPrivateKey(byte[]?privateKey)?throws?Exception?{
????????PKCS8EncodedKeySpec?keySpec?=?new?PKCS8EncodedKeySpec(privateKey);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????return?keyFactory.generatePrivate(keySpec);
????}
}

使用示例:

public?class?Main?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//?生成?RSA?密鑰對
????????KeyPair?keyPair?=?RSAUtil.generateKeyPair();
????????byte[]?publicKey?=?keyPair.getPublic().getEncoded();
????????byte[]?privateKey?=?keyPair.getPrivate().getEncoded();

????????//?明文
????????byte[]?plainText?=?"Hello,?world!".getBytes();

????????//?使用公鑰加密數(shù)據(jù)
????????byte[]?cipherText?=?RSAUtil.encrypt(plainText,?publicKey);

????????//?使用私鑰解密數(shù)據(jù)
????????byte[]?decryptedText?=?RSAUtil.decrypt(cipherText,?privateKey);

????????//?輸出結(jié)果
????????System.out.println("明文:"?+?new?String(plainText));
????????System.out.println("密文:"?+?new?String(cipherText));
????????System.out.println("解密后的明文:"?+?new?String(decryptedText));
????}
}

以上是 Java 中常見的加密算法示例代碼,這些算法在實(shí)際應(yīng)用中都有廣泛的應(yīng)用。需要注意的是,在使用加密算法時(shí)需要注意密鑰的安全性,以免被攻擊者竊取或猜測密鑰,導(dǎo)致數(shù)據(jù)泄露或被篡改。


Java 中常見的加密算法,DES、3DES、AES、RSA的評論 (共 條)

分享到微博請遵守國家法律
汽车| 白城市| 武威市| 石柱| 齐齐哈尔市| 伊川县| 财经| 克东县| 靖江市| 祥云县| 富宁县| 秀山| 赣州市| 西丰县| 改则县| 盐城市| 贵定县| 太谷县| 全州县| 汉川市| 密山市| 邹平县| 衡山县| 乌海市| 平顺县| 基隆市| 富川| 民县| 天长市| 榕江县| 漾濞| 长寿区| 屏南县| 龙川县| 句容市| 垫江县| 隆尧县| 芦溪县| 禹州市| 阿克| 华宁县|