本示例包含了DES, DESede和AES算法。 其中AES算法的密钥长度可以为128, 192 或者 256, 但是要想正常使用192和256位的密钥长度, 需要替换JRE默认的两个策略文件local_policy.jar和US_export_policy.jar。该策略文件下载地址:
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jce_policy-6-oth-JPR@CDS-CDS_Developer
下载完后替换%JRE_HOME%\lib\security目录下的策略文件即可。
1. 环境
JDK1.6
无限制的策略文件local_policy.jar
无限制的策略文件US_export_policy.jar
commons-codec-1.4.jar
2. 代码
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.apache.commons.codec.binary.Base64;
/**
* 初等数据加密, 对称加密
* @author yuan
*
*/
public class SymmetricalCipher {
/**
* ALGORITHM 算法 <br>
* 可替换为以下任意一种算法,同时key值的size相应改变。
* <pre>
* DES key size must be equal to 56
* DESede(TripleDES) key size must be equal to 112 or 168
* AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
* Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
* RC2 key size must be between 40 and 1024 bits
* RC4(ARCFOUR) key size must be between 40 and 1024 bits
* </pre>
*/
protected String cipherAlgorithm = "DES/EBC/PKCS5Padding"; // 算法/工作模式/填充方式
protected Key key;
private SymmetricalCipher(String keyAlgorithm, String cipherAlgorithm, int keySize)throws Exception{
this.cipherAlgorithm = cipherAlgorithm;
key = initKey(keyAlgorithm, keySize);
}
public static SymmetricalCipher getDESInstace()throws Exception{
return getDESInstace("ECB", "PKCS5Padding", 56);
}
public static SymmetricalCipher getDESInstace(String mode, String fill, int keySize)throws Exception{
return new SymmetricalCipher("DES", "DES/"+mode+"/"+fill, keySize);
}
public static SymmetricalCipher getDESedeInstance()throws Exception{
return getDESedeInstance("ECB", "PKCS5Padding", 168);
}
public static SymmetricalCipher getDESedeInstance(String mode, String fill, int keySize)throws Exception{
return new SymmetricalCipher("DESede", "DESede/"+mode+"/"+fill, keySize);
}
public static SymmetricalCipher getAESInstace()throws Exception{
return getAESInstace("ECB", "PKCS5Padding", 256);
}
public static SymmetricalCipher getAESInstace(String mode, String fill, int keySize)throws Exception{
return new SymmetricalCipher("AES", "AES/"+mode+"/"+fill, keySize);
}
public Key getKey(){
return key;
}
public String getKeyString(){
return Base64.encodeBase64String(key.getEncoded());
}
/**
* 解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public byte[] decrypt(byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(cipherAlgorithm);
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* 加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public byte[] encrypt(byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(cipherAlgorithm);
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* 生成密钥
*
* @param seed
* @return
* @throws Exception
*/
private Key initKey(String keyAlgorithm, int keySize) throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(keyAlgorithm);
kg.init(keySize);
SecretKey secretKey = kg.generateKey();
return secretKey;
}
}
3. 测试代码
SymmetricalCipher cipher = null;
cipher = SymmetricalCipher.getDESInstace();
System.out.println("DES密钥: " + cipher.getKeyString());
byte[] desData = cipher.encrypt("DES加密".getBytes());
System.out.println("密文: " + Base64.encodeBase64String(desData));
byte[] desr = cipher.decrypt(desData);
System.out.println("明文: " + new String(desr));
cipher = SymmetricalCipher.getDESedeInstance();
System.out.println("DESede密钥: " + cipher.getKeyString());
byte[] desedeData = cipher.encrypt("DESede加密".getBytes());
System.out.println("密文: " + Base64.encodeBase64String(desedeData));
byte[] desedeText = cipher.decrypt(desedeData);
System.out.println("明文: " + new String(desedeText));
cipher = SymmetricalCipher.getAESInstace();
System.out.println("AES密钥: " + cipher.getKeyString());
byte[] data = cipher.encrypt("AES加密".getBytes());
System.out.println(Base64.encodeBase64String(data));
byte[] r = cipher.decrypt(data);
System.out.println(new String(r));
分享到:
相关推荐
登录时,用户的密码用明文传输...非对称加密算法常用RSA算法,秘钥使用base64编码成字符串,后端使用jdk8的标准API,前端使用jsencrypt.js进行RSA的对应操作。经过测试,本例中的前后端代码的加密解密计算结果是一致的。
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
对称加密:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
6.用对方的公钥对称密钥进行加密(加密密钥) 7.将密文(5)和加密密钥(6)一起发给对方 接收方: 1.用自己的私钥对加密密钥进行解密,得到对称密钥--也只有自己才能解密。 2.用对称密钥对密文进行解密,得到...
用mfc写的一个对称加密程序 用mfc写的一个对称加密程序 用mfc写的一个对称加密程序
非对称加密JAVA实现,实现对超长内容进行加密
主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
非对称加密算法流程图,使用visio绘制。
JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现JAVA 对称加密 实现
C# RSA非对称加密 实现私钥加密 公钥解密;可以用于生成授权码。 RSA生成一下随机值,然后都是用BigInteger类字符串跟字节数组互转
非对称加密技术研究 一篇关于非对称加密技术的介绍,详细!
.net c# RSA对称加密, 解决加密长度限制,可以直接使用
C# 对称加密类算法 C# 对称加密类算法 C# 对称加密类算法
PBE算法是对称加密算法的综合算法,常见算法PBEWithMD5AndDES,使用MD5和DES算法构建了PBE算法。将盐附加在口令上,通过消息摘要算法经过迭代获得构建密钥的基本材料,构建密钥后使用对称加密算法进行加密解密。 ...
java编写的加密解密工具,有对称加密和非对称加密
C++实现RSA的非对称加密算法 1. 包含针对默认填充的实现和SHA256的实现 2. 包好非对称加密过程中的多种形式填充 3. 标准的base64加密等
对称加密 非对称加密 需要的jar包
对称加密算法封装的函数系列名字是以EVP_Encrypt*...*开头的,其实,这些函数只是简单调用了EVP_Cipher*...*系列的同名函数,换一个名字可能是为了更好的区别和理解。除了实现了对称加密算法外,EVP_Encrypt*...*...
本工具是用于golang编写的,用于rsa非对称加密技术实现的对字符串的加密解密工具,可以对文件进行加密解密(txt、docx、xls文档等)。对文档加密会对文档同目录下生成一个后缀名加.hh的文档。 操作说明: 一、对字符...
3Des对称加密在JS实现,此处代码要与https://blog.csdn.net/yufang131/article/details/79869964文章一起看(只包含JS部分)。《三重Des对称加密在JS、Android、Ios 和Java 平台的实现(多加一个JS实现)》