对称加密的加密密钥和解密解密密钥一致,即加密和解密用同一个密钥。
非对称加密有两个密钥,一个公钥一个私钥,两者成对出现。两者不一样,遵循“公钥加密私钥解密”和“私钥加密公钥解密”的原则。
RSA是常用的非对称加密算法。
- RSA算法
模型如下
算法实现
/** * 初始化RSA密钥对 * @return */ public static String[] initRSAKey(){ try { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate(); return new String[]{Hex.encodeHexString(publicKey.getEncoded()), Hex.encodeHexString(privateKey.getEncoded())}; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } /** * RSA私钥加解密 * @param data * @param key * @param mode * 0-加密,1-解密 * @return */ public static String RSAByPrivateKey(String data, String key, int mode){ try { //取得私钥 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Hex.decodeHex(key.toCharArray())); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); if (mode == 0) { cipher.init(Cipher.ENCRYPT_MODE, privateKey); } else { cipher.init(Cipher.DECRYPT_MODE, privateKey); } return Hex.encodeHexString(cipher.doFinal(Hex.decodeHex(data .toCharArray()))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } return null; } /** * RSA公钥加解密 * @param data * @param key * @param mode * 0-加密,1-解密 * @return */ public static String RSAByPublicKey(String data, String key, int mode){ try { //取得公钥 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Hex.decodeHex(key.toCharArray())); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicKey = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); if (mode == 0) { cipher.init(Cipher.ENCRYPT_MODE, publicKey); } else { cipher.init(Cipher.DECRYPT_MODE, publicKey); } return Hex.encodeHexString(cipher.doFinal(Hex.decodeHex(data .toCharArray()))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } return null; }
测试代码
String[] key = initRSAKey(); String publicKey = key[0]; System.out.println("RSA公钥:"+publicKey); String privateKey = key[1]; System.out.println("RSA私钥:"+privateKey); String data = "404142434445464748494a4b4c4d4e4f"; System.out.println("原始数据:"+data); String encode = RSAByPrivateKey(data, privateKey, 0); System.out.println("RSA私钥加密后:"+encode); String decode = RSAByPublicKey(encode, publicKey, 1); System.out.println("RSA公钥解密后:"+decode); encode = RSAByPublicKey(data, publicKey, 0); System.out.println("RSA公钥加密后:"+encode); decode = RSAByPrivateKey(encode, privateKey, 1); System.out.println("RSA私钥解密后:"+decode);
运行结果
RSA公钥:30819f300d06092a864886f70d010101050003818d003081890281810085eda17a68c0091a04e3bc0337a2c627898b310425291bbfbb88f81839e6a318230d20da402298716d64ffb962edb3adaa3abacb8110c1073f96a3213a8f2ba33f8426b77b77a8f7940fd148398c63777a800f6fcf571dfbe22d49450b1b7d059c63af7453a176c7720328f03b78d914189c5ef13860119223caf9cc56baa0350203010001 RSA私钥:30820278020100300d06092a864886f70d0101010500048202623082025e0201000281810085eda17a68c0091a04e3bc0337a2c627898b310425291bbfbb88f81839e6a318230d20da402298716d64ffb962edb3adaa3abacb8110c1073f96a3213a8f2ba33f8426b77b77a8f7940fd148398c63777a800f6fcf571dfbe22d49450b1b7d059c63af7453a176c7720328f03b78d914189c5ef13860119223caf9cc56baa0350203010001028180695c012dd05c4a8cba8e01e9b20a0ec329d46392343dbbc3c11fc6b5204fcdbc7e4ea4aaadcbc98b6a190b8867484292fb994a3c3063e2c6f60266810c957728c95659f2234c37a56da17df9ad3bc8288d74845f3d49fd4a47efeafba45fd7675d10d084ad6f62d27799c82717f4862f355c98fd8f3c0cf9101404fef8a7db61024100c3acfa3cb22fd8655c683d7bd3834df8ecb8c5d6f451e63f4b587d26cb1605c0965c0ed5b0cb1bd207058d48297fe60b9b34b99578475a291909567e7e892c69024100af3773765608472d0a9e77c3587cd70224aa8109684f1fdf2977c1a8862f4910d5c90932b1a758c7935176eda130d5801baad5ef14fb4ba93aad46471bb40bed024100974e062130d77648ca6f803b638e40989ed33187c95c1ae20e6cda3949083a6274e1b246e271eb8d3808befa71bc8831a94dd7c310427c21134ef926cec95b21024100a2a5438dce70a2b961c915fd044fe639fc1535f0a89e0244e2366352ef34478bd417686d6151a96ca10896f02097b727d306f2cd9ad9663371df54843f6813450241008116aa820988c75f27abbada3547940543e90355763fcea8e3e1766713e46a575443f583a3b4dd4b67f55ed1a73f7db8541145cc5e68a296bd34863f61d5a994 原始数据:404142434445464748494a4b4c4d4e4f RSA私钥加密后:433cdc548920a9ba300c938ba56c5eb17bcb52d7a8e7d5c967af7a98ac515447a15ec63cb01b91b4d03e8d53146c43181b0ee022b9423bd6e56c7483f8e34572fe0df519475bfda4453824526e1bfd3e6f9dadebd19acec1549024aa8ccc51246ca4c1ccbf6be1f16b88f4cb531a5ecba1d175d9ccc787fb2c348ab4dcdb4229 RSA公钥解密后:404142434445464748494a4b4c4d4e4f RSA公钥加密后:3088bba16875fbd32a3e2136c2900b339ccb107bb5621b563c28eb5440975ae382befe3e91efee90184e6ef1e4791aeb811c9d36720606fbc7c778b15a22bfafcc30204ca7535e3563a07e695e87641b0dd0864978b4c81d6268718fd65d059c4085253223a7f38b2a7ce401c8802a697d9070a3b9df4552bc51904ee4a44942 RSA私钥解密后:404142434445464748494a4b4c4d4e4f
相关推荐
完整实验报告,共31页 包括实验目的,实验内容,实验步骤,运行结果,实验总结 附上了源码。 部分内容可见https://blog.csdn.net/guansheng123/article/details/123029969
常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结
ECC非对称加密算法, 最快,最安全的加密算法
C语言实现非对称密码算法RSA,其中RSA计算采用的是平方乘算法
非对称密码技术的实现 (1)熟悉RSA相关函数(公私钥生成函数,加密/解密函数); (2)利用公钥加密特定文件(test-1.txt),并用私钥进行解密;反过来,再利用私钥加密特定文件,并用公钥进行解密。对比解密后的...
内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...
深入浅出密码学——常用加密技术原理与应用Cryptanalysis in simple terms -- principle and application of common encryption technology
此资源包含完整代码和完整实验报告(加上你的学号姓名即可提交)
非对称密钥,自己看,不多说了 。
深入浅出密码学——常用加密技术原理与应用Christof Paar,Jan Pelzl 本书拥有的诸多特征使得它成为密码学从业者和学生独一无二的资源—本书介绍了绝大多数实际应用中使用的加密算法,并重点突出了它们的实用性。...
DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。
DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
登录时,用户的密码用明文传输,太不安全,应该加密传输,怎么做呢,对称加密一旦秘钥丢失则形同虚设,最好使用非对称加密的方式,由后端事先生成公钥和私钥,公钥发给前端页面,私钥后端自己保留,前端进行认证时,...
此资源包含完整代码和完整实验报告(加上你的学号姓名即可提交)
非对称密码学试题,信息安全专业的试题,学信息安全的多看看
《深入浅出密码学——常用加密技术原理与应用》教程书籍,学习资源,供学术交流使用。
Java密码学架构中利用对称密钥加解密的一个小Demo。
对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据...
此资源包含完整代码和完整实验报告(加上你的学号姓名即可提交)
C++ RSA非对称密码算法 C++ RSA非对称密码算法 C++ RSA非对称密码算法