本文共 3426 字,大约阅读时间需要 11 分钟。
import com.sun.org.apache.xml.internal.security.utils.Base64;import org.apache.commons.io.FileUtils;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.File;import java.nio.charset.Charset;import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;public class RSAdemo { public static void main(String[] args) throws Exception { String input = "硅谷"; // 加密算法 String algorithm = "RSA"; PrivateKey privateKey = getPrivateKey("a.pri", algorithm); } public static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{ // 将文件内容转为字符串 String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset()); // 获取密钥工厂 KeyFactory keyFactory = KeyFactory.getInstance(algorithm); // 构建密钥规范 进行Base64解码 PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString)); // 生成私钥 return keyFactory.generatePrivate(spec); } /** * 生成密钥对并保存在本地文件中 * * @param algorithm : 算法 * @param pubPath : 公钥保存路径 * @param priPath : 私钥保存路径 * @throws Exception */ private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception { // 获取密钥对生成器 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm); // 获取密钥对 KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 获取公钥 PublicKey publicKey = keyPair.getPublic(); // 获取私钥 PrivateKey privateKey = keyPair.getPrivate(); // 获取byte数组 byte[] publicKeyEncoded = publicKey.getEncoded(); byte[] privateKeyEncoded = privateKey.getEncoded(); // 进行Base64编码 String publicKeyString = Base64.encode(publicKeyEncoded); String privateKeyString = Base64.encode(privateKeyEncoded); // 保存文件 FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8")); FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8")); } /** * 解密数据 * * @param algorithm : 算法 * @param encrypted : 密文 * @param key : 密钥 * @return : 原文 * @throws Exception */ public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{ // 创建加密对象 // 参数表示加密算法 Cipher cipher = Cipher.getInstance(algorithm); // 私钥进行解密 cipher.init(Cipher.DECRYPT_MODE,key); // 由于密文进行了Base64编码, 在这里需要进行解码 byte[] decode = Base64.decode(encrypted); // 对密文进行解密,不需要使用base64,因为原文不会乱码 byte[] bytes1 = cipher.doFinal(decode); System.out.println(new String(bytes1)); return new String(bytes1); } /** * 使用密钥加密数据 * * @param algorithm : 算法 * @param input : 原文 * @param key : 密钥 * @return : 密文 * @throws Exception */ public static String encryptRSA(String algorithm,Key key,String input) throws Exception{ // 创建加密对象 // 参数表示加密算法 Cipher cipher = Cipher.getInstance(algorithm); // 初始化加密 // 第一个参数:加密的模式 // 第二个参数:使用私钥进行加密 cipher.init(Cipher.ENCRYPT_MODE,key); // 私钥加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 对密文进行Base64编码 System.out.println(Base64.encode(bytes)); return Base64.encode(bytes); }}
转载地址:http://szfzb.baihongyu.com/