非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
目前最常用的非对称加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年发明,他们那时都是在MIT。
以下是RSA运行实例:
package Utils; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; 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 javax.crypto.NoSuchPaddingException; import org.apache.commons.codec.binary.Base64; public class RSAUtils { /** * 生成非对称密钥对 * @return * @throws Exception */ public static KeyPair genKeyPair() throws Exception{ KeyPairGenerator keyp = KeyPairGenerator.getInstance("RSA"); keyp.initialize(1024); return keyp.generateKeyPair(); } public static String getPublicKey() throws Exception{ Key key = genKeyPair().getPublic(); byte[] bytekey = key.getEncoded(); byte[] byte64 = Base64.encodeBase64(bytekey);//将字符编码为base64编码 String keystr = new String(byte64,"UTF-8"); return keystr; } public static String getPrivateKey() throws Exception{ Key key = genKeyPair().getPrivate(); byte[] bytekey = key.getEncoded(); byte[] byte64 = Base64.encodeBase64(bytekey);//将字符编码为base64编码 String keystr = new String(byte64,"UTF-8"); return keystr; } /** * 加密 * @param src * @param key * @return * @throws Exception */ public static byte[] encrypt(byte[] src,String key) throws Exception{ // byte[] bytekey = key.getBytes("UTF-8"); // byte[] byte64 = Base64.decodeBase64(bytekey); byte[] byte64 = Base64.decodeBase64(key); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(byte64); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicKey = keyFactory.generatePublic(x509KeySpec); // 对数据加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(src); } /** * 解密 * @param src * @param key * @return * @throws Exception */ public static byte[] decrypt(byte[] src,String key) throws Exception{ // byte[] bytekey = key.getBytes("UTF-8"); // byte[] byte64 = Base64.decodeBase64(bytekey); byte[] byte64 = Base64.decodeBase64(key); // 取得私钥 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(byte64); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); // 对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(src); } public static void main(String[] arg) throws Exception{ String name = "2"; byte[] bytes= name.getBytes("UTF-8"); String pubKey = getPublicKey(); String priKey = getPrivateKey(); byte[] bytes1 = encrypt(bytes,pubKey); byte[] byte64 = Base64.encodeBase64(bytes1); String name1 = new String(byte64,"UTF-8"); System.out.println(name1); System.out.println("==========="); byte[] bytes2 = name1.getBytes("UTF-8"); byte[] bytes3 = decrypt(bytes2,priKey); byte[] byte641 = Base64.encodeBase64(bytes1); String name2 = new String(byte641,"UTF-8"); System.out.println(name2); } }
时间: 2024-10-16 15:56:09