# aisino-encrypt
**Repository Path**: jackframe/aisino-encrypt
## Basic Information
- **Project Name**: aisino-encrypt
- **Description**: 对数据加密解密的封装,包含MD5,RSA,SHA,AES,DES,DH
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: release
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-09-15
- **Last Updated**: 2024-07-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 加密算法工具类操作手册(v1.0-SNAPSHOT)
## 概述
该工具类中包含了
1.摘要加密算法(MD5、SHA1)
2.对称加密算法(AES、DES/DES3)
3.非对称加密算法(RSA、DH)
未引入任何依赖,java1.8以上环境即可导入并运行。
引入方式:
```xml
com.aisino.api
aisino-encrypt
0.1.0
```
引入后通过AisinoEncrypt.方法名()调用所需方法。
## 默认加密算法
默认加密算法为DES加密,默认的密钥为aisinodefkey(aisino default key)。
```java
/**
* 默认密钥
*/
public static final String DEFAULT_KEY = "aisinodefkey";
```
默认方法中的密钥不能进行修改。主要方法:
```java
/**
* 默认加密方法
* 默认为RSA加密
*
* @param content 需要加密的内容
* @return 返回加密后的内容
*/
String encrypt(String content);
/**
* 默认解密方法
* RSA解密
*
* @param ciphertext 密匙
* @return 返回解密后的内容
*/
String decrypt(String ciphertext)//ciphertext 需要解密的内容
```
具体使用方法如下:
```java
String content = "需要加密的内容";
String ciphertext = AisinoEncrypt.encrypt(content);//默认方法加密
System.out.println("encrypt: " + ciphertext);//输出加密后内容
String decrypt = AisinoEncrypt.decrypt(ciphertext);//默认方法解密
System.out.println("decrypt: " + decrypt);//输出解密后内容
```
控制台输出结果如下:
```html
encrypt: JcC7lRz7TIQabcOiWbM32sEB0BlbMTrm
decrypt: 需要加密的内容
```
## 摘要加密算法
摘要算法有MD5和SHA1两种,通过传入的Digest枚举类中的算法名(Digest.MD5 / Digest.SHA)来判断调用的哪个算法。主要方法:
```java
/**
* content 需要加密的内容
* digest Digest枚举类
**/
String encryptDigest(String content, Digest digest);
/**
* 摘要加密算法加密为不可逆过程,因此只提供matchDigest()方法
* 对加密后的内容与原文进行比对,返回为true则比对成功。
* context 加密前的内容
* ciphertext 加密后的内容
* digest Digest枚举类
**/
boolean matchDigest(String context, String ciphertext, Digest digest)
```
摘要加密算法加密为不可逆过程,因此只提供matchDigest()方法对加密后的内容与原文进行比对,返回为true则比对成功。
示例:
```java
String encryptDigest = AisinoEncrypt.encryptDigest("需要加密的内容", Digest.MD5);
boolean b = AisinoEncrypt.matchDigest(content, encryptDigest, Digest.MD5);
System.out.println("加密后:" + encryptDigest);
System.out.println("加密前后比较:" + b);
```
控制台输出:
```html
加密后:3d0bb45281e89215e19aea406ffdee08
加密前后比较:true
```
## 对称加密算法
对称加密算法(SymmetricEncrypt)包括AES、DES和3DES三种加密算法,通过
```java
AisinoEncrypt.encryptSymmetric(content,key,Symmetric.AES);
```
进行加密调用。
**注\*:密钥需按照要求传入**
**AES密钥位数为128/192/256位,字节长度为24/32/44,当长度为24时以==结尾,长度为44时以=结尾。**
**DES密钥位数为56位,字节长度为12,3DES密钥位数为112/168位,字节长度为32,且不能有特殊的标点符号。如 !@#¥%……&*()—+_,./?<>;':"|\~·等,但可以在末尾跟 “=” 符号。**
> **字节长度为字符串转换为字节后的长度**
该加密也提供默认的密钥生成方法,可以通过自动生成获得密钥,并将密钥保存并传入到对称加密算法中进行加解密。
主要方法:
```java
/**
* 生成对称加密算法的密钥
*
* @param symmetric 算法类型
* @return key 返回对称加密算法的密钥
*/
String initSymmetricKey(Symmetric symmetric);
/**
* 对称加密
*
* @param symmetric 加密类型
* @param content 需要加密的内容
* @param key 密匙
* @return 返回加密后的密文
*/
String encryptSymmetric(String content, String key, Symmetric symmetric);
/**
* 对称解密
*
* @param ciphertext 密文
* @param key 密钥
* @param symmetric 对称加密类型
* @return 返回解密后的内容
*/
String decryptSymmetric(String ciphertext, String key, Symmetric symmetric);
```
代码示例如下:
```java
//调用对称加密算法加密
String s = AisinoEncrypt.encryptSymmetric(content, "aisinosymmetricencrypt==", Symmetric.AES);
System.out.println("encrypt: " + s);
String s2 = AisinoEncrypt.decryptSymmetric(s, "aisinosymmetricencrypt==", Symmetric.AES);
System.out.println("decrypt: " + s2);
//如果不想自定义密钥,可通过方法生成对称加密默认密钥
String key = AisinoEncrypt.initSymmetricKey(Symmetric.AES);
System.out.println("key: " + key);
String s1 = AisinoEncrypt.encryptSymmetric(content, key, Symmetric.AES);
System.out.println("encrypt: " + s1);
String s3 = AisinoEncrypt.decryptSymmetric(s1, key, Symmetric.AES);
System.out.println("decrypt: " + s3);
```
控制台输出如下:
```html
encrypt: QUYACrYXFvnd6IKMIi9h5sBOMJxv63UuQTPRq8lPN8g=
decrypt: 需要加密的内容
key: lb+1Totf2nwwQI/65PiIhA==
encrypt: LzAxxrLptBaoY5qYS5XT+rWpZXu0CLMfx72zvPVldn4=
decrypt: 需要加密的内容
```
## 非对称加密算法
非对称加密算法中提供了RSA、DH和BCrypt算法,通过AisinoEncrypt.rsa()、AisinoEncrypt.dh()方法进行调用。需要注意的是,rsa和dh都需要密钥对(公钥 + 私钥)的方式对内容进行加密解密。同时也可以通过直接调用RSA、DH的方式进行加密。
**注:因非对称加密的密钥比较长,因此不推荐自己编写密钥,推荐使用提供的密钥生成工具生成密钥。**
### RSA
RSA算法需要构建密钥对(公钥+私钥),这里以甲乙双方发送数据为模型
1.甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方
2.甲方将数据用私钥进行加密,发送给乙方
3.乙方用甲方提供的公钥对数据进行解密
如果乙方向传送数据给甲方:
4.乙方用公钥对数据进行加密,然后传送给甲方
5.甲方用私钥对数据进行解密
**注*:(1)如果通过公钥加密则需要通过私钥解密,如果通过私钥加密则需要公钥进行解密。RSA的公钥最小长度为128,私钥最小长度为460**
**(2)RSA加密算法对于需要加密的明文长度有限制,如果密钥长度设置为512,则只能加密53个字节以下的明文,解密64个字节以下的密文。若设置为1024,则能加密117个字节以下的明文,解密128个字节以下的密文。RSA的密钥字节长度只能设置在512到1024之间!**
主要方法:
```java
/**
* 初始化密钥对
*
* @return Map 甲方密钥对的Map集合(公钥 + 私钥)
*/
Map initKey();
/**
* 传入密钥长度初始化密钥对
* @param keySize 密钥长度
* @return Map 甲方密钥对的Map集合(公钥 + 私钥)
*/
Map initKey(int keySize);
/**
* 私钥加密
*
* @param content 待加密数据
* @param key 密钥
* @return String 加密数据
*/
String encryptByPrivateKey(String content, String key);
/**
* 公钥加密
*
* @param content 待加密数据
* @param key 密钥
* @return String 加密数据
*/
String encryptByPublicKey(String content, String key);
/**
* 私钥解密
*
* @param ciphertext 待解密数据
* @param key 密钥
* @return String 解密数据
*/
String decryptByPrivateKey(String ciphertext, String key);
/**
* 公钥解密
*
* @param ciphertext 待解密数据
* @param key 密钥
* @return String 解密数据
*/
String decryptByPublicKey(String ciphertext, String key);
/**
* 取得私钥
*
* @param keyMap 密钥map
* @return String 私钥
*/
String getPrivateKey(Map keyMap);
/**
* 取得公钥
*
* @param keyMap 密钥map
* @return String 公钥
*/
String getPublicKey(Map keyMap);
```
RSA取出私钥和公钥:
```java
String publicKey = AisinoEncrypt.rsa().getPublicKey(keys1);
String privateKey = AisinoEncrypt.rsa().getPrivateKey(keys1);
System.out.println("publicKey: " + publicKey);
System.out.println("privateKey: " + privateKey);
```
控制台输出:
```html
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJXxSoOda4wW3FVUkNqezGnvRPdXJYcdJLDt241sg/S0eFkEQ1SbuoBoQ1klSaHHKlO2hQHLo1kH8jZvMcj3lMECAwEAAQ==
privateKey: MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAlfFKg51rjBbcVVSQ2p7Mae9E91clhx0ksO3bjWyD9LR4WQRDVJu6gGhDWSVJoccqU7aFAcujWQfyNm8xyPeUwQIDAQABAkB6AUIOYfL2pEtYK11KZlgSApztXT2t+Sq3xHMXWirs2wPsAd44/cYMIPMtshBA1EbDBzAm+6XGocfEt8i2aIWhAiEA1U62SuV3L5DpCGq3z8xHHnS+ROfRoAhFLOSSVCtFBd0CIQCz8+87rXvwRLG+/pIzgncl3XZqaeYic4KX+GjOwwf2NQIhAMCWb6oRodmVaYEK8WixVGjgGMYX08E8llBhEujhpFEVAiBuuEDSxBwEqg9/B1znCnfKuWc5dCzft5h7bqD1znPgnQIhAI9yc1Ypv52MNv5WuT74hy8RZOksoNighNip6fIDILn2
```
RSA加密示例如下:
```java
/**
* 通过调用AisinoEncrypt.rsa()的方式进行RSA加密
*/
//初始化密钥对
Map keys1 = AisinoEncrypt.rsa().initKey();
System.out.println("AisinoEncrypt.rsa() keys1: " + keys1);
//公钥加密
String encryptByPublicKey1 = AisinoEncrypt.rsa().encryptByPublicKey(content, AisinoEncrypt.rsa().getPublicKey(keys1));
System.out.println("AisinoEncrypt.rsa() enctypt: " + encryptByPublicKey1);
//私钥解密
String decryptByPrivateKey1 = AisinoEncrypt.rsa().decryptByPrivateKey(encryptByPublicKey1, AisinoEncrypt.rsa().getPrivateKey(keys1));
System.out.println("AisinoEncrypt.rsa() decrypt: " + decryptByPrivateKey1);
//私钥加密
String encryptByPrivateKey1 = RSA.encryptByPrivateKey(content, RSA.getPrivateKey(keys1));
System.out.println("AisinoEncrypt.rsa() enctypt: " + encryptByPrivateKey1);
//公钥解密
String decryptByPublicKey1 = RSA.decryptByPublicKey(encryptByPrivateKey1, RSA.getPublicKey(keys1));
System.out.println("AisinoEncrypt.rsa() decrypt: " + decryptByPublicKey1);
/**
* 通过调用RSA类的方式进行RSA加密
*/
Map keys = RSA.initKey();
System.out.println("RSA keys1: " + keys1);
//公钥加密
String encryptByPublicKey = RSA.encryptByPublicKey(content, RSA.getPublicKey(keys));
System.out.println("RSA enctypt: " + encryptByPublicKey);
//私钥解密
String decryptByPrivateKey = RSA.decryptByPrivateKey(encryptByPublicKey, RSA.getPrivateKey(keys));
System.out.println("RSA decrypt: " + decryptByPrivateKey);
//私钥加密
String encryptByPrivateKey = RSA.encryptByPrivateKey(content, RSA.getPrivateKey(keys));
System.out.println("RSA enctypt: " + encryptByPrivateKey);
//公钥解密
String decryptByPublicKey = RSA.decryptByPublicKey(encryptByPrivateKey, RSA.getPublicKey(keys));
System.out.println("RSA decrypt: " + decryptByPublicKey);
```
控制台输出:
```html
AisinoEncrypt.rsa() keys1: {RSAPublicKey=Sun RSA public key, 512 bits
modulus: 7918666909438184385488567534062240807811750452911138970565579848285703717976930503097872640283851967651398593427512978982410856636678465776826376527385999
public exponent: 65537, RSAPrivateKey=sun.security.rsa.RSAPrivateCrtKeyImpl@fffdbf30}
AisinoEncrypt.rsa() enctypt: b5PusMHH0OWhiSxsyJQgQDRfiRDUa1NpiIdXCYDiWAYDGgN2O1FTouPmO5EE7wOk/ePqC8m8rPDVAIaLxCrzBw==
AisinoEncrypt.rsa() decrypt: 需要加密的内容
AisinoEncrypt.rsa() enctypt: QYAw6ciPaBtKHSYnVmsaIruJN6AW4fSEdSjKFr24KWx9lgFO5xMCpeX1hMLubam7LoMYLvnA07BeGPEgZGuHYQ==
AisinoEncrypt.rsa() decrypt: 需要加密的内容
RSA keys1: {RSAPublicKey=Sun RSA public key, 512 bits
modulus: 7918666909438184385488567534062240807811750452911138970565579848285703717976930503097872640283851967651398593427512978982410856636678465776826376527385999
public exponent: 65537, RSAPrivateKey=sun.security.rsa.RSAPrivateCrtKeyImpl@fffdbf30}
RSA enctypt: UqQAslEg0KSu/ffBdYalajzPWfsJ6/zP3uY+2VYbmWxvYRFuklTnts8sRbSR1RbadiIQKmKdM+KqDqxP/+Citg==
RSA decrypt: 需要加密的内容
RSA enctypt: qs6uLBlqZqfaxLZvWyuoo1D2usfQdPeN+M4M2KRcPK2rrIkb32eUTi2sJeP9iRt+Mptzmgog7B9tXIGRqxh1SQ==
RSA decrypt: 需要加密的内容
```
### DH
DH 算法是 Diffie和Hellman两位作者于1976年提出了一种的密钥交换协议。这种加密算法主要用于密钥的交换,能够实现了在非安全网络下通信双方密钥的安全建立,从而使通信双方能够使用这个密钥进行消息的加密解密,从而实现通信的安全。
1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。
2.甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给乙方加密后的数据;乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。
3.乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给甲方加密后的数据;甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。
主要方法:
```java
/**
* 甲方初始化并返回密钥对
*
* @return 返回生成的密钥对
*/
Map initKey();
/**
* 传入密钥长度以使甲方初始化并返回密钥对
* @param keySize 密钥长度
* @return 返回生成的密钥对
*/
Map initKey(int keySize);
/**
* 乙方根据甲方公钥初始化并返回密钥对
*
* @param key 甲方的公钥
* @return 返回乙方生成的密钥对
*/
Map initKey(String key);
/**
* 根据对方的公钥和自己的私钥生成 本地密钥,返回的是SecretKey对象的字节数组
*
* @param publicKey 公钥
* @param privateKey 私钥
* @return 返回SecretKey对象的字节数组
*/
String getSecretKeyBytes(String publicKey, String privateKey);
/**
* 从 Map 中取得公钥
*
* @param keyMap 密钥对
* @return 返回从 Map 中取得的公钥
*/
String getPublicKey(Map keyMap);
/**
* 从 Map 中取得私钥
*
* @param keyMap 密钥对
* @return 返回从 Map 中取得的私钥
*/
String getPrivateKey(Map keyMap);
/**
* DH 加密
*
* @param data 带加密数据
* @param publicKey 甲方公钥
* @param privateKey 乙方私钥
* @return 密文
*/
String encryptDH(String data, String publicKey, String privateKey);
/**
* DH 解密
*
* @param data 待解密数据
* @param publicKey 乙方公钥
* @param privateKey 甲方私钥
* @return 解密后的内容
*/
public static String decryptDH(String data, String publicKey, String privateKey);
```
DH加密示例如下:
```java
@Test
public void encryptDH(){
String content = "需要加密的内容";
/* Test DH */
// 甲方公钥
String senderPublicKey;
// 甲方私钥
String senderPrivateKey;
// 甲方本地密钥
String senderSecretKey;
// 乙方公钥
String receiverPublicKey;
// 乙方私钥
String receiverPrivateKey;
// 乙方本地密钥
String receiverSecretKey;
// 初始化密钥 并生成甲方密钥对
Map keyMap1 = AisinoEncrypt.dhEncrypt().initKey();
senderPublicKey = AisinoEncrypt.dhEncrypt().getPublicKey(keyMap1);
senderPrivateKey = AisinoEncrypt.dhEncrypt().getPrivateKey(keyMap1);
System.out.println("DH 甲方公钥 : " + senderPublicKey);
System.out.println("DH 甲方私钥 : " + senderPrivateKey);
// 乙方根据甲方公钥产生乙方密钥对
Map keyMap2 = AisinoEncrypt.dhEncrypt().initKey(senderPublicKey);
receiverPublicKey = AisinoEncrypt.dhEncrypt().getPublicKey(keyMap2);
receiverPrivateKey = AisinoEncrypt.dhEncrypt().getPrivateKey(keyMap2);
System.out.println("DH 乙方公钥 : " + receiverPublicKey);
System.out.println("DH 乙方私钥 : " + receiverPrivateKey);
// 对于甲方, 根据其私钥和乙方发过来的公钥, 生成其本地密钥secretKey1
senderSecretKey = AisinoEncrypt.dhEncrypt().getSecretKeyBytes(receiverPublicKey, senderPrivateKey);
System.out.println("DH 甲方 本地密钥 : " + senderSecretKey);
// 对于乙方, 根据其私钥和甲方发过来的公钥, 生成其本地密钥secretKey2
receiverSecretKey = AisinoEncrypt.dhEncrypt().getSecretKeyBytes(senderPublicKey, receiverPrivateKey);
System.out.println("DH 乙方 本地密钥 : " + receiverSecretKey);
// 测试数据加密和解密
System.out.println("加密前的数据: " + content);
// 甲方进行数据的加密
// 用的是甲方的私钥和乙方的公钥
String encryptDH = AisinoEncrypt.dhEncrypt().encryptDH(content, receiverPublicKey, senderPrivateKey);
System.out.println("加密后的数据: " + encryptDH);
// 乙方进行数据的解密
// 用的是乙方的私钥和甲方的公钥
String decryptDH = AisinoEncrypt.dhEncrypt().decryptDH(encryptDH, senderPublicKey, receiverPrivateKey);
System.out.println("解密后数据: " + decryptDH);
}
```
控制台输出:
```html
DH 甲方公钥 : MIIBpzCCARsGCSqGSIb3DQEDATCCAQwCgYEA/X9TgR11EilS30qcLuzk5/YRt1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoCAgIAA4GFAAKBgQDGdDUCHETkkDC/7GGohBKjUDO0eBRrO8d9IZKIne3c5Kr4mOytrRvBWFSH6SGB8yTCJqqC2tf5TvDY7kEk6PQW8XMtqRI0AZEMlHPpG1uRo12uvMEk03/YARz785YKGW1Vt8BFy1vrJIStC8i0h+DxdSzBY/cJ4OBTp4Ynt2Xd1g==
DH 甲方私钥 : MIIBZwIBADCCARsGCSqGSIb3DQEDATCCAQwCgYEA/X9TgR11EilS30qcLuzk5/YRt1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoCAgIABEMCQQDSrH0/EVSsgVipYJGABA9sajBfWkk56MAJauJ4tcDGKY130olUsaaBhkzoNgHzk4pwpTYKAj8xsAhzvn1inXBH
DH 乙方公钥 : MIIBpzCCARsGCSqGSIb3DQEDATCCAQwCgYEA/X9TgR11EilS30qcLuzk5/YRt1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoCAgIAA4GFAAKBgQDFKemcDu/FWN4fc7ESLqbSNUj6+eeBHiyo55tc1Sq5gFqoatET3MKUttKifCWGWRhmdQYBMjIXu83x/UobdEyG7rs166RroE7G7F/wDjBfT5/NUSZdImBwOB54eZjxcyvzY1SrwycZqhXZ3g51anujERZa+dryeNsdOZWoooYAug==
DH 乙方私钥 : MIIBZwIBADCCARsGCSqGSIb3DQEDATCCAQwCgYEA/X9TgR11EilS30qcLuzk5/YRt1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoCAgIABEMCQQCWRN3yc2CWqLLLH38ovypGM5594x8GaEMauSLwbVfLIdB/ztSfO3c23KCE06GonZ+0SbUVLEmGYLVqHLc2vxLv
DH 甲方 本地密钥 : T9ZoIMgETF4=
DH 乙方 本地密钥 : T9ZoIMgETF4=
加密前的数据: 需要加密的内容
加密后的数据: s5Y8S9gApyG5U6lSjAym5z1V1TYTdVBS
解密后数据: 需要加密的内容
```
直接调用DH类进行加密解密的方法和上面相同,就不再过多阐述。
## 获取密钥的字节长度
```java
/**
* 获取密钥的字节长度
*
* @param key 密钥
* @return 密钥字节长度
*/
int getKeyByteLength(String key);
```