赞
踩
- “ 算法/模式/填充 ”或“ 算法 ”
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
- 在该一种情况下,使用模式和填充方案的提供者特定的默认值
Cipher c = Cipher.getInstance("DES");
public class ByteBit {
public static void main(String[] args) {
String a = "a";
byte[] bytes = a.getBytes();
for (byte aByte : bytes) {
int c = aByte;
System.out.println(c);
// byte 字节,对应的bit是多少
String s = Integer.toBinaryString(c);
System.out.println(s);
}
}
}
public static void main(String[] args) throws Exception{
String a = "A";
byte[] bytes = a.getBytes();
for (byte aByte : bytes) {
System.out.println(aByte);
String s = Integer.toBinaryString(aByte);
System.out.println(s);
}
}
public static void main(String[] args) throws Exception{
String a = "天";
byte[] bytes = a.getBytes();
for (byte aByte : bytes) {
System.out.println(aByte);
String s = Integer.toBinaryString(aByte);
System.out.println(s);
}
}
public static void main(String[] args) throws Exception{
String a = "天";
byte[] bytes = a.getBytes("GBK");
for (byte aByte : bytes) {
System.out.println(aByte);
String s = Integer.toBinaryString(aByte);
System.out.println(s);
}
}
public static void main(String[] args) throws Exception{ // 原文 String input = "天下"; // des加密必须是8位 String key = "12345678"; // 算法 String algorithm = "DES"; String transformation = "DES"; // Cipher:密码,获取加密对象 // transformation:表示使用什么类型加密 Cipher cipher = Cipher.getInstance(transformation); /* 第一步:指定秘钥规则 第一个参数表示:密钥,key的字节数组 第二个参数表示:算法 */ SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); /* 第二步:对加密进行初始化 第一个参数:表示模式,有加密模式和解密模式 第二个参数:表示秘钥规则 */ cipher.init(Cipher.ENCRYPT_MODE,sks); // 第三步:进行加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 打印密文,因为ascii码有负数,解析不出来,所以乱码 System.out.println(new String(bytes)); // }
java.security.InvalidKeyException: Wrong key size
at java.base/com.sun.crypto.provider.DESCrypt.init(DESCrypt.java:536)
at java.base/com.sun.crypto.provider.ElectronicCodeBook.init(ElectronicCodeBook.java:97)
at java.base/com.sun.crypto.provider.CipherCore.init(CipherCore.java:481)
at java.base/com.sun.crypto.provider.CipherCore.init(CipherCore.java:399)
at java.base/com.sun.crypto.provider.DESCipher.engineInit(DESCipher.java:187)
at java.base/javax.crypto.Cipher.implInit(Cipher.java:869)
at java.base/javax.crypto.Cipher.chooseProvider(Cipher.java:931)
at java.base/javax.crypto.Cipher.init(Cipher.java:1301)
at java.base/javax.crypto.Cipher.init(Cipher.java:1238)
at DESTest.test1(DESTest.java:31)
org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Base64;
//对数据进行Base64编码
String s = Base64.encodeBase64String(bytes);
System.out.println(s);
import org.junit.Test; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class DESTest { @Test public void test() throws Exception { String input ="天下"; // DES加密算法,key的大小必须是8个字节 String key = "12345678"; String transformation = "DES"; // 指定获取密钥的算法 String algorithm = "DES"; String encryptDES = encryptDES(input, key, transformation, algorithm); System.out.println("加密:" + encryptDES); String s = decryptDES(encryptDES, key, transformation, algorithm); System.out.println("解密:" + s); } /** * 使用DES加密数据 * * @param input : 原文 * @param key : 密钥(DES,密钥的长度必须是8个字节) * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @return : 密文 * @throws Exception */ private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 获取加密对象 Cipher cipher = Cipher.getInstance(transformation); // 创建加密规则 // 第一个参数key的字节 // 第二个参数表示加密算法 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // ENCRYPT_MODE:加密模式 // 初始化加密模式和算法 cipher.init(Cipher.ENCRYPT_MODE,sks); // 加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 输出加密后的数据 String encode = Base64.encodeBase64String(bytes); return encode; } /** * 使用DES解密 * * @param input : 密文 * @param key : 密钥 * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @throws Exception * @return: 原文 */ private static String decryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 1,获取Cipher对象 Cipher cipher = Cipher.getInstance(transformation); // 指定密钥规则 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // DECRYPT_MODE: 解密模式 cipher.init(Cipher.DECRYPT_MODE, sks); // 3. 解密,上面使用的base64编码,下面直接用密文 byte[] bytes = cipher.doFinal(Base64.decodeBase64(input)); // 因为是明文,所以直接返回 return new String(bytes); } }
java.security.InvalidKeyException: Invalid AES key length: 8 bytes
import org.junit.Test; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class DESTest { @Test public void test() throws Exception { String input ="天下"; // DES加密算法,key的大小必须是8个字节 String key = "12345678"; String transformation = "AES"; // 指定获取密钥的算法 String algorithm = "AES"; String encryptDES = encryptDES(input, key, transformation, algorithm); System.out.println("加密:" + encryptDES); String s = decryptDES(encryptDES, key, transformation, algorithm); System.out.println("解密:" + s); } /** * 使用DES加密数据 * * @param input : 原文 * @param key : 密钥(DES,密钥的长度必须是8个字节) * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @return : 密文 * @throws Exception */ private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 获取加密对象 Cipher cipher = Cipher.getInstance(transformation); // 创建加密规则 // 第一个参数key的字节 // 第二个参数表示加密算法 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // ENCRYPT_MODE:加密模式 // 初始化加密模式和算法 cipher.init(Cipher.ENCRYPT_MODE,sks); // 加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 输出加密后的数据 String encode = Base64.encodeBase64String(bytes); return encode; } /** * 使用DES解密 * * @param input : 密文 * @param key : 密钥 * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @throws Exception * @return: 原文 */ private static String decryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 1,获取Cipher对象 Cipher cipher = Cipher.getInstance(transformation); // 指定密钥规则 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // DECRYPT_MODE: 解密模式 cipher.init(Cipher.DECRYPT_MODE, sks); // 3. 解密,上面使用的base64编码,下面直接用密文 byte[] bytes = cipher.doFinal(Base64.decodeBase64(input)); // 因为是明文,所以直接返回 return new String(bytes); } }
public static void main(String[] args) {
// 表示密文
String str="TU0jV0xBTiNVYys5bEdiUjZlNU45aHJ0bTdDQStBPT0jNjQ2NDY1Njk4IzM5OTkwMDAwMzAwMA==";
// 使用base64进行解码
String rlt1=new String(Base64.decodeBase64(str.getBytes()));
// 使用base64进行解码
String rlt2= Base64.decodeBase64(str).toString();
System.out.println("new String===" + rlt1);
System.out.println("toString==" + rlt2);
}
哪一个是正确的?为什么?
new String()的方法,因为Base64加解密是一种转换编码格式的原理
toString()与new String ()用法区别
String:[class name]@[hashCode]
new String(str)
是根据parameter是一个字节数组,使用java虚拟机默认的编码格式,将字节数组decode为对应的字符。若虚拟机默认的编码格式是ISO-8859-1
,按照ascii
编码表即可得到字节对应的字符。两个方法的使用时机:
new String()
:一般使用字符转码的时候,byte[]数组的时候toString()
:对象打印的时候使用默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding
如果使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
加密模式和填充模式
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public static void main(String[] args) throws Exception{ // 原文 如果使用的是不填充的模式,那么原文必须是8个字节的整数倍 String input = "天下"; // 定义key // 如果使用des进行加密,那么密钥必须是8个字节 String key = "12345678"; // ECB:表示加密模式 // PKCS5Padding:表示填充模式 qANksk5lvqM= // 如果默认情况,没有写填充模式和加密模式,那么默认就使用DES/ECB/PKCS5Padding String transformation = "DES/CBC/PKCS5Padding"; // 加密类型 String algorithm = "DES"; // 指定获取密钥的算法 String encryptDES = encryptDES(input, key, transformation, algorithm); System.out.println("加密:" + encryptDES); String s = decryptDES(encryptDES, key, transformation, algorithm); System.out.println("解密:" + s); } /** * 解密 * @param encryptDES 密文 * @param key 密钥 * @param transformation 加密算法 * @param algorithm 加密类型 * @return */ private static String decryptDES(String encryptDES, String key, String transformation, String algorithm) throws Exception{ Cipher cipher = Cipher.getInstance(transformation); SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorithm); // 创建iv向量 IvParameterSpec iv = new IvParameterSpec(key.getBytes()); //Cipher.DECRYPT_MODE:表示解密 // 解密规则 cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,iv); // 解密,传入密文 byte[] bytes = cipher.doFinal(Base64.decodeBase64(encryptDES)); return new String(bytes); } /** * 使用DES加密数据 * * @param input : 原文 * @param key : 密钥(DES,密钥的长度必须是8个字节) * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @return : 密文 * @throws Exception */ private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 获取加密对象 Cipher cipher = Cipher.getInstance(transformation); // 创建加密规则 // 第一个参数key的字节 // 第二个参数表示加密算法 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // 创建iv向量,iv向量,是使用到CBC加密模式 // 在使用iv向量进行加密的时候,iv的字节也必须是8个字节 IvParameterSpec iv = new IvParameterSpec("12345678".getBytes()); // ENCRYPT_MODE:加密模式 // DECRYPT_MODE: 解密模式 // 初始化加密模式和算法 cipher.init(Cipher.ENCRYPT_MODE,sks,iv); // 加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 输出加密后的数据 String encode = Base64.encodeBase64String(bytes); return encode; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。