200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Java代码实现非对称加密RSA算法示例

Java代码实现非对称加密RSA算法示例

时间:2022-11-23 07:37:07

相关推荐

Java代码实现非对称加密RSA算法示例

非对称加密:有两把密钥;使用公钥加密,必须使用私钥解密;或者使用私钥加密,必须使用公钥解密

加解密核心类:Cipher

下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥保存到文件中,读取公钥和私钥,对明文进行加密和解密。代码中都有详细的注释,如果代码中有哪些地方没看明白的,可以直接评论

import java.io.File;import java.io.IOException;import java.nio.charset.Charset;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;import mons.codec.binary.Base64;import mons.io.FileUtils;public class AsymmetricEncryption {public static void main(String[] args) throws Exception{String input="巅峰小苏";//需要加密的数据String algorithm="RSA";//加密算法//生成密钥对并保存在本地文件中generateKeyToFile(algorithm,"a.pub","a.pri");//读取私钥PrivateKey privateKey = getPrivateKey("a.pri", algorithm);//读取公钥PublicKey publicKey = getPublicKey("a.pub", algorithm);//加密String en=encryptRSA(algorithm, privateKey, input);System.out.println("加密:"+en);//解密String de=decryptRSA(algorithm, publicKey, en);System.out.println("解密:"+de);}/*** 私钥加密* @param algorithm 算法* @param privateKey 私钥* @param input 原文* @return* @throws Exception*/public static String encryptRSA(String algorithm,Key privateKey,String input)throws Exception{//创建加密对象Cipher cipher=Cipher.getInstance(algorithm);//对加密进行初始化,第一个参数是:加密的模式//第二个参数是:你想使用公钥加密还是私钥加密,这里使用的是私钥加密cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] bytes=cipher.doFinal(input.getBytes());return Base64.encodeBase64String(bytes);}/*** 公钥解密* @param algorithm 算法* @param publickey 公钥* @param encrypted 密文* @return* @throws Exception*/public static String decryptRSA(String algorithm,Key publickey,String encrypted)throws Exception{Cipher cipher=Cipher.getInstance(algorithm);//注意:如果使用公钥加密就必须使用私钥解密,使用私钥加密就必须使用公钥解密,否则会出现异常cipher.init(Cipher.DECRYPT_MODE, publickey);//把base64密文转回字节数组byte[] decode=Base64.decodeBase64(encrypted);byte[] bytes1=cipher.doFinal(decode);//这里要用new String()转字符串,不能用.toString()方法,否则返回的是哈希值return new String(bytes1);}/*** 把公钥和私钥保存到根目录* @param algorithm 算法* @param pubPath公钥路径* @param priPath私钥路径* @throws NoSuchAlgorithmException* @throws IOException*/private static void generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {// 密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 初始化密钥长度keyPairGenerator.initialize(1024);// 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私钥PrivateKey privateKey = keyPair.getPrivate();// 获取私钥的字节数组byte[] privateKeyEncoded = privateKey.getEncoded();// 使用base64进行编码String privateEncodeString = Base64.encodeBase64String(privateKeyEncoded);System.out.println("私钥:" + privateEncodeString);// 生成公钥PublicKey publicKey = keyPair.getPublic();// 获取公钥的字节数组byte[] publicKeyEncoded = publicKey.getEncoded();// 使用base64进行编码String publicEncodeString = Base64.encodeBase64String(publicKeyEncoded);System.out.println("公钥:" + publicEncodeString);//把公钥和私钥保存到根目录FileUtils.writeStringToFile(new File(pubPath), publicEncodeString,Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateEncodeString,Charset.forName("UTF-8"));}/*** 读取私钥* @param priPath 私钥的路径* @param algorithm 算法* @return* @throws Exception 返回私钥的key对象*/private static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{String privateKeyString=FileUtils.readFileToString(new File(priPath),Charset.defaultCharset());//创建key的工厂KeyFactory keyFactory=KeyFactory.getInstance(algorithm);//创建私钥key的规则PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));//返回私钥对象return keyFactory.generatePrivate(keySpec);}/*** 读取公钥* @param priPath 公钥的路径* @param algorithm 算法* @return* @throws Exception 返回公钥的key对象*/private static PublicKey getPublicKey(String publicPath,String algorithm) throws Exception{String publicKeyString=FileUtils.readFileToString(new File(publicPath),Charset.defaultCharset());//创建key的工厂KeyFactory keyFactory=KeyFactory.getInstance(algorithm);//创建公钥key的规则X509EncodedKeySpec keySpec=new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));//返回公钥对象return keyFactory.generatePublic(keySpec);}}

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。如果觉得本文章有帮助到的,点个赞呗,让更多的阅读者看到

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。