Java加密算法可以说是比较难的一个知识点了,但是如果我们能够将java算法知识点搞清楚的话,那学java也不是什么难事了!那java非对称加密算法是什么?接下来我们就来给大家讲解一下这方面的内容。
所谓非对称加密算法,即加密和解密使用两个不同的密钥。非对称主要是相对于对称加密算法而言的,对称加密算法有加解密使用同一个秘钥,非对称算法则有一个公钥和一个私钥,公钥与私钥是一对的,这两个共同组成一个解钥,才能实现解密。
java非对称加密算法如何实现?
1、使用RSA实现加密解密
公钥加密,私钥解密。
package com.ss.utils; import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; public class RsaUtil { public static final String KEY_TYPE_PRIVATE_KEY = "privateKey"; public static final String KEY_TYPE_PUBLIC_KEY = "publicKey"; /** * 生成公钥和私钥 * * @return * @throws NoSuchAlgorithmException */ public static Map < String, String > generateKey() throws NoSuchAlgorithmException { Map < String, String > resultMap = new HashMap < > (); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Base64.Encoder encoder = Base64.getEncoder(); resultMap.put(KEY_TYPE_PRIVATE_KEY, encoder.encodeToString(keyPair.getPrivate() .getEncoded())); resultMap.put(KEY_TYPE_PUBLIC_KEY, encoder.encodeToString(keyPair.getPublic() .getEncoded())); return resultMap; } /** * RSA加密 * @param key * @param content * @param keyType * @return * @throws Exception */ public static String rsaEncrypt(String key, String content, String keyType) throws Exception { return rsa(key, content.getBytes(), keyType, Cipher.ENCRYPT_MODE); } /** * RSA解密 * @param key * @param content * @param keyType * @return * @throws Exception */ public static String rsaDecrypt(String key, String content, String keyType) throws Exception { return rsa(key, Base64.getDecoder() .decode(content), keyType, Cipher.DECRYPT_MODE); } private static String rsa(String key, byte[] content, String keyType, int mode) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); if (KEY_TYPE_PRIVATE_KEY.equals(keyType)) { cipher.init(mode, keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder() .decode(key)))); } else { cipher.init(mode, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder() .decode(key)))); } byte[] bytes = cipher.doFinal(content); return mode == Cipher.DECRYPT_MODE ? new String(bytes) : Base64.getEncoder() .encodeToString(bytes); } public static void main(String[] args) throws Exception { String content = "大王叫我来巡山呐"; //生成密钥对 Map < String, String > keyMap = generateKey(); System.out.println("私钥:" + keyMap.get(KEY_TYPE_PRIVATE_KEY)); System.out.println("公钥:" + keyMap.get(KEY_TYPE_PUBLIC_KEY)); //私钥加密,公钥解密 String privateKeyData = rsaEncrypt(keyMap.get(KEY_TYPE_PRIVATE_KEY), content, KEY_TYPE_PRIVATE_KEY); System.out.println("私钥加密:" + privateKeyData); System.out.println("公钥解密:" + rsaDecrypt(keyMap.get(KEY_TYPE_PUBLIC_KEY), privateKeyData, KEY_TYPE_PUBLIC_KEY)); //公钥加密,私钥解密 String publicKeyData = rsaEncrypt(keyMap.get(KEY_TYPE_PUBLIC_KEY), content, KEY_TYPE_PUBLIC_KEY); System.out.println("公钥加密:" + publicKeyData); System.out.println("私钥解密:" + rsaDecrypt(keyMap.get(KEY_TYPE_PRIVATE_KEY), publicKeyData, KEY_TYPE_PRIVATE_KEY)); } }
输出
私钥: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDQPZnj0 + /uh5jG0/rqVsXKLve7wTw2LVEwdBhm + SPrLoHYb4 + 6 idNeF4bWgTqNRs2hfewq5cyiwXujT + eqp0g1ebSLWSUWzBsktynQMggxb8IwtnFYzmZX7BSAUudrfTre74RtKS0krYY5PCXCGR / EGbbXMVv1m2S59BrkWEI8c / iORhRAJ5 / pqRW / 51 cIimPx9iTYx / QZC4VsCRi8ZrBaXcJhEi4Y / YzOFhfITID4ATis0Z3yw3FVybKzJo3Nexupcec5qaLBlwuDkY6E4NgQq51bjBCUB78RgXFLdaVtfBu9Vr7pRdqrh7sD //kpiicjiLJvmcLG9egXrkHRlm2TAgMBAAECggEAes75hM0mwOujBA9b+Pu3pedRHp91XRYYvZSaF5ByyG4jEXuprf8+ck05riOEXnEVMFpM/3eK2al1uviSzafeA/uEqHGoV+uDToHe3PPEtTMNuSC/c/o1jUCjTpKV/GRcZcGnvaD9CJZ1hCeetPuQKlxn4j0v2IcOPkRh36zVU0SZJKu5Ltt6iyGbpk6qqlpLnX93Ez5weWLnuolgjF34JBDQpc/zZjHwC8/avE81cJ3dUQR55l9QiwZUoMQ2eDWO1UcPAEqRssNAwEHbQJFSJmqtvg1yuSSvPIGB5ATPlTu7EoOLFMOQm3qoAxX7/FR9uU50wHivyZrRyKV4CdiLcQKBgQDuj6bh1WUQRIBU5ZOtljbs73RdYYbS1uUHubizQ3rqrNo3+TmaVu+7H3DPPI0L21YVpjXuPMUVkix+KA7HiDqULxx0yZMsdqXmggOT2QFEjGdueMFAJw09jAHnCIwuxmn3f94XAvV6N+Hfhjy31RGPQhjFGn6QQ16a3NI46CD6VwKBgQDfdorB9Wm0H6QJ8AYAQuHAiFJnXeOzN0q2407F5kx8XkAKwKaI7ybGZbiYESxFTe0AdVQlYRJbAby1iUW/OGOS+Ia5buzCo+BqrP6RxzLDYVClyXS3WFSLPKko6WIscS+uOF36mWWn34YYH/ktT8B/hUNFUD+PEctkrklONkZZJQKBgQCsn9hTbHYgKmFujV2qa5s9IhzjAZJs+MFsMLD9TuQf8opJnJdZHnWEw0B/RUKPBN0q90XpKaI3dLmrZFMlgWdaGSkPPVm4//YWcZgjIREwyCSEJO85+8gx9CDgTCgcJMlDJgzQO/zjvpI8i8deAtkc/+gqoHxa6dUIXKfmM9rBKwKBgFxIv0sUh5+8hWkZN9E5zbNOWQGZM6Tai791ph1yW1ntLnOCVgQtB41dits6FFdWtC7BRYveR89Pq1gpJaWvqueSPUktNxe2x8ImSUd4xU0Mzlp5FPt2vgt2dMGRiFqkL7W6T41jdija1az231fIHM5NAZgJaQYzqhSdKWbkYS8FAoGBAOciP4bEln64PnvuZtYnZNvt/5PHB4ssZ3S1WExyTtI7328ZKAsi3F7PjxCh7gviXfEI2t3AcVwpPaJYveL3Zg/jl2x6zNSLDW8kgNhAJE221u3pZefeidvIWwki/OXWtRqyoACteLnEb6lbM3tKdltWZOryQTiXqGdTluLEQLE0 公钥: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0D2Z49Pv7oeYxtP66lbFyi73u8E8Ni1RMHQYZvkj6y6B2G + PuonTXheG1oE6jUbNoX3sKuXMosF7o0 / nqqdINXm0i1klFswbJLcp0DIIMW / CMLZxWM5mV + wUgFLna3063u + EbSktJK2GOTwlwhkfxBm21zFb9ZtkufQa5FhCPHP4jkYUQCef6akVv + dXCIpj8fYk2Mf0GQuFbAkYvGawWl3CYRIuGP2MzhYXyEyA + AE4rNGd8sNxVcmysyaNzXsbqXHnOamiwZcLg5GOhODYEKudW4wQlAe / EYFxS3WlbXwbvVa + 6 UXaq4e7A //5KYonI4iyb5nCxvXoF65B0ZZtkwIDAQAB 私钥加密: V9kG4o3nceI4a19t / V5431v9Ek1PiV3FZokfnRNBor / RBymwDX4rsGNHEYuyN6 / sbbD56r3ij5tUpShXFlcHrzVH4IfD4ySbvNNeMs2FrZLF3zvQmwRKDPH6SJ0DEczi5N97Vfh4b2tfyLT8iX3t9LPWgEj5mB7MXiYPc56mza + ZAqDduxWWsm6Emm81uKn97wZnasg8zXlDbhRttVTWhszbDhrFqsgd2sb8ZZUZIuiGTaIg7U6Slc5x9uS3UVACXXVyMCmxiVutQtg3Z4kt80ruh7xO0hl4cWk6P2Tg0ncaIQn / 5 vKsO2UXr / EsCb2rchWN3ZBHTVyQ83v / EHDtQw == 公钥解密: 大王叫我来巡山呐 公钥加密: aartOyClfEIz1JT5nghpTbXxLZEOovm + vwvg + u3Tw8t5LOF + C7Gg / uxUP8Hm5jEkN6JfBHaMWTKg0RQ2xf3CCuXcLIpYVCOUwADwd05E8guEfZBT8FIp8jghCz2j + lAIiTfGZvsK9qUdZEmwTAEjV6uP4avF6njriglGJ4KhcYXEO66tOJWe2nQ1hyYXEHS43h9F0dtlWDjF6Xr6wdmUALnhprHDwKPdT / 1 T8p7 + M5Fz7fUC7TJulBHWCSZvhgl405PvN + iTv7VysBJKRPks1JnmMe6BxFyhxXZfNRHmUyQvTMSfWt / A5gOy8ao / SOwWv0QMSh5NbocSd / tpjn27kw == 私钥解密: 大王叫我来巡山呐
2、使用RSA实现数字签名
私钥签名,公钥验证。
package com.ss.utils; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; public class SignatureUtil { public static final String KEY_TYPE_PRIVATE_KEY = "privateKey"; public static final String KEY_TYPE_PUBLIC_KEY = "publicKey"; /** * 生成公钥和私钥 * * @return * @throws NoSuchAlgorithmException */ public static Map < String, String > generateKey() throws NoSuchAlgorithmException { Map < String, String > resultMap = new HashMap < > (); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Base64.Encoder encoder = Base64.getEncoder(); resultMap.put(KEY_TYPE_PRIVATE_KEY, encoder.encodeToString(keyPair.getPrivate() .getEncoded())); resultMap.put(KEY_TYPE_PUBLIC_KEY, encoder.encodeToString(keyPair.getPublic() .getEncoded())); return resultMap; } /** * 私钥签名 * @param privateKeyStr * @param content * @return * @throws Exception */ public static String generateSignature(String privateKeyStr, String content) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Signature signature = Signature.getInstance("SHA1withRSA"); PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder() .decode(privateKeyStr))); signature.initSign(privateKey); signature.update(content.getBytes()); return Base64.getEncoder() .encodeToString(signature.sign()); } /** * 公钥验证 * @param publicKeyStr * @param content * @param sign * @return * @throws Exception */ public static boolean verifySignature(String publicKeyStr, String content, String sign) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Signature signature = Signature.getInstance("SHA1withRSA"); PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder() .decode(publicKeyStr))); signature.initVerify(publicKey); signature.update(content.getBytes()); return signature.verify(Base64.getDecoder() .decode(sign)); } public static void main(String[] args) throws Exception { String content = "大王叫我来巡山呐"; //生成密钥对 Map < String, String > keyMap = generateKey(); //私钥签名 String sign = generateSignature(keyMap.get(KEY_TYPE_PRIVATE_KEY), content); System.out.println("私钥签名:" + sign); //公钥验证 boolean verifyResult = verifySignature(keyMap.get(KEY_TYPE_PUBLIC_KEY), content, sign); System.out.println("公钥验证:" + verifyResult); //将内容做下修改,再进行公钥验证 boolean verifyResult2 = verifySignature(keyMap.get(KEY_TYPE_PUBLIC_KEY), content + "啦啦啦啦", sign); System.out.println("公钥验证:" + verifyResult2); } }
输出
私钥签名: XDWeOUVZhXNPl58mcmRK8ht9TAhnREc + NlnSs2b6PCJuj29ABuoXsjZeJqSspGw8hm9ckHVSTrUt8pX4BFBFzrINDRBsx3TdLp2L8nMkhjFUfo0qcyZo8ReEGFCNr0ergkq2W1Me / 5 W40GrQz4cJcQ4KV / QWzD8YHWcnDvKg9Q0nXJSngyhJTzUB8o / pgo / tmkA9 + bWW212UD9nzEXu5aoPEcYyoo3iFWRX5o9Jgg6ZF + exmWizwZHkg4eD1zC5IN3m4yRS6GRbnZInEuDsOMp9W7HouDLUirkFZiSkyW + DVto + L6CE5eNBrWC52zxiNkVBlkyYKOatSpcrQrtnyiQ == 公钥验证: true 公钥验证: false
java非对称加密算法可以通过以上两种方法去实现,非对称加密算法解决了对称加密算法密钥分配问题,极大地提高了算法安全性,作为java开发人员必须要掌握好这些哦!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。
推荐阅读: