import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStore.PasswordProtection;
import java.security.KeyStore.SecretKeyEntry;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableEntryException;
import java.security.cert.CertificateException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class AESTest {
private static final String KEY_FILE = "C:/Users/wangdon/Downloads/rm-TEST.ks";
private static final String ALIAS = "RM-AES";
private static final String PASSWORD = "U09NRVRISU5HQllCQVNFNjRkd2FuZ0AxcWF6QFdTWDNlREMkUmZ2"; // It actually equal to KEY_STORE_PASSWORD. I use KEY_STORE_PASSWORD in this case because it seems more safe.
private static final byte[] KEY_STORE_PASSWORD = { 0x55, 0x30, 0x39, 0x4e, 0x52, 0x56, 0x52, 0x49, 0x53, 0x55, 0x35, 0x48, 0x51, 0x6c, 0x6c, 0x43, 0x51, 0x56, 0x4e, 0x46, 0x4e, 0x6a, 0x52, 0x6b, 0x64, 0x32, 0x46, 0x75, 0x5a, 0x30, 0x41, 0x78, 0x63, 0x57, 0x46, 0x36, 0x51, 0x46, 0x64, 0x54, 0x57, 0x44, 0x4e, 0x6c, 0x52, 0x45, 0x4d, 0x6b, 0x55, 0x6d, 0x5a, 0x32 };
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* It will create a new secret key and save it in key store file
*/
public static void saveSecretKey() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {
KeyGenerator kgen = KeyGenerator.getInstance("AES"); // By default JDK uses sunJCE provider
kgen.init(128, new SecureRandom()); // sunJCE can only support 128 bit length key. For 256 bit key, see Bouncy Castle provider
SecretKey secretKey = kgen.generateKey();
String tmp = Base64.getEncoder().encodeToString(secretKey.getEncoded());
System.out.println("The secretKey in base64 encoded is: " + tmp + ", with length=" + tmp.length());
KeyStore keyStore = KeyStore.getInstance("JCEKS");
keyStore.load(null, null); // Initialize it firstly
PasswordProtection keyPassword = new PasswordProtection(Base64.getEncoder().encodeToString(KEY_STORE_PASSWORD).toCharArray());
SecretKeyEntry keyStoreEntry = new SecretKeyEntry(secretKey); //JCEKS support SecretKeyEntry
keyStore.setEntry(ALIAS, keyStoreEntry, keyPassword);
keyStore.store(new FileOutputStream(KEY_FILE), new String(KEY_STORE_PASSWORD).toCharArray());
}
public static SecretKey loadSecretKey() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableEntryException {
KeyStore keyStore = KeyStore.getInstance("JCEKS");
keyStore.load(new FileInputStream(KEY_FILE), new String(KEY_STORE_PASSWORD).toCharArray());
PasswordProtection keyPassword = new PasswordProtection(Base64.getEncoder().encodeToString(KEY_STORE_PASSWORD).toCharArray());
SecretKey secretKey = ((SecretKeyEntry) keyStore.getEntry(ALIAS, keyPassword)).getSecretKey();
String tmp = Base64.getEncoder().encodeToString(secretKey.getEncoded());
System.out.println("The secretKey in base64 encoded is: " + tmp + ", with length=" + tmp.length());
return secretKey;
}
public static String encrypt(SecretKey key, String source) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance(ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(key.getEncoded());
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encodedInByte = cipher.doFinal(source.getBytes());
String encodedInStr = Base64.getEncoder().encodeToString(encodedInByte);
System.out.println("\"" + source + "\" is encryped in base64 encoded is: " + encodedInStr);
return encodedInStr;
}
public static String decrypt(SecretKey key, String encoded) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance(ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(key.getEncoded());
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] encodedInByte = Base64.getDecoder().decode(encoded);
encodedInByte = cipher.doFinal(encodedInByte);
String source = new String(encodedInByte);
System.out.println("Decoded to " + source);
return source;
}
public static void main(String[] args) throws Exception {
saveSecretKey();
SecretKey aesKey = loadSecretKey();
String source = "ABCD";
String encoded = encrypt(aesKey, source);
decrypt(aesKey, encoded);
}
}
- 浏览: 27058 次
文章分类
最新评论
发表评论
-
Java Generics 泛型汇总
2016-12-06 08:23 4361. 泛型类。在类名后面声明泛型变量。 class Ge ... -
Java 8 – Lambda Expressions
2015-10-29 12:28 767A lambda expression is basicall ... -
Problems when upgrading to Java8
2015-09-25 11:19 5101. Some dependencies those run ... -
ThreadLocal
2015-05-26 15:19 4191.ThreadLocal干什么的? ThreadLoca ... -
JAXP SAX DOM StAX
2015-04-04 14:32 552SAX: Simple API for XML DOM: ... -
Java enum的使用
2014-09-04 14:41 500enum TestEnum { NONE("n ... -
Collection, TreeMap, LinkedHashMap, TreeSet, LinkedHashSet, Comparable
2014-05-22 11:27 6171. Collections.sort(): List& ... -
用HashSet去除自定义类型的重复 - 重写equals()和hashCode()方法
2014-05-21 17:08 5691. 目前的J2SE所有key-value的容器类型中都会用到 ... -
多线程:使用FutureTask获得线程返回值+同步线程
2014-05-21 17:07 814public class FutureTaskTest { ... -
Java线程池类ThreadPoolExecutor的使用 JDK自带的4种线程池
2014-05-21 17:05 1974首先,继承关系: Executor -> Executo ... -
使用thread.join()同步线程
2014-05-21 17:03 548适用于线程间的简单同步:在不使用线程池(ThreadPoolE ... -
JAXP SAX DOM StAX
2014-05-21 16:57 62SAX: Simple API for XML DOM: ... -
ClassLoader
2014-04-08 16:24 747一、什么是ClassLoader? ... -
OutOfMemory种类和简单分析
2014-04-08 16:17 4061) 永久区溢出 Exceptio ...
相关推荐
Java AES(Advanced Encryption Standard)加密解密是一种广泛应用于软件开发中的数据保护技术,主要用于保护敏感信息,如用户密码、个人信息等。AES标准是由NIST(美国国家标准与技术研究所)在2001年确立,取代了...
Java实现的AES(Advanced Encryption Standard)程序是一种使用高级加密标准对数据进行加解密的工具。AES是目前广泛采用的块密码算法,以其安全性高、效率好、易于实现等特点,在网络安全、数据保护等领域中有着重要...
本文将深入探讨基于Java实现的AES(Advanced Encryption Standard)加密解密。AES是一种广泛应用的对称加密算法,具有高效、安全的特点,被广泛应用于各种场景,如数据传输、文件保护等。 首先,我们来理解一下AES...
- Java提供KeyStore类来存储和管理证书和密钥,支持JKS(Java Key Store)和PKCS12格式。 - 导出和导入密钥通常涉及Base64编码或PEM格式。 7. **解密代码示例** - 基于上述的描述,Decrypt.java可能包含以下内容...
可以使用`java.security.KeyStore`来安全地存储密钥,或者使用密钥派生函数(如PBKDF2)从用户提供的密码派生密钥。 5. **示例代码**: 通常,AES加密和解密的Java代码会包含以下几个步骤: - 导入必要的库:`...
在Java中实现AES加密解密,我们需要使用`javax.crypto`包中的相关类。主要包括以下关键步骤: 1. **密钥生成**:首先,我们需要创建一个AES密钥。这通常通过`KeyGenerator`类完成,需要指定密钥长度。例如,创建一...
IvParameterSpec ivParams = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParams); ``` 5. **加密/解密操作**:执行加密或解密操作,注意加密后的结果通常包含IV,以便解密时使用。...
在Android中,我们可以使用Java Cryptography Extension (JCE) 来实现AES加密解密。以下是一个简单的步骤概述: 1. **生成密钥**:使用`KeyGenerator`类生成AES密钥。例如: ```java KeyGenerator keyGen = ...
在Android中,我们可以使用Java的`javax.crypto`包来实现AES加密。 首先,我们需要导入必要的库: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec....
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); ``` 4. **读取音频文件**:使用FileInputStream读取音频文件的原始数据。 5. **执行加密**:将...
Java提供KeyStore类来管理密钥对和证书,可存储在本地文件系统或远程服务器上。 五、安全编码与最佳实践 1. 使用最新版本的JCA/JCE,以获取最新的安全更新和增强功能。 2. 避免硬编码密钥,而是使用安全的方式存储...
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] encryptedBytes = cipher.doFinal(plaintextBytes); ``` 3. 非对称加密示例: ```java ...
在Android应用开发中,通常会使用Java的`javax.crypto`包来实现AES加解密。以下将详细介绍如何在Android中使用AES。 1. **导入必要的库**:在Android项目中,首先需要导入`javax.crypto`和`java.security`相关的库...
Java提供`java.security.KeyStore`类来管理公钥和私钥,以及证书。通过`KeyStore.load()`方法加载密钥库,然后使用相应的密码获取密钥。 5. **加密流**:Java还提供了`CipherInputStream`和`CipherOutputStream`,...
可以使用密钥派生函数(如PBKDF2、bcrypt或Argon2)将用户提供的密码转换为密钥,或者使用密钥存储服务(如Java的KeyStore)来保护密钥。 7. **错误处理和安全性**:在实现过程中,要处理可能的异常,如密钥长度不...
在实际应用中,我们通常会将密钥和IV保存在安全的地方,如应用程序的密钥链(iOS)或Android Keystore系统。同时,为了防止中间人攻击,通常会在服务器端生成并分发这些密钥。 总之,"iOS 安安卓 通用AES加密"意味...
2. **Android中的加密库**:Android提供了Java Cryptography Extension (JCE)库,其中包含了AES加密所需的API。此外,还有第三方库,如Bouncy Castle,提供更丰富的加密功能和更好的性能。 3. **实现步骤**: - **...
Java提供`java.security.KeyStore`类来管理证书和密钥对,确保密钥的安全。 综上所述,Java加密与解密的艺术涉及众多知识领域,包括对称加密、非对称加密、数字签名、哈希函数以及密钥管理等。通过熟练掌握这些技术...
对于Android,由于其基于Java,所以3DES的实现基本与Java相同,只是需要注意在Android 9(Pie)及以上版本,需要使用`AndroidKeyStore`来存储密钥,以满足更严格的加密要求。 在iOS中,可以使用`CommonCrypto`框架...
在Android中,我们可以使用Java Cryptography Extension (JCE)库来实现AES加密。这个库提供了必要的接口和类,使得开发者能够轻松地集成加密功能到他们的应用程序中。 1. **AES加密流程**: - 选择一个密钥:AES...