日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

密码学【java】初探究加密方式之非对称加密

發(fā)布時(shí)間:2024/1/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 密码学【java】初探究加密方式之非对称加密 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 非對稱加密
    • 1 常見算法
    • 2 生成公鑰和私鑰
    • 3 私鑰加密
    • 4 私鑰加密 公鑰解密
    • 5 公鑰和私鑰的保存和讀取
      • 5.1 **保存公鑰和私鑰**
      • 5.2 讀取公鑰和私鑰

非對稱加密

  • 非對稱加密算法又稱現(xiàn)代加密算法。非對稱加密是計(jì)算機(jī)通信安全的基石,保證了加密數(shù)據(jù)不會被破解。
  • 與對稱加密算法不同,非對稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey) 和私有密(privatekey)
  • 公開密鑰和私有密鑰是一對。如果用公開密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私有密鑰才能解密。如果用私有密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的公開密鑰才能解密。
  • 因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對稱加密算法。

    • 特點(diǎn)
      • 加密和解密使用不同的密鑰
      • 如果使用私鑰加密, 只能使用公鑰解密
      • 如果使用公鑰加密, 只能使用私鑰解密
      • 處理數(shù)據(jù)的速度較慢, 因?yàn)榘踩墑e高

    • 示例
    • 首先生成密鑰對, 公鑰為(5,14), 私鑰為(11,14),A希望將原文2發(fā)送給B
    • A使用公鑰加密數(shù)據(jù). 2的5次方mod 14 = 4 , 將密文4發(fā)送給B
    • B使用私鑰解密數(shù)據(jù). 4的11次方mod14 = 2, 得到原文2

    1 常見算法

    • RSA
      • RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
      • RSA公開密鑰密碼體制是一種使用不同的加密密鑰與解密密鑰。
      • RSA能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。只有短的RSA鑰匙才可能被強(qiáng)力方式解破。世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實(shí)際上是不能被解破的。
      • RSA算法基于一個(gè)十分簡單的數(shù)論事實(shí):將兩個(gè)大質(zhì)數(shù)相乘十分容易,但是想要對其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
      • RSA在線工具
      • 希望深入學(xué)習(xí)RSA的小伙伴,請移步公開密鑰加密之RSA算法
    • ECC(Elliptic curve cryptography)
      • 橢圓曲線密碼學(xué)(ECC),一種建立公開密鑰加密的演算法,基于橢圓曲線數(shù)學(xué)。橢圓曲線在密碼學(xué)中的使用是在1985年由Neal Koblitz和Victor Miller分別獨(dú)立提出的。
      • 希望深入學(xué)習(xí)ECC的小伙伴,請移步ECC橢圓曲線加解密原理詳解(配圖)

    2 生成公鑰和私鑰

    public static void main(String[] args) throws NoSuchAlgorithmException {// 加密算法String algorithm = "RSA";// 創(chuàng)建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 獲取私鑰字節(jié)數(shù)組byte[] privateKeyEncoded = privateKey.getEncoded();// 獲取公鑰字節(jié)數(shù)組byte[] publicKeyEncoded = publicKey.getEncoded();// 對公私鑰進(jìn)行base64編碼String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);// 打印私鑰System.out.println("私鑰:"+privateKeyString);// 打印公鑰System.out.println("共鑰:"+publicKeyString);} 私鑰:MIIG/QIBADANBgkqhkiG9w0BAQEFAASCBucwggbjAgEAAoIBgQC6hpkMQs+D0XefTNESooz3Cauz8Tpl7NaHKm3X8ZrqLO/QfCqW2ZoozlkXFi7nzNwPQ BfEv1VgXhiT5VOy+r24Lcc3oakNtSWXYuBoXraJXdpE7EqVKdPSZbxzT3OhSQ0QqX3F2Y19euz5RB8jD9GBEJ+VHTnBKIpugX4irCWj1TYKbB8XGbH85wcWG 4uH2kn41DqM8IPw9TTDpMoyW7BEHShulOS+7G1Nd7rrtaf0tCyk9bVdms9Ou+JzKWRfCQFxuEH1sWvijW4R83OQYfpGa2kvJgiUQP0O9TQCmp0+ImWiThWfY biqrFyJVynIDko8mFXXWolmdfq1myuNg126sUe1wPmZhtIC595hp965K8bwTiSg8weuSXOkAXJ7Cr4OLCOimSrB4qdLueqjAhMcQWuHXbGZCqnrbtOFmzxxR NH8TWjhyPvtXldf7bK0CQaSuE2kfAi7YKwBwzI8iAbVomYh7EdVvMHq/YlwEPg8DqcuAJODaqcnZsy7omKuZWcCAwEAAQKCAYAIQ96URIGdfbKnRGgfQ0Srz anmF1JXId9/rcmgP/x1U/hsbJQWix3hoQMhmsIJU3KM2nIzLadC1eiQ5SCIVcQCXUTumiM7kENSKfd3qHq+K4J4e1/yrB/OuuNW2LZu9yW1D02bbsBuRvwpL 3ORwimuZmYr3Vepz3oS23oTXz1rvQ7f91qJU4InirUtrZrJMksE06KkjCPMkZD8+lhbUuTEn+YiwEZCj4doX13RBAOlPDaeOKUIuMtm2bx3DeZ8r5Flbhas9 n3/OELgIgJ6omKaipgHdWTVkaowbCZcJsUUoKyjQNHRZ4ae/0ie1I4IvhS9hml+8gcuPOu+kVpNyYvmUZZQoPFv9QaVyL16OSgGR80/7k4/JB3a7SldbEKqY Gasij3B8Agq0oXOY2oV5srs/wsum+HxzdKEFhAd+7YIYtxx82LzNes8NUg32NxaNMvoO2OqmSDqZo1Mu5lQBYWo/pPKJPxoT2oq2+9hAVgimvaUm1PoUEu2W /H6lOOKdQECgcEA0QtPgKtJc0LCxLInXBl286tspYPSbToGuBJe7/IVQjWlCEs0quX8xUcFeRAUSIDPGtKHfgVQoLd6XuizXvPYwHaJdgc/mqPyoyMhYwPQy Kr3njwDNLbI0jZTZVnz1iGEujYFbOCAsZraJLqgSeofxQHJNwy1v+DJj+6pn1k4rLjNrrRPgn8JdpCV9RttZ0xIZWpxYUO6z+wYvWLd8MXaGBT0UQcMK0Wh2 hCT5XVOJ0RjucQ0dsq+xnQz6eSnpmDRAoHBAORsaKrfFfE1U9Foj39Qg5gcJUKh1UYwl6dt3utrETSKnP5g7t0XlqYcB4nTs7V+MA8ooAlUroXpWIm62v2PX ugda4qLtEZAF4uNcUX9a8kGfj4Cxqw0DCrLhN2KkoLKGdyyNoZQGqZCGqXU70G+UBkDrGTZwBt55GurhISZHBb7BJWL+Q4cPnEdwxSwDJxT1E0aCN6na+8HS laiFp8UL7Ewox5nHzHizsOEYx9ZRZb8Owd2J7hUzEm0ga0rNRgwtwKBwQDFgco755oeLJWZAjnt6qFY2D5uo33NdWWjxLeuPSuYwtaKX4QDdAi+27twBqEjX 5BN51vc1Wi4cKJNyc6vh/Ti4xw9R9vwX7aALFD/HDvHXMFX35un0osrEej5eWPIjSK6TRATLoppQ8WXrjyDmZEqseVK/dc600edlgDtbX7+shyjU/lLcnuea j1EuAVF8+zy5P76xuNaT9eQGDlZo5XL6wBrDh2RRNkHD2KtCYgt0Y/nlFl9Y1Gcb24dLsy3hgECgcBUX/cJpv3j617aq1TWIld5iGv7AOxW0PwzzFHbg+EHF 2yGSifxYxUypofiUWDAWaxG7SqwR6dvr5IUzgC2SI82Dif7NT+R83q/AbAlukZmKw/WuA/K7C7SX/rkGpuj1CNZcjrRwiUV5LUTLGR0VGgh1UmItyZO/+dwH hsFH8lQc8httRZ6L9Sg0+2LZrxBwnVZRZShKhakZH0BIz5X5Iz5Vo3qXQ0Y0D6v2ecDXWZnLyRezTY+0JPlZdfAr4UdOmECgcAYsuA5t2keukkeAR7qDZYsy stVIEsXujmevjPTlMHJxRySa5jpWzTeCqQS4zKpnu0ayogTCyUSYgGTYsYPYigAhr67dcQHzy95d9wF0bv0B9BYZmTYoHC4ThrElX1DPkYFU1JJjPS+BhNID GTK+vH4wZFFWHm8Fyhmgvexo4A6/yxAZWykDwBKG9NUDN/AoqUfJFcmRCD616Bt4FoNlzk7mfLg92W61pywvHQ+uxCuFWqwFVfUUInLJ6pfPvdm7u0=共鑰: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";// 創(chuàng)建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 創(chuàng)建加密對象// 參數(shù)表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一個(gè)參數(shù):加密的模式// 第二個(gè)參數(shù):使用私鑰進(jìn)行加密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+SzZHoOGY3hDSU3oKMT

    4 私鑰加密 公鑰解密

    • 私鑰加密,只能公鑰解密
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {String input = "國泰民安";System.out.println(input);// 加密算法String algorithm = "RSA";// 創(chuàng)建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 創(chuàng)建加密對象// 參數(shù)表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一個(gè)參數(shù):加密的模式// 第二個(gè)參數(shù):使用私鑰進(jìn)行加密cipher.init(Cipher.ENCRYPT_MODE,privateKey);// 私鑰加密byte[] bytes = cipher.doFinal(input.getBytes());System.out.println(Base64.encodeBase64String(bytes));// 私鑰進(jìn)行解密cipher.init(Cipher.DECRYPT_MODE,publicKey);// 對密文進(jìn)行解密,不需要使用base64,因?yàn)樵牟粫y碼byte[] bytes1 = cipher.doFinal(bytes);System.out.println(new String(bytes1));} 國泰民安 VfUXV9TiXxeRx5/gq13GtsNm76BSw/63e1SaOI1szLnb9DjE4hfCmim0qqqOQYSp5fyE45694Dlj37p7/+eu7gMAuJN5PYZfN7bYQZ+ZIJeXCiEO/IWXFzQW yIgoyqUjZ1i6ja0yfHhY0FXkBBJCr2SNwBiMW1lEQav0UE/i05Dj3+OOKDTKNbIgMLcsZfM3WPSNJWJq7bthnjO0KTPSdG5Dl+/eJictaSGTk0it5+D1l4G6 N8CfTfshG9c3vWbfmqgmU8GaA5Iqo1eHINPpS9SZOoAAokGEzmDkx2VJQiQO3GELIdcCGvyWvZIm7PlAV8EYzxTQiHRSuwiCJyGGABC+I9iEFwDaZwYCTAh7 roSwtpt1ax/KgQfbhv8vNE+/3ADnnvFgzDX6LfWuSl0vhclh9kl0ECnIICJd6dxKwCAZkctiwdOoPrbGnK4lWXbeTbdkxBpdw9LcnWMkCuCVy53k47OjB3S+ t+Uktr2snJAjJDYG4ZZmrQpEIj17zLKZ 國泰民安

    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數(shù)組byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 進(jìn)行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);}/*** 解密數(shù)據(jù)** @param algorithm : 算法* @param encrypted : 密文* @param key : 密鑰* @return : 原文*/public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{// 創(chuàng)建加密對象// 參數(shù)表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 私鑰進(jìn)行解密cipher.init(Cipher.DECRYPT_MODE,key);// 由于密文進(jìn)行了Base64編碼, 在這里需要進(jìn)行解碼byte[] decode = Base64.decodeBase64(encrypted);// 對密文進(jìn)行解密,不需要使用base64,因?yàn)樵牟粫y碼byte[] bytes1 = cipher.doFinal(decode);return new String(bytes1);}/*** 使用密鑰加密數(shù)據(jù)** @param algorithm : 算法* @param input : 原文* @param key : 密鑰* @return : 密文*/public static String encryptRSA(String algorithm,Key key,String input) throws Exception{// 創(chuàng)建加密對象// 參數(shù)表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一個(gè)參數(shù):加密的模式// 第二個(gè)參數(shù):使用私鑰進(jìn)行加密cipher.init(Cipher.ENCRYPT_MODE,key);// 私鑰加密byte[] bytes = cipher.doFinal(input.getBytes());// 對密文進(jìn)行Base64編碼return Base64.encodeBase64String(bytes);}public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{// 將文件內(nèi)容轉(zhuǎn)為字符串String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());// 獲取密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 構(gòu)建密鑰規(guī)范 進(jìn)行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數(shù)組byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 進(jìn)行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{// 將文件內(nèi)容轉(zhuǎn)為字符串String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());// 獲取密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 構(gòu)建密鑰規(guī)范 進(jìn)行Base64解碼PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));// 生成私鑰return keyFactory.generatePrivate(spec);}

    總結(jié)

    以上是生活随笔為你收集整理的密码学【java】初探究加密方式之非对称加密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。