密码学【java】初探究加密方式之非对称加密
生活随笔
收集整理的這篇文章主要介紹了
密码学【java】初探究加密方式之非对称加密
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 非對稱加密
- 1 常見算法
- 2 生成公鑰和私鑰
- 3 私鑰加密
- 4 私鑰加密 公鑰解密
- 5 公鑰和私鑰的保存和讀取
- 5.1 **保存公鑰和私鑰**
- 5.2 讀取公鑰和私鑰
非對稱加密
- 特點
- 加密和解密使用不同的密鑰
- 如果使用私鑰加密, 只能使用公鑰解密
- 如果使用公鑰加密, 只能使用私鑰解密
- 處理數據的速度較慢, 因為安全級別高
- 示例
- 首先生成密鑰對, 公鑰為(5,14), 私鑰為(11,14),A希望將原文2發送給B
- A使用公鑰加密數據. 2的5次方mod 14 = 4 , 將密文4發送給B
- B使用私鑰解密數據. 4的11次方mod14 = 2, 得到原文2
1 常見算法
- RSA
- RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
- RSA公開密鑰密碼體制是一種使用不同的加密密鑰與解密密鑰。
- RSA能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標準。只有短的RSA鑰匙才可能被強力方式解破。世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。
- RSA算法基于一個十分簡單的數論事實:將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
- RSA在線工具
- 希望深入學習RSA的小伙伴,請移步公開密鑰加密之RSA算法
- ECC(Elliptic curve cryptography)
- 橢圓曲線密碼學(ECC),一種建立公開密鑰加密的演算法,基于橢圓曲線數學。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
- 希望深入學習ECC的小伙伴,請移步ECC橢圓曲線加解密原理詳解(配圖)
2 生成公鑰和私鑰
public static void main(String[] args) throws NoSuchAlgorithmException {// 加密算法String algorithm = "RSA";// 創建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 獲取私鑰字節數組byte[] privateKeyEncoded = privateKey.getEncoded();// 獲取公鑰字節數組byte[] publicKeyEncoded = publicKey.getEncoded();// 對公私鑰進行base64編碼String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);// 打印私鑰System.out.println("私鑰:"+privateKeyString);// 打印公鑰System.out.println("共鑰:"+publicKeyString);} 私鑰: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共鑰:MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAuoaZDELPg9F3n0zREqKM9wmrs/E6ZezWhypt1/Ga6izv0HwqltmaKM5ZFxYu58zcD0AXxL9VY F4Yk+VTsvq9uC3HN6GpDbUll2LgaF62iV3aROxKlSnT0mW8c09zoUkNEKl9xdmNfXrs+UQfIw/RgRCflR05wSiKboF+Iqwlo9U2CmwfFxmx/OcHFhuLh9pJ+ NQ6jPCD8PU0w6TKMluwRB0obpTkvuxtTXe667Wn9LQspPW1XZrPTrvicylkXwkBcbhB9bFr4o1uEfNzkGH6RmtpLyYIlED9DvU0ApqdPiJlok4Vn2G4qqxci VcpyA5KPJhV11qJZnX6tZsrjYNdurFHtcD5mYbSAufeYafeuSvG8E4koPMHrklzpAFyewq+DiwjopkqweKnS7nqowITHEFrh12xmQqp627ThZs8cUTR/E1o4 cj77V5XX+2ytAkGkrhNpHwIu2CsAcMyPIgG1aJmIexHVbzB6v2JcBD4PA6nLgCTg2qnJ2bMu6JirmVnAgMBAAE=3 私鑰加密
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {String input = "國泰民安";// 加密算法String algorithm = "RSA";// 創建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 創建加密對象// 參數表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一個參數:加密的模式// 第二個參數:使用私鑰進行加密cipher.init(Cipher.ENCRYPT_MODE,privateKey);// 私鑰加密byte[] bytes = cipher.doFinal(input.getBytes());System.out.println(Base64.encodeBase64String(bytes));} gjfiD1F+DOFk2IHqrTWSKe+8qGLCihNuu+RrZY6CKji0H56RUhSL3P5fW2X3FXpCrY+CMsGg16HfmR3boeX1qY4e0NJU0JtE1Ch4uERigH1eM/MUCUaFaVI4 9roDAcqbz0v+lnsX41mOCQ4YSd742XoIg7cJX1GcsHhkXDF3JCM/fDxdHYR63ApmSpzr+qfoelntnc+Xah90i3UR/PPiEZ6/6JWz7mU5DK/X5IVnqgGObNCl syH7tWcwl34IcrszFvK4ovtxeYVQken7IHgW8LMCxWGXWyDThC+9A/d9AV9vlLLuzZcYEvRYMS5BzZqr9gzdrgYE1hsRouFQ0yyuOUoVAbaqAjqhPRTTIj0E QUl2PpB7hi561x/j/58w9dsoI3gKp/G6SBl40yyuxbm5z/RGYxjeZhyIC4Lm/ddpCQpJ5qzZ/WX6N9fSqjwQLaHSQpgmsy5zdZRkZchxknw8LgONSzObwA5/ F561oXgtHWD44+SzZHoOGY3hDSU3oKMT4 私鑰加密 公鑰解密
- 私鑰加密,只能公鑰解密
5 公鑰和私鑰的保存和讀取
5.1 保存公鑰和私鑰
public static void main(String[] args) throws Exception {String input = "硅谷";// 加密算法String algorithm = "RSA";//生成密鑰對并保存在本地文件中generateKeyToFile(algorithm, "a.pub", "a.pri");}/*** 生成密鑰對并保存在本地文件中** @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.encodeBase64String(publicKeyEncoded);String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));}5.2 讀取公鑰和私鑰
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 s = encryptRSA(algorithm, privateKey, input);String res = decryptRSA(algorithm, publicKey, s);System.out.println(res);}/*** 解密數據** @param algorithm : 算法* @param encrypted : 密文* @param key : 密鑰* @return : 原文*/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.decodeBase64(encrypted);// 對密文進行解密,不需要使用base64,因為原文不會亂碼byte[] bytes1 = cipher.doFinal(decode);return new String(bytes1);}/*** 使用密鑰加密數據** @param algorithm : 算法* @param input : 原文* @param key : 密鑰* @return : 密文*/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編碼return Base64.encodeBase64String(bytes);}public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{// 將文件內容轉為字符串String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());// 獲取密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 構建密鑰規范 進行Base64解碼X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));// 生成公鑰return keyFactory.generatePublic(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.encodeBase64String(publicKeyEncoded);String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));}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.decodeBase64(privateKeyString));// 生成私鑰return keyFactory.generatePrivate(spec);}總結
以上是生活随笔為你收集整理的密码学【java】初探究加密方式之非对称加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站建设与维护常识
- 下一篇: 实时视频通信技术调研